做网站需多少钱,注册公司网上申请流程图,河南平台网站建设找哪家,学生创意设计作品说明TCP服务器的实现流程#xff1a;一、创建套接字#xff08;socket函数#xff09;#xff1a;通信域选择IPV4网络协议、套接字类型选择流式#xff1b; int sockfd socket(AF_INET,SOCK_STREAM,0); //通信域选择IPV4、套接字类型选择流式二、填充服务器的网络信息结构体一、创建套接字socket函数通信域选择IPV4网络协议、套接字类型选择流式 int sockfd socket(AF_INET,SOCK_STREAM,0); //通信域选择IPV4、套接字类型选择流式二、填充服务器的网络信息结构体1.定义网络信息结构体变量2.求出结构体变量的内存空间大小3.结构体清零4.使用IPV4网络协议5.预留给在终端输入的网络字节序的端口号6.预留给在终端输入的IP地址 struct sockaddr_in serveraddr; //定义网络信息结构体变量socklen_t serveraddrlen sizeof(serveraddr);//求出结构体变量的内存空间大小memset(serveraddr,0,serveraddrlen); //结构体清零serveraddr.sin_family AF_INET; //使用IPV4网络协议serveraddr.sin_addr.s_addr inet_addr(argv[1]); //IP地址serveraddr.sin_port htons(atoi(argv[2]));//网络字节序的端口号三、套接字和服务器的网络信息结构体进行绑定bind函数 int ret bind(sockfd,(struct sockaddr *)serveraddr,serveraddrlen);四、套接字设置成被动监听listen函数 int ret1 listen(sockfd, 5);五、阻塞等待客户端的连接accept函数 int acceptfd accept(sockfd, (struct sockaddr *)clientaddr, clientaddr_len);六、接收来自客户端的数据recv函数和给客户端发送应答消息send函数 int nbytes recv(acceptfd,buf,sizeof(buf),0);printf(客户端发来数据[%s]\n,buf);strcat(buf,----k); //组装应答消息int ret2 send(acceptfd,buf,sizeof(buf),0);七、关闭套接字close函数 close(acceptfd);close(sockfd);综合应用实例代码如下所示
//tcp服务器#include stdio.h
#include sys/types.h
#include sys/socket.h
#include stdlib.h
#include netinet/in.h
#include netinet/ip.h
#include string.h
#include arpa/inet.h
#include unistd.h#define ERRLOG(msg) do{\printf(%s:%s:%d\n, __FILE__, __func__, __LINE__);\perror(msg);\exit(-1);\}while(0)int main(int argc, char const *argv[])
{//入参合理性检查if(3 ! argc){printf(Usage : %s IP port\n,argv[0]);exit(-1);}//创建套接字int sockfd socket(AF_INET,SOCK_STREAM,0);if(-1 sockfd){ERRLOG(socket error);}printf(sockfd %d\n,sockfd);//填充服务器网络信息结构体struct sockaddr_in serveraddr;socklen_t serveraddrlen sizeof(serveraddr);memset(serveraddr,0,serveraddrlen);serveraddr.sin_family AF_INET;serveraddr.sin_addr.s_addr inet_addr(argv[1]);serveraddr.sin_port htons(atoi(argv[2]));//将套接字与服务器网络信息结构体绑定if(-1 bind(sockfd,(struct sockaddr *)serveraddr,serveraddrlen)){ERRLOG(bind error);}//将套接字设置成被监听状态if(-1 listen(sockfd,5)){ERRLOG(listen error);}//定义一个结构体来保存客户端的信息struct sockaddr_in clientaddr;memset(clientaddr,0,sizeof(clientaddr));socklen_t clientaddr_len sizeof(clientaddr);int acceptfd 0;char buf[128] {0};int nbytes 0;while(1){printf(正在等待客户机连接服务器\n);//阻塞等待客户机连接if(-1 (acceptfd accept(sockfd,(struct sockaddr *)clientaddr,clientaddr_len))){ERRLOG(accept error);}printf(客户端[%s:%d]连接到了服务器\n,inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));//收发数据while(1){memset(buf,0,sizeof(buf));if(-1 (nbytes recv(acceptfd,buf,128,0))){ERRLOG(recv error);}else if(0 nbytes){printf(客户端[%s:%d]断开了服务器\n,inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));break;}if(!strncmp(buf,quit,4)){printf(客户端[%s:%d]退出了\n,inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));break;}printf(客户端[%s:%d]发来数据[%s]\n,inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port),buf);//组装应答消息strcat(buf,----k);//给客户端发送应答消息if(-1 send(acceptfd,buf,sizeof(buf),0)){ERRLOG(send error);}}close(acceptfd);}//关闭套接字close(sockfd);return 0;
}
本示例代码仅供参考