8.16嵌入式作业(IO多路复用)

文章目录

  • 作业内容
    • 核心代码部分
    • 测试结果

作业内容

完成select的TCP客户端

核心代码部分

int main(int argc, const char *argv[])
{
	//创建流式套接字
	int sfd = socket(AF_INET, SOCK_STREAM, 0);
	if(sfd < 0)
	{
		ERR_MSG("socket");
		return -1;
	}
	printf("create socket success\n");

	//绑定客户端的地址信息结构体--》非必须绑定 
	
	//填充要连接的服务器的地址信息结构体
	struct sockaddr_in sin;
	sin.sin_family 		= AF_INET;
	sin.sin_port 		= htons(PORT);
	sin.sin_addr.s_addr = inet_addr(IP);

	//连接服务器 connect
	if(connect(sfd, (struct sockaddr*)&sin, sizeof(sin)) < 0)
	{
		ERR_MSG("connect");
		return -1;
	}

	//创建一个读集合
	fd_set readfds, tempfds;

	//将集合清空
	FD_ZERO(&readfds);
	FD_ZERO(&tempfds);

	//将0号文件描述符添加到集合
	FD_SET(0, &readfds);

	//将sfd文件描述符添加到集合
	FD_SET(sfd, &readfds);

	//最大文件描述符
	int maxfd = sfd;

	int select_res = 0;
	char buf[128] = "";
	ssize_t res = 0;

	while(1)
	{
		tempfds = readfds;
		select_res = select(maxfd+1, &tempfds, NULL, NULL, NULL);
		if(select_res < 0)
		{
			ERR_MSG("select");
			return -1;
		}
		else if(0 == select_res)
		{
			fprintf(stderr, "select time out\n");
			break;
		}

		if(FD_ISSET(0, &tempfds) != 0)
		{
			printf("触发发送数据事件:");
			fflush(stdout);
			//发送
			bzero(buf, sizeof(buf));
			fgets(buf, sizeof(buf), stdin);
			buf[strlen(buf)-1] = 0;

			if(send(sfd, buf, sizeof(buf), 0) < 0)
			{
				ERR_MSG("send");
				return -1;
			}
			printf("send success\n");
		}

		if(FD_ISSET(sfd, &tempfds) != 0)
		{
			printf("触发接收数据事件:");
			fflush(stdout);
			//接收 
			bzero(buf, sizeof(buf));
			res = recv(sfd, buf, sizeof(buf), 0);
			if(res < 0)
			{
				ERR_MSG("recv");
				return -1;
			}
			else if(0 == res)
			{
				printf("server is off-line\n");
				break;
			}
			printf("%ld : %s\n", res, buf);
		}
	}

	//关闭套接字
	close(sfd);

	return 0;
}



测试结果

8.16嵌入式作业(IO多路复用)_第1张图片

你可能感兴趣的:(网络,linux,ubuntu,tcp,服务器)