一尘不染

连接失败时重用套接字描述符

linux

在我的客户端代码中,我正在按照以下步骤连接到套接字:

  1. 创建一个套接字

    sockDesc = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)
    
  2. 连接它(失败时重试“ x”次)

    connect(sockDesc, (sockaddr *) &destAddr, sizeof(destAddr))
    

(填写destAddr字段后)

  1. 使用套接字进行send()/ recv()操作:

    send(sockDesc, buffer, bufferLen, 0)
    

    recv(sockDesc, buffer, bufferLen, 0)

  2. close() 套接字描述符并退出

    close(sockDesc)
    

如果在send()/ 期间recv()断开连接,我发现可以通过返回步骤2进行连接。

这个解决方案可以吗?我应该关闭套接字描述符并返回到步骤1吗?

我无法理解的另一个有趣的观察是何时停止回显服务器并启动客户端。我创建了一个Socket(第1步),并调用connect()失败(如预期的那样),但随后我继续调用connect()10次​​。重试5次后,我启动服务器并connect()成功。但是在send()通话过程中会收到SIGPIPE错误消息。我想知道:

1)每次connect()失败我都需要创建一个新的套接字吗?按我的理解,只要我还没有进行任何send()/
recv()插座上就和新的一样,我可以重复使用相同fdconnect()电话。

2)我不明白为什么SIGPIPE服务器启动并connect()成功后会收到消息。


阅读 276

收藏
2020-06-07

共1个答案

一尘不染

是的,您应该关闭并返回步骤1:

close()关闭文件描述符,以便它不再引用任何文件,并且可以重用。

这里

2020-06-07