客户端的代码//TCP通信的服务端 #include arpa/inet.h #include netinet/in.h #include stdio.h #include string.h int main() { //1 创建监听的套接字 int sockfdsocket(AF_INET,SOCK_STREAM,0); if(sockfd-1) { perror(sokcfd); exit(-1); } //2 把fdipport进行绑定 strcut sockaddr_in saddr; //socket地址结构体 saddr.sin_famillyAF_INET; //inet_pton(AF_INET,192.168.68.128,saddr.sin_addr.s_addr); //将主机字节序转化为网络字节序 saddr.sin_addr.s_addr0; saddr.sin_porthtons (9999); int retbind(sockfd,(struct sockaddr *)saddr,sizeof(saddr)); if(ret-1) { perror(bind); exit(-1); } //3 监听 retlisten(sockfd,8); if(ret-1) { perror(listen); exit(-1); } //4 接受客户端的连接如果没有客服端请求连接那么默认是堵塞的 strcut sockaddr_in clientaddr; //socket地址结构体 socklen_t sizesizeof(clientaddr); int cfdaccept(sockfd,(struct sockaddr *)clientaddr,size); if(cfd-1) { perror(accept); exit(-1); } //输出客户端的信息获取到的信息是网络字节序,需要进行一个十分制转换 char clientIP[16]; inet_ntop(AF_INET,clientaddr.sin_addr.s_addr,clientIP,sizeof(clientIP)); unsigned short clientportntohs(clientaddr.sin_port); printf(client IP is: %s ,client port is: %d\n,clientIP,clientport); //5 通信 //获取客户端的数据 char recvbuf[1024]{0}; int lenread(cfd,recvbuf,sizeof(recvbuf)); if(len-1) { perror(read); exit(-1); } else if(len0) { printf(recv client data: %s\n,recvbuf); } else if(len0) { printf(client closed.....\n); } //给客服端发送数据 char *datahello i am serve; write(cfd,hello i am serve\n,strlen(data)); //关闭文件描述符 close(cfd); close(sockfd); return 0; }服务端代码//TCP通信的客户端 #include arpa/inet.h #include netinet/in.h #include stdio.h #include string.h #include stdlib.h #include unistd.h int main() { //1 创建套接字 int cfdsocket(AF_INET,SOCK_STREAM,0); //2 与服务端的地址进行连接 struct sockaddr_in saddr; //先定义在初始化 saddr.sin_familyAF_INET; inet_pton(AF_INET,192.168.68.128,saddr.sin_addr.s_addr); saddr.sin_porthtons(9999); int retconnect(cfd,(struct sockaddr *)saddr,sizeof(saddr)); if(ret-1) { perror(connect); exit(-1); } //3 通信 //给服务端发送数据 char *datahello i am client; write(cfd,hello i am client\n,strlen(data)); //读取 char recvbuf[1024]{0}; int lenread(cfd,recvbuf,sizeof(recvbuf)); if(len-1) { perror(read); exit(-1); } else if(len0) { printf(recv server data: %s\n,recvbuf); } else if(len0) { printf(server closed.....\n); } //关闭文件描述符 close(cfd); return 0; }多线程服务器//TCP通信的服务端---多线程 #include arpa/inet.h #include netinet/in.h #include stdio.h #include string.h #include stdlib.h #include unistd.h #include signal.h #include errno.h #include pthread.h struct sockinfo { //封装结构体用于参数的传递 int fd; pthread_t tid; struct sockaddr_in saddr; }; struct sockinfo sockinfos[128]; void *working(void* arg) { //子线程与客服端通信的函数——需要客户端的信息 //获得客户端的信息 struct sockinfo *pinfo(struct sockinfo *)arg; char clientip[16]; inet_ntop(AF_INET,pinfo-saddr.sin_addr.s_addr,clientip,sizeof(clientip)); unsigned short clientportntohs(pinfo-saddr.sin_port); printf(ip : %s ,port : %d\n,clientip,clientport); //接收客服端的数据 char recvbuf[1024]{0}; while(1) { int lenread(pinfo-fd,recvbuf,sizeof(recvbuf)); if(len-1) { perror(read); exit(-1); } else if(len0) { printf(recvbuf is : %s\n,recvbuf); } else if(len0){ printf(client closed...\n); break; } write(pinfo-fd,recvbuf,sizeof(recvbuf)); } close(pinfo-fd); exit(-1); } int main() { //创建socket int lfdsocket(AF_INET,SOCK_STREAM,0); if(lfd-1) { perror(SOCKET); exit(-1); } //绑定 struct sockaddr_in saddr; saddr.sin_familyAF_INET; saddr.sin_addr.s_addrINADDR_ANY; saddr.sin_porthtons(9999); bind(lfd,(struct sockaddr*)saddr,sizeof(saddr)); //监听 listen(lfd,9); int maxsizeof(sockinfos)/sizeof(sockinfos[0]); for(int i0;imax;i) { bzero(sockinfos[i],sizeof(sockinfos[i])); sockinfos[i].tid-1; sockinfos[i].fd-1; } //循环等待连接,只要有客户端进入就创一个线程进程通信 while(1) { struct sockaddr_in clientaddr; int lensizeof(clientaddr); //接受 int cfdaccept(lfd,(struct sockaddr*)clientaddr,len); if(cfd-1) { if(errnoEINTR) { continue; } perror(accept); exit(-1); } struct sockinfo *pinfo; for(int i0;imax;i) { //在数组里找到一组可以用好的sockinfo元素 if(sockinfos[i].fd-1) { pinfosockinfos[i]; break; } if(imax-1) { sleep(1); } } pinfo-fdcfd; memcpy(pinfo-saddr,clientaddr,len); //连接一个创建一个子线程进行通信 pthread_create(pinfo-tid,NULL,working,pinfo); pthread_detach(pinfo-tid); } close(lfd); return 0; }