思维导图
使用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服务器的并发