TCP协议----客户端与客户端之间通信
2017-12-27 20:16
260 查看
服务器 #include<stdio.h> #include<stdlib.h> #include<string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <pthread.h> #define PORT 123 struct info //定义结构体用于存放套接字的描述符,以及来自客户端发送的消息内容 { int num; char buf[100]; }; void *Recv(void *arg) { pthread_detach(pthread_self()); //线程分离,确保资源的释放 struct info Buff; int ret; while(1) { ret = recv(*(int *)arg,&Buff,sizeof(Buff),0); //接收客户端的消息 if(-1 == ret) { perror("recv"); exit(1); } if(!strcmp(Buff.buf,"bye")) { close(*(int *)arg); break; } printf("Recv form client %d : %s\n",*(int *)arg,Buff.buf); ret = send(Buff.num,&Buff,sizeof(Buff),0); //将消息发送给客户端 if(-1 == ret) { perror("send"); exit(1); } memset(&Buff,0,sizeof(Buff)); } } int main() { int sockfd,ret,fd[100] = {0}; pthread_t tid[100] = {0}; int i = 0; int length; struct sockaddr_in server_addr; struct sockaddr_in client_addr; printf("Start ....\n"); sockfd = socket(PF_INET,SOCK_STREAM,0); //创建socket if(-1 == sockfd) { perror("socket"); exit(1); } int opt = 1; setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)); memset(&server_addr,0,sizeof(server_addr)); server_addr.sin_family = PF_INET; server_addr.sin_port = PORT; server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); printf("Binding ....\n"); ret = bind(sockfd,(struct sockaddr*)&server_addr,sizeof(server_addr)); //将信息绑定到socket if(-1 == ret) { perror("bind"); exit(1); } printf("Listening ...\n"); ret = listen(sockfd,5); if(-1 == ret) { perror("listen"); exit(1); } while(1) { length = sizeof(client_addr); fd[i] = accept(sockfd,(struct sockaddr*)&client_addr,&length); //接收多个客户端的连接 if(-1 == fd[i]) { perror("accept"); exit(1); } printf("Accept %d, Port %d \n",fd[i],server_addr.sin_port); ret = pthread_create(&tid[i],NULL,Recv,(void *)&fd[i]); //为每个客户端创建线程,来处理来自每个客户端发送来的信息 if(ret != 0) { perror("pthread_create"); exit(1); } i++; } close(sockfd); return 0; }
客户端 #include<stdio.h> #include<stdlib.h> #include<string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <pthread.h> pthread_t tid[2]; #define PORT 123 struct info { int num; char buf[100]; }; void *my_send(void *arg) { struct info SendBuff = {0}; int ret,oldtype; pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,&oldtype); while(1) { scanf("%s %d",SendBuff.buf,&SendBuff.num); ret = send(*(int *)arg,&SendBuff,sizeof(SendBuff),0); if(-1 == ret) { perror("send"); exit(1); } if(!strcmp(SendBuff.buf,"bye")) { close(*(int *)arg); pthread_cancel(tid[1]); break; } memset(&SendBuff,0,sizeof(SendBuff)); } } void *my_recv(void *arg) { struct info RecvBuff = {0}; int ret; while(1) { ret = recv(*(int *)arg,&RecvBuff,sizeof(RecvBuff),0); if(-1 == ret) { perror("recv"); exit(1); } printf("\t\t %s \n",RecvBuff.buf); memset(&RecvBuff,0,sizeof(RecvBuff)); } } int main() { int sockfd,ret; struct sockaddr_in server_addr; sockfd = socket(PF_INET,SOCK_STREAM,0); if(-1 == sockfd) { perror("socket"); exit(1); } memset(&server_addr,0,sizeof(server_addr)); server_addr.sin_family = PF_INET; server_addr.sin_port = PORT; server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); printf("Connecting ...\n"); ret = connect(sockfd,(struct sockaddr*)&server_addr,sizeof(server_addr)); if(-1 == ret) { perror("connect"); exit(1); } ret = pthread_create(&tid[0],NULL,my_send,(void *)&sockfd); if(ret != 0) { perror("pthread_create"); exit(1); } ret = pthread_create(&tid[1],NULL,my_recv,(void *)&sockfd); if(ret != 0) { perror("ptherad_create2"); exit(1); } pthread_join(tid[0],NULL); pthread_join(tid[1],NULL); close(sockfd); return 0; } 执行结果 服务器 Start .... Binding .... Listening ... Accept 4, Port 123 Accept 5, Port 123 Recv form client 4 : hello Recv form client 5 : hello 客户端1 Connecting ... hello 5 hello bye 客户端2 Connecting ... hello hello 4 bye
相关文章推荐
- 实现客户端和服务器之间的通信(TCP协议、多线程)
- tcp 多路复用实现 两个客户端之间的通信
- 用TcpTrace监控OpenERP客户端和服务器之间的通信
- 客户端与服务器之间分别通过TCP和UDP进行通信
- 基于TCP的客户端与服务器端之间的通信
- 服务器与客户端之间通信格式以及协议字
- C#基于TCP&UDP实现服务器与多个客户端之间的通信(客户端之间直接通信,不靠服务器端转发消息)
- c++做服务器,java当客户端,采用 tcp协议之相互通信demo
- Java基于TCP实现服务器和多客户端之间的通信
- diy数据库(八)--客户端和服务器之间的通信协议
- 实现采用客户/服务器通信模式,基于TCP网络通信协议的多客户端简单应用
- 利用多线程和TCP技术,实现客户端与服务端之间的通信
- tcp客户端与服务端之间的通信实例
- 实现多客户端和服务器之间的通讯(TCP协议下,多进程)
- Java通信编程中调用UDP协议与TCP协议之间的不同
- 实现采用客户/服务器通信模式,基于TCP网络通信协议的多客户端简单应用之案例分析
- TCP服务器、客户端之间的相互通信
- 基于TCP 实现客户端之间通信【1】
- 初探基于TCP的服务器/客户端结构的聊天系统(二)之应用层通信协议设计
- Http-008-HTTP 协议用于客户端和服务器端之间的通信