博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
服务器与多个客户端通信
阅读量:4612 次
发布时间:2019-06-09

本文共 2921 字,大约阅读时间需要 9 分钟。

使用多路复用实现一个服务器与多个客户端的通信:代码范例:服务器:#include
#include
#include
#include
#include
#include
#include
#include
void send1(int *a){ int i; char buf[20]; bzero(buf,20); fgets(buf,20,stdin); for(i=0;i<12;i++) { if(a[i] !=0) send(a[i],buf,20,0); }}int main(){ int fds[12]={ 0}; int maxfd = -1; int socketfd = socket(PF_INET,SOCK_STREAM,0); if(socketfd>maxfd) maxfd = socketfd; struct sockaddr_in saddr; memset(&saddr,0,sizeof(saddr)); saddr.sin_family = PF_INET; saddr.sin_port = htons(6000); saddr.sin_addr.s_addr = inet_addr("192.168.1.46"); int newsocketfd; int n = 1; setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR, &n, sizeof(int)); if(bind(socketfd,(struct sockaddr*)&saddr,sizeof(struct sockaddr_in))<0) perror("bind() error!\n"); if(listen(socketfd,5)<0) perror("listen() error!\n"); struct sockaddr_in caddr; int s = sizeof(struct sockaddr);// newsocketfd = accept(socketfd,(struct sockaddr*)&caddr,&s); fd_set fd; FD_ZERO(&fd); int ret; char buf[20],buf1[20]; int i; int rsize; while(1) { FD_ZERO(&fd); FD_SET(0,&fd); FD_SET(socketfd,&fd); for(i=0;i<12;i++) { // printf("--------------\n"); if(fds[i]!=0) FD_SET(fds[i],&fd); } ret = select(maxfd+1,&fd,NULL,NULL,NULL); if(ret<0) { perror("select() error!\n"); break; } else if(ret ==0) { continue; } else { if(FD_ISSET(socketfd,&fd)) { newsocketfd = accept(socketfd,(struct sockaddr*)&caddr,&s); if(newsocketfd>maxfd) { // printf("--------------\n"); maxfd = newsocketfd; for(i=0;i<12;i++) { if(fds[i]==0) { fds[i] = newsocketfd; break; } } } continue; }// printf("helo\n"); for(i=0;i<12;i++) { if(fds[i] !=0 && FD_ISSET(fds[i],&fd)) { bzero(buf1,20); if(recv(fds[i],buf1,20,0)==0) { close(fds[i]); fds[i] = 0; } printf("%s",buf1); } } if(FD_ISSET(0,&fd)) { send1(fds); } } } close(socketfd); close(newsocketfd);}客户端:#include
#include
#include
#include
#include
#include
#include
#include
int main(){ int socketfd,ret; fd_set fd; FD_ZERO(&fd); FD_SET(0,&fd); socketfd = socket(PF_INET,SOCK_STREAM,0); FD_SET(socketfd,&fd); ret = select(socketfd+1,&fd,NULL,NULL,NULL); struct sockaddr_in saddr; memset(&saddr,0,sizeof(saddr)); saddr.sin_family = PF_INET; saddr.sin_port = htons(6000); saddr.sin_addr.s_addr = inet_addr("192.168.1.46"); if(connect(socketfd,(struct sockaddr *)&saddr,sizeof(struct sockaddr))<0) perror("connect() error!\n");// pthread_t pthreadid;// pthread_create(&pthreadid,NULL,func,NULL); char buf[20],buf1[20]; while(1) { bzero(buf,20); bzero(buf1,20); FD_SET(0,&fd); FD_SET(socketfd,&fd); ret = select(socketfd+1,&fd,NULL,NULL,NULL); if(FD_ISSET(socketfd,&fd)) { if(recv(socketfd,buf1,sizeof(buf1),0)<0) perror("recv() error!\n"); printf("%s",buf1); continue; } if(FD_ISSET(0,&fd)) { fgets(buf,20,stdin); if(send(socketfd,buf,strlen(buf),0)<0) perror("send() error!\n"); continue; } }

 

转载于:https://www.cnblogs.com/defen/p/5287678.html

你可能感兴趣的文章
基于 Web 的 Go 语言 IDE - Wide 1.1.0 公布!
查看>>
nyist oj 138 找球号(二)(hash 表+位运算)
查看>>
Movidius软件手册阅读 2017-09-04
查看>>
ytu 1910:字符统计(水题)
查看>>
201671030110 姜佳宇 实验三作业互评与改进
查看>>
mysql-5.6.15 开启二进制文件
查看>>
python的沙盒环境--virtualenv
查看>>
软件自动化测试——入门、进阶与实战
查看>>
BZOJ1878 [SDOI2009]HH的项链 树状数组 或 莫队
查看>>
BZOJ3675 [Apio2014]序列分割 动态规划 斜率优化
查看>>
2016.10.24 继续学习
查看>>
产品功能对标 - 服务授权管理
查看>>
各地IT薪资待遇讨论
查看>>
splay入门
查看>>
带CookieContainer进行post
查看>>
C语言学习笔记--字符串
查看>>
CSS-上下文选择器
查看>>
ionic repeat 重复最后一个时要执行某个函数
查看>>
1.初识代码审计-基础
查看>>
[Vue-rx] Stream an API using RxJS into a Vue.js Template
查看>>