不使用通信时打开和关闭套接字,只使用语言C中的select()

时间:2014-05-22 23:42:19

标签: c sockets p2p

我正在使用TCP编写对等2对等聊天应用程序。此应用程序包括一个文件中的客户端和服务器部分我正在使用select()而不使用fork()pthread来处理连接。这是我的应用机制,我通过在不同终端上运行应用程序在同一主机上运行应用程序:

  1. 将第一个节点(假设为P1)初始化为./p2p portToListen
    • 此节点将在portToListen上打开一个套接字,比如ServerSock1,以监听来自其他对等方的连接。 然后它进入一个带有select()函数的while循环来等待事件。
  2. 将第二个节点(假设为P2)初始化为./p2p portToListen portToConnectTo(我在此处未指定IP地址,因为我在本地计算机上运行)。
    • 这也打开了一个新的套接字,比如说ServerSock2,在“portToListen”作为第一个套接字,打开一个新套接字,让ClientSock2连接到第一个套接字。然后进入while循环。
    • 当P2连接到P1时,在P1处,它还接受与套接字ClientSock1的新连接。
  3. 在设置网络信息和交换网络配置的一些阶段(P1将当前组的信息发送到P2并等待来自P2的ACK)之后,他们能够发送聊天消息。
  4. 我的问题是,在这种情况下,每次对等方发送/接收配置信息(不是聊天消息)时,是否需要关闭套接字。例如,在P1发送当前组的信息后,是否需要关闭ServerSock1和ClientSock1,并且在P2发送ACK后,是否需要关闭ServerSock2和ClientSock2?我想,应该始终打开ServerSock1,2?只能在while循环之外关闭?

    如果我这样做,select()将无效,因为没有套接字来监控事件。当两个对等方想要发送聊天消息时,他们需要再次为服务器端和客户端打开套接字,通过调用(socket()bind(),{{1发送信息来建立新连接}},listener()accept()),再次发送一些聊天消息和connect()个套接字。

    此外,如果我想向同一组中的其他对等体发送广播消息,我需要再次打开对等体的套接字,发送聊天消息并在每个套接字中close()

    一般情况下,由于我只使用close()select()和打开套接字的正确方法是什么?如果有可能,你能给我一个一般情况吗?我非常感谢你的任何评论。非常感谢。以下是我的通用代码:

    close()

2 个答案:

答案 0 :(得分:2)

您应该重复使用相同的连接。您可能需要调整协议,以便准确了解请求和响应的完成位置以及新的响应。

答案 1 :(得分:0)

不,除非您想终止连接或停止收听新连接,否则您不必close()

listen()套接字即使在accept()之后也会继续侦听新的连接尝试,只是继续检查与select()accept()的新连接,以及不必重新创建此套接字。

已建立的TCP会话是双向数据流,只要您需要与该对等方通信,就可以安全地send()recv()多次。在每个信息块之后重新连接是没有意义的。

在接受的连接中也使用select()来检查是否有准备好recv()的信息。

请注意,每次拨打fd_set时都必须重建select()。你的代码执行方式是错误的。