多个客户端之间的通信
来源:互联网 发布:怎么看本机端口号 编辑:程序博客网 时间:2024/05/20 00:17
服务器
#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <stdlib.h>#include <string.h>#include<pthread.h>#define PORT 8888struct info{ char buf[100]; int Tofd;};void *MyReceive(void *arg){ struct info Recvbuf = {0}; int ret; pthread_detach(pthread_self()); while(1) { ret = recv(*(int *)arg,&Recvbuf,sizeof(Recvbuf),0); if(-1 == ret) { perror("recv"); exit(1); } if(!strcmp(Recvbuf.buf,"bye")) { close(*(int *)arg); break; } ret = send(Recvbuf.Tofd,&Recvbuf,sizeof(Recvbuf),0); if(-1==ret) { perror("send"); exit(1); } memset(&Recvbuf, 0, sizeof(Recvbuf)); }}int main(){ int sockfd, ret,fd[100]={0}, i=0,length; pthread_t tid[100]={0}; char buf[100] = {0}; struct sockaddr_in server_addr; struct sockaddr_in client_addr; printf("Start Server!\n"); sockfd = socket(PF_INET, SOCK_STREAM, 0); 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"); ret = bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)); 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], client_addr.sin_port); ret =pthread_create(&tid[i],NULL,MyReceive,(void *)&fd[i]); if(0 != ret) { perror("pthread_create"); exit(1); } i++; } close(sockfd); return 0;}
客户端
#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <stdlib.h>#include <string.h>#include <netinet/in.h>#include <arpa/inet.h>#include<pthread.h>#define PORT 8888struct info{ char buf[100]; int Tofd;};pthread_t tid[2]={0};void *Send(void *arg){ struct info Sendbuf = {0}; int ret; while (1) { scanf("%s%d", Sendbuf.buf,&Sendbuf.Tofd); ret = send(*(int *)arg,&Sendbuf, sizeof(Sendbuf), 0); if (-1 == ret) { perror("send"); exit(1); } if (!strcmp(Sendbuf.buf, "bye")) { close(*(int *)arg); pthread_cancel(tid[1]); break; } memset(&Sendbuf, 0, sizeof(Sendbuf)); }}void *Recv(void *arg){ struct info Recvbuf = {0}; int ret,oldtype; pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS,&oldtype); while (1) { ret = recv(*(int *)arg,&Recvbuf, sizeof(Recvbuf), 0); if (-1 == ret) { perror("recv"); exit(1); } printf("\t\t\t%s\n",Recvbuf.buf); memset(&Recvbuf, 0, sizeof(Recvbuf)); }}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("Start 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,Send,(void *)&sockfd); if(0 != ret) { perror("pthread_create1"); exit(1); } ret = pthread_create(&tid[1],NULL,Recv,(void *)&sockfd); if(0 != ret) { perror("pthread_create1"); exit(1); } pthread_join(tid[0],NULL); pthread_join(tid[1],NULL); close(sockfd); return 0;}
阅读全文
0 0
- 多个客户端之间的通信
- C#基于TCP&UDP实现服务器与多个客户端之间的通信(客户端之间直接通信,不靠服务器端转发消息)
- Socket编程总结—Android手机服务器与多个Android手机客户端之间的通信(非阻塞)
- Socket编程总结—Android手机服务器与多个Android手机客户端之间的通信(非阻塞)
- Socket编程总结—Android手机服务器与多个Android手机客户端之间的通信(非阻塞)
- java多线程实现服务器端与多客户端之间的通信
- 多个activity之间通信
- Android客户端与服务器之间的通信
- 基于服务端和客户端之间的通信
- TCP服务器、客户端之间的相互通信
- Socket 客户端和服务端无限次通信,多个客户端和服务端通信的例子
- 多个客户端与一个服务器端通信的问题
- 多个线程之间是如何进行通信的呢?
- 多个线程之间是如何进行通信的呢?
- 如何实现浏览器多个标签页之间的通信?
- 2个窗体之间的通信
- 3个线程之间的通信
- 利用LocalConnection实现多个应用之间的通讯 (不同MXML之间的通信)
- linux日志切割
- Java高并发,如何解决,什么方式解决
- 【5】 Kotlin中的单例模式
- 在SecureCRT中添加映射按钮,发现确定键是灰色的,没法点击
- python 第一天
- 多个客户端之间的通信
- MCU的I2S为slave时出现噪音的解决方案
- 磁盘共享
- jQuery中的层次选择器
- detour寻路过程解析
- java 线程作业2
- Ubuntu 16.4.3 apt-get update 错误
- Mac 下 Android studio 添加 jar包
- mysql重置密码