C++sock通信 可一对多 服务端

sock通信 可一对多
server

int main()
{
	WSAData wsadata;
	WSAStartup(0x1010, &wsadata);

	//初始化套接字
	SOCKET hSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (hSock == INVALID_SOCKET)
	{
		WSACleanup();
		return hSock;
	}

	//绑定
	SOCKADDR_IN addr_in = { 0 };
	addr_in.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	addr_in.sin_family = AF_INET;
	addr_in.sin_port = htons(3016);
	int nBindRes = bind(hSock, (SOCKADDR *)(&addr_in), sizeof(SOCKADDR));
	if (nBindRes != 0)
	{
		WSACleanup();
		return nBindRes;
	}

	//监听




	int nlres = listen(hSock, 1);

	//接收连接

	int nLen = sizeof(SOCKADDR);



	while (1) {
		SOCKET * psc = (SOCKET *)malloc(sizeof(SOCKET));
		*psc = accept(hSock, 0, 0);

		
		//printf("一个客户端已经连接到本机的3016端口,SOCKET是 : %u \n", *psc);
		lizf++;
		pubg[lizf] = *psc;
	//	如果不需要收客户端信息 这里可以屏蔽 CreateThread(NULL,
	//		0,
	//		&ThreadProcServerConmunicate,
	//		psc,
	//		0,
	//		NULL
		);
	}


	while (1)
	{
		DWORD code;
		GetExitCodeThread(g_hRecv, &code);
		if (STILL_ACTIVE != code)
		{
			break;
		}
		//发送
		//printf("发送内容:");
		char s_talk_to[128] = { 0 };
		//MyGets(s_talk_to);
		//puts(GetTime().c_str());
		send(hTalk, s_talk_to, strlen(s_talk_to), 0);
	}
	if (hTalk != INVALID_SOCKET)
	{
		closesocket(hTalk);
		hTalk = INVALID_SOCKET;
	}
	if (hSock != INVALID_SOCKET)
	{
		closesocket(hSock);
		hSock = INVALID_SOCKET;
	}
	WSACleanup();
	return 0;
}
要使用`poll`实现TCP服务端一对多连接,你可以按照以下步骤进行: 1. 创建一个TCP服务器套接字,并绑定到一个特定的IP地址和端口号上。 2. 使用`listen`函数开始监听传入的连接请求。 3. 创建一个`poll`对象,并将服务器套接字添加到该对象中。 4. 创建一个空的字典,用于存储客户端套接字和其对应的文件描述符。 5. 进入主循环,使用`poll`函数等待事件发生。 6. 当服务器套接字上有新的连接请求时,使用`accept`函数接受该连接,并将返回的客户端套接字添加到`poll`对象中。 7. 当有客户端套接字上有数据可读时,使用`recv`函数接收数据,并进行相应的处理。 8. 当有客户端套接字断开连接时,关闭该套接字,并从`poll`对象和字典中移除。 9. 回到第5步,继续等待事件发生。 下面是一个简单的示例代码,演示了如何使用`poll`实现TCP服务端一对多连接: ```python import socket import select server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('localhost', 12345)) server_socket.listen(5) poll = select.poll() poll.register(server_socket.fileno(), select.POLLIN) clients = {} while True: events = poll.poll() for fileno, event in events: if fileno == server_socket.fileno(): # 有新的连接请求 client_socket, addr = server_socket.accept() poll.register(client_socket.fileno(), select.POLLIN) clients[client_socket.fileno()] = client_socket elif event & select.POLLIN: # 有数据可读 client_socket = clients[fileno] data = client_socket.recv(1024) if data: # 处理接收到的数据 # ... else: # 客户端断开连接 client_socket.close() poll.unregister(fileno) del clients[fileno] ``` 在这个示例中,我们使用了`socket`模块来创建套接字,使用`select`模块来进行事件的监听。通过`poll`对象的`register`方法,我们可以将文件描述符和相应的事件类型注册到`poll`对象中。然后,通过调用`poll`对象的`poll`方法,我们可以等待事件发生,并返回发生事件的文件描述符和事件类型。根据这些信息,我们可以实现相应的逻辑来处理连接、接收数据和断开连接等操作。 请注意,这只是一个简单的示例,你还可以根据自己的需求进行适当的修改和扩展。另外,需要注意处理异常情况和错误处理,以保证程序的稳定性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值