我正在使用TCP编写对等2对等聊天应用程序。此应用程序包括一个文件中的客户端和服务器部分我正在使用select()
而不使用fork()
,pthread
来处理连接。这是我的应用机制,我通过在不同终端上运行应用程序在同一主机上运行应用程序:
./p2p portToListen
。
portToListen
上打开一个套接字,比如ServerSock1,以监听来自其他对等方的连接。
然后它进入一个带有select()
函数的while循环来等待事件。 ./p2p portToListen portToConnectTo
(我在此处未指定IP地址,因为我在本地计算机上运行)。
我的问题是,在这种情况下,每次对等方发送/接收配置信息(不是聊天消息)时,是否需要关闭套接字。例如,在P1发送当前组的信息后,是否需要关闭ServerSock1和ClientSock1,并且在P2发送ACK后,是否需要关闭ServerSock2和ClientSock2?我想,应该始终打开ServerSock1,2?只能在while循环之外关闭?
如果我这样做,select()
将无效,因为没有套接字来监控事件。当两个对等方想要发送聊天消息时,他们需要再次为服务器端和客户端打开套接字,通过调用(socket()
,bind()
,{{1发送信息来建立新连接}},listener()
,accept()
),再次发送一些聊天消息和connect()
个套接字。
此外,如果我想向同一组中的其他对等体发送广播消息,我需要再次打开对等体的套接字,发送聊天消息并在每个套接字中close()
?
一般情况下,由于我只使用close()
,select()
和打开套接字的正确方法是什么?如果有可能,你能给我一个一般情况吗?我非常感谢你的任何评论。非常感谢。以下是我的通用代码:
close()
答案 0 :(得分:2)
您应该重复使用相同的连接。您可能需要调整协议,以便准确了解请求和响应的完成位置以及新的响应。
答案 1 :(得分:0)
不,除非您想终止连接或停止收听新连接,否则您不必close()
。
listen()
套接字即使在accept()
之后也会继续侦听新的连接尝试,只是继续检查与select()
和accept()
的新连接,以及不必重新创建此套接字。
已建立的TCP会话是双向数据流,只要您需要与该对等方通信,就可以安全地send()
和recv()
多次。在每个信息块之后重新连接是没有意义的。
在接受的连接中也使用select()
来检查是否有准备好recv()
的信息。
请注意,每次拨打fd_set
时都必须重建select()
。你的代码执行方式是错误的。