第1章 网络编程基础(3)——基本Socket通信
服务器常用模型
(1)初始化监听Socket
初始化Socket
SOCKET s; s = socket(AF_INET,SOCKET_STREAM,IPPROTO_TCP); //创建一个Socket作为监听端口 //Socket种类为流Socket //使用的网络协议为TCP协议 //Socket家族取值为AF_INET
绑定Socket
SOCKETADDR_IN addr; addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr("127.0.0.1"); addr.sin_port = htnos(9000); bind(s,(LPSOCKETADDR)&addr,sizeof(addr)); //Socket家族取值为AF_INET //服务器地址为127.0.0.1 //服务器使用的端口为9000
开始监听
listen(s,SOMAXCONN); //连接最大数取系统设置最大值
(2)建立连接
检测Socket状态
函数Select可以检测相应Socket状态,从而决定是否需要建立新的连接。
fd_set readset; timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = 0; FD_ZERO(&readset); FD_SET(s,&readset); int ret = select(FD_SETSIZE,&readset,NULL,NULL,&timeout); if(ret>0&&FD_ISSET(s,&readset)) { //新连接 }
建立新的连接
如果客户端有新的连接请求送入,则建立一个新的连接
SOCKADDR_IN addr; int len = sizeof(addr); SOCKET temp; temp = accept(s,(SOCKADDR*)&addr,(socklen_t*)&len); if(temp == INVALID_SOCKET){ //连接失败 }
(3)收发数据
检测读入数据
fd_set readset; timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = 0; FD_ZERO(&readset); FD_SET(s,&reader); int ret = select(FD_SETSIZE,&readset,NULL,NULL,&timeout); if(ret>0&&FD_ISSET(s,&readset)) { //有新的数据 }
接收数据
char buf[1024]; int ret; ret = recv(s,buf,1024,0);
检测发送数据
fd_set writeset; timeval timeout; timeout.tv_sec = 0; timeout.tv_usec = 0; FD_ZERO(&wtiteset); FD_SET(s,&writeset); int ret = select(FD_SETSIZE,&writeset,NULL,&timeout); if(ret>0&&FD_ISSET(s,&writeset)) { //可以发送数据 }
发送数据
char buf[1024]; int ret; ret = send(s,buf,1024,0);
(4)关闭连接
closesocket(s);
客户端常用模型
(1)初始化Socket
创建socket
SOCKET s; s = socket(AF_INET,SOCKET_STREAM,IPPROTO_TCP); //创建一个Socket作为监听端口 //Socket种类为流Socket //使用的网络协议为TCP协议 //Socket家族取值为AF_INET
客户端和服务器端选择的Socket种类保持一致。
绑定端口
客户端的IP地址和端口号都不需要固定,可以由系统自动进行分配。
SOCKETADDR_IN addr; addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_ANY); addr.sin_port = htons(0); bind(s,(LPSOCKADDR)&addr,sizeof(addr)); //Socket家族取值为AF_INET //客户端IP地址和端口由系统指定
(2)建立连接
在发送连接请求时,需要指定服务器的端口号与IP地址。
ServerAddr.sin_family=AF_INET; ServerAddr.sin_port=htons(9000); ServerAddr.sin_addr.s_addr=inet_addr("127.0.0.1"); connect(s,(SOCKADD*)&ServerAddr,sizeof(ServerAddr)); //服务器Socket家族取值为AF_INET //服务器端口号为9000 //服务器IP地址为127.0.0.1
(3)收发数据
与服务器相同
(4)关闭连接
与服务器相同