手机网站建设的优势,免费ppt,做洗化的网站,织梦网站怎样上传到ftp2023年8月3日#xff0c;周四下午
这篇文章我从下午开始写了几个小时#xff0c;
这篇文件基本总结了我今天学到的知识#xff0c;
在写这篇文章的过程中灵感不断涌现、想明白了很多知识点#xff0c;非常酣畅淋漓。
什么叫做深度学习#xff1f;这就是深度学习#…2023年8月3日周四下午
这篇文章我从下午开始写了几个小时
这篇文件基本总结了我今天学到的知识
在写这篇文章的过程中灵感不断涌现、想明白了很多知识点非常酣畅淋漓。
什么叫做深度学习这就是深度学习深度学习就是打破砂锅问到底就是不断提出问题和解决问题。
有点飘了感觉自己也能写书和出书了哈哈哈。
其实我感觉自己还没写完还有些疑惑没解决以后有空再更新。 目录
纯享版功能服务端程序客户端程序通俗版 服务端程序客户端程序讲解版服务端程序为什么要设置服务器端口号为什么不需要设置服务端的IP地址INADDR_ANY是什么意思怎么获取到客户端的IP地址和端口号编辑怎么理解listen(serv_sock,5)客户端程序 纯享版 功能
服务端负责发送Hello给客户端
客户端负责把Hello接收并打印出来。 服务端程序
#includesys/socket.h
#includearpa/inet.h
#includestring.h
int main(){int serv_socksocket(AF_INET,SOCK_STREAM,0);struct sockaddr_in serv_addr;memset(serv_addr,0,sizeof(serv_addr));serv_addr.sin_familyAF_INET;serv_addr.sin_addr.s_addrhtonl(INADDR_ANY);serv_addr.sin_porthtons(9990);bind(serv_sock,(struct sockaddr*)serv_addr,sizeof(serv_addr));listen(serv_sock,5);struct sockaddr_in clnt_addr;socklen_t clnt_addr_sizesizeof(clnt_addr);int clnt_sockaccept(serv_sock,(struct sockaddr*)clnt_addr,clnt_addr_size);write(clnt_sock,Hello,sizeof(Hello));close(clnt_sock);close(serv_sock);return 0;
} 客户端程序
#includesys/socket.h
#includearpa/inet.h
#includestdio.h
#includestring.hint main(){int socksocket(AF_INET,SOCK_STREAM,0);struct sockaddr_in serv_addr;memset(serv_addr,0,sizeof(serv_addr));serv_addr.sin_familyAF_INET;serv_addr.sin_addr.s_addrinet_addr(127.0.0.1);serv_addr.sin_porthtons(9990);connect(sock,(struct sockaddr*)serv_addr,sizeof(serv_addr));char message[30];read(sock,message,sizeof(message)-1);printf(%s\n,message);close(sock);return 0;
} 通俗版 服务端程序
#includesys/socket.h
#includearpa/inet.h
#includestring.h
int main(){//创建一台手机int serv_socksocket(AF_INET,SOCK_STREAM,0);//创建一张电话卡struct sockaddr_in serv_addr;//运营商负责给电话卡填写信息memset(serv_addr,0,sizeof(serv_addr));serv_addr.sin_familyAF_INET;serv_addr.sin_addr.s_addrhtonl(INADDR_ANY);serv_addr.sin_porthtons(9990);//把电话卡插到手机里面bind(serv_sock,(struct sockaddr*)serv_addr,sizeof(serv_addr));//设置手机来电话时提醒listen(serv_sock,5);//再创建一张电话卡用来存储打电话过来的手机的电话卡信息比如手机号struct sockaddr_in clnt_addr;socklen_t clnt_addr_sizesizeof(clnt_addr);//如果有电话打来就把来电的电话卡信息存储到clnt_addr电话卡里面int clnt_sockaccept(serv_sock,(struct sockaddr*)clnt_addr,clnt_addr_size);//按照clnt_addr电话卡的信息给这个来电的手机发送一个字符串Hellowrite(clnt_sock,Hello,sizeof(Hello));close(clnt_sock);close(serv_sock);return 0;
} 客户端程序
#includesys/socket.h
#includearpa/inet.h
#includestdio.h
#includestring.hint main(){//创建一部手机int socksocket(AF_INET,SOCK_STREAM,0);//创建一张电话卡卡struct sockaddr_in serv_addr;//运营商负责填写电话卡信息memset(serv_addr,0,sizeof(serv_addr));serv_addr.sin_familyAF_INET;serv_addr.sin_addr.s_addrinet_addr(127.0.0.1);//负责确定打给谁serv_addr.sin_porthtons(9990);//负责确定打给谁//拨打电话connect(sock,(struct sockaddr*)serv_addr,sizeof(serv_addr));char message[30];//读取收到的Hello字符串read(sock,message,sizeof(message)-1);printf(%s\n,message);close(sock);return 0;
} 讲解版 服务端程序
#includesys/socket.h
#includearpa/inet.h
#includestring.h
int main(){int serv_socksocket(AF_INET,SOCK_STREAM,0);struct sockaddr_in serv_addr;memset(serv_addr,0,sizeof(serv_addr));serv_addr.sin_familyAF_INET;serv_addr.sin_addr.s_addrhtonl(INADDR_ANY);//INADDR_ANY表示可以接受来自任意IP地址的连接serv_addr.sin_porthtons(9990);//设置服务器端口号bind(serv_sock,(struct sockaddr*)serv_addr,sizeof(serv_addr));listen(serv_sock,5);struct sockaddr_in clnt_addr;socklen_t clnt_addr_sizesizeof(clnt_addr);int clnt_sockaccept(serv_sock,(struct sockaddr*)clnt_addr,clnt_addr_size);write(clnt_sock,Hello,sizeof(Hello));close(clnt_sock);close(serv_sock);return 0;
}
为什么要设置服务器端口号
端口号是一个16位的无符号整数它可以唯一地标识服务器上的不同服务。
因为服务器在互联网中的IP地址是唯一的但是服务器上运行着很多服务或者说程序有的可能是用来处理web网页请求有的可能是处理远程发来的数据库请求的。而由上面这个服务端代码建立的服务或者说程序只是服务器上众多服务或者说程序中的一个那么当用本文的客户端代码创建的客户端程序通过IP地址找到这个服务器时客户端程序怎么知道服务器上的运行着的数量众多的程序中哪个是用本文的服务端代码创建的服务端程序呢通过设置具有唯一性的用来标识服务器上的不同服务的服务器端口号就能完美的解决这个问题所以要设置服务器端口号。
进一步的说用本文的客户端代码创建的客户端程序只要知道运行着用本文的服务端代码创建的服务端程序的服务器在互联网中的IP地址和这个服务端程序在服务器中的端口号就能在茫茫的互联网中精确的找到用本文的服务端代码创建的服务端程序。
在计算机网络中客户端通过指定目标服务器的IP地址和端口号来与服务器建立连接。当客户端向服务器发送请求时服务器会根据目标端口号识别请求并将其路由到相应的服务程序。
通过设置端口号可以使服务器上的不同服务在不同的端口上监听连接请求。这样当客户端想要连接到特定的服务时只需要指定相应的端口号即可。例如Web服务器通常监听80端口SMTP服务器通常监听25端口。
总而言之设置服务器端口号是为了标识服务器上的不同服务使客户端可以通过指定端口号与特定服务建立连接。
如果没有IP地址怎么在互联网的几千万台计算机中找到运行着用本文的服务端代码创建的服务端程序的计算机呢如果没有端口怎么在运行着众多程序的计算机中用本文的服务端代码创建的服务端程序呢
这就是为什么要设置端口和IP地址。 为什么不需要设置服务端的IP地址
以后有空再写.... INADDR_ANY是什么意思
INADDR_ANY表示可以接受来自任意IP地址的连接。
如果你把INADDR_ANY替换成成127.0.0.1那么只会接收IP地址为127.0.0.1的客户端的连接请求 怎么获取到客户端的IP地址和端口号
在上面的代码中clnt_addr 是 sockaddr_in 类型的结构体,用于保存客户端的地址信息
accept函数会自动为我们填充 clnt_addr 结构体,其中包含:
clnt_addr.sin_addr.s_addr 客户端的IP地址clnt_addr.sin_port 客户端的端口号
所以在上面的代码中的accept函数下面添加如下代码就可以获取到客户端的IP地址和端口号
char* ip inet_ntoa(clnt_addr.sin_addr);
printf(Client IP: %s\n, ip);int port ntohs(clnt_addr.sin_port);
printf(Client port: %d\n, port); 值得注意的是客户端程序的端口号和服务端设置的端口号是不一样的 怎么理解listen(serv_sock,5)
通过设置 listen的第2个参数可以控制连接队列中允许等待的最大连接数。如果连接队列已满新的连接请求将被拒绝直到有连接请求被处理并从队列中移出。
对于这个连接队列我想说说自己的理解
我认为连接队列在上面这个服务端程序是不可能满的因为上面这个服务端程序没有创建新的线程或进程来处理连接请求。我认为只有使用了线程或者进程才可能会让连接队列满之后有空的话我会写一些程序来说明这个。 客户端程序
#includesys/socket.h
#includearpa/inet.h
#includestdio.h
#includestring.hint main(){int socksocket(AF_INET,SOCK_STREAM,0);struct sockaddr_in serv_addr;memset(serv_addr,0,sizeof(serv_addr));serv_addr.sin_familyAF_INET;serv_addr.sin_addr.s_addrinet_addr(127.0.0.1); //指明要连接的服务器的地址是什么serv_addr.sin_porthtons(9990);//指明要连接服务器的哪个端口connect(sock,(struct sockaddr*)serv_addr,sizeof(serv_addr));char message[30];read(sock,message,sizeof(message)-1);printf(%s\n,message);close(sock);return 0;
}
这部分有空再更新....