socket支持多客户端连接以及多并发

传智扫地僧课程学习笔记。


在之前通信的基础之上,

运行多个客户端,

能建立成功,通过netstat   -an  | grep 8001,也可以看到连接建立起来了,

可是无法通信,

总的来说就是,连接建立成功,可是无法通信,

原因就是,连接建立是TCP/IP内部为我们处理的,而通信部分是我们自己写的,却没有进行相关的处理,


我们可以通过fork创建进程,每来一个连接,创建一个进程,

	unsigned int conn = 0;
	//accept 返回一个新的连接 ,这个新的连接是一个主动套接字
	while (1)
	{
		conn = accept(sockfd, (struct sockaddr *) &peeraddr,
				(socklen_t *) &peerlen);
		if (conn == -1)
		{
			perror("fun listen\n");
			exit(0);
		}
		printf("perradd:%s\n perrport:%d\n", inet_ntoa(peeraddr.sin_addr),
				ntohs(peeraddr.sin_port));

		int pid = fork();
		if (pid == 0)
		{
			close(sockfd); //子进程不需要侦听,
			char revbuf[1024] = { 0 };
			while (1)
			{
				int ret = read(conn, revbuf, sizeof(revbuf));
				if (ret == 0)
				{
					//如果在读的过程中,对方已经关闭,tcpip协议会返回一个0数据包
					printf("对方已关闭\n");
					exit(0);
				} else if (ret < 0)
				{
					perror("读数据失败\n");
					exit(0);
				}
				//ssize_t write(int fd, const void *buf, size_t count);
				fputs(revbuf, stdout); //服务器端收到数据,打印屏幕
				write(conn, revbuf, ret); //服务器端回发信息
			}

		} else if (pid > 0)
		{
			close(conn); //父进程不需要conn
		} else
		{
			close(conn);
			//close(sockfd);
		}

	}
这个conn定义的位置,还得放外面,有点不知道为什么。

开始觉得,都是一个函数,又没有进入子进程,能有什么问题,

后来一想,这个while(1),是一直循环,那岂不是一直在定义,

你可以不同时刻给它赋予不同的值,但是你要是一直定义,就肯定有问题了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值