在我的客户端代码中,我按照以下步骤连接到套接字:
创建一个套接字
连接它(在失败的情况下重试 'x' 次)
close()
关闭套接字描述符并退出
sockDesc = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)
connect(sockDesc, (sockaddr *) &destAddr, sizeof(destAddr))
在填充destAddr
字段后,使用套接字进行send()
/recv()
操作:send(sockDesc, buffer, bufferLen, 0)
recv(sockDesc, buffer, bufferLen, 0)
close(sockDesc)
如果在send()
/recv()
期间连接中断,我发现可以通过返回第2步来重新连接。这个方法可行吗?我应该关闭套接字描述符并返回第1步吗?
另一个有趣的观察是,当我停止回声服务器并启动客户端时,我创建了一个Socket(第1步),然后调用
connect()
,它失败了(如预期),但是我仍然不断调用connect()
,比如说,10次。经过5次重试后,我启动了服务器,并且connect()
成功了。但是在send()
调用期间,它收到了SIGPIPE
错误。我想知道:1)每次
connect()
失败时,我需要创建一个新的套接字吗?据我所知,在套接字上没有执行任何send()
/recv()
操作之前,它就像新的一样,并且我可以重复使用相同的fd
进行connect()
调用。2)我不明白为什么在服务器启动且
connect()
成功时会收到SIGPIPE
。