思维导图
使用select实现TCP客户端的并发
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <myhead.h>#define SER_PORT 8888 //服务器端口号
#define SER_IP "192.168.122.61" //服务器客户端//客户端TCP
int main(int argc, const char *argv[])
{//1、创建用于通信的套接字文件描述法int cfd = -1;cfd = socket(AF_INET, SOCK_STREAM, 0);if(cfd == -1){perror("socket error");return -1;}//3、链接服务器//3.1填充要链接的服务器地址信息结构体struct sockaddr_in sin;sin.sin_family = AF_INET; //通信域 sin.sin_port = htons(SER_PORT); //端口号sin.sin_addr.s_addr = inet_addr(SER_IP); //IP地址//3.2链接服务器if(connect(cfd, (struct sockaddr*)&sin, sizeof(sin)) == -1){perror("connect error");return -1;}//11、准备一个文件描述符容器fd_set readfds, tempfds;//22、清空容器FD_ZERO(&readfds);//33、将要检测的文件描述符放入集合FD_SET(0,&readfds);FD_SET(cfd,&readfds);//定义一个变量存储容器中最大的文件描述符int maxfd = cfd;//4、收发(读写)数据char buf[128] = "";while(1) { tempfds = readfds;//使用select函数对容器中的文件描述符进行检测int res = select(maxfd+1,&tempfds, NULL, NULL, NULL);if(res == -1){perror("select error");return -1;}else if(res == 0){printf("timeout\n");return -1;}for(int i=0; i <= maxfd ;i++){if(!FD_ISSET(i,&tempfds)){continue;}if(i==0){char buf[128];scanf("%s",buf);send(cfd,buf,sizeof(buf),0);}else if(i==cfd){char buf[128]="";int res=recv(cfd,buf,sizeof(buf),0);printf("%d\n",res);printf("收到的消息为:%s\n",buf);}}/*清空数组bzero(buf,sizeof(buf));printf("请输入:");//从终端输入数据fgets(buf, sizeof(buf), stdin);buf[strlen(buf)-1] = '\0'; //将换行改为'\0'//发送给服务器send(cfd, buf, sizeof(buf), 0);printf("发送成功\n");if(strcmp(buf,"quit")==0) {break;}//接收服务器发来的消息recv(cfd, buf, sizeof(buf), 0);*/}//5、关闭客户端,套接字close(cfd);return 0;
}
使用poll实现TCP服务器的并发