IO网络5.0

思维导图

使用select实现TCP客户端的并发

IO网络5.0_第1张图片

#include 
#include 
#include 
#include 

#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服务器的并发

你可能感兴趣的:(网络,php,开发语言)