【发布时间】:2011-01-15 07:13:22
【问题描述】:
在我的客户端代码中,我按照以下步骤连接到套接字:
-
创建一个套接字
sockDesc = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) -
连接它(在失败的情况下重试'x'时间)
connect(sockDesc, (sockaddr *) &destAddr, sizeof(destAddr))(填写
destAddr字段后) -
使用socket进行
send()/recv()操作:send(sockDesc, buffer, bufferLen, 0) recv(sockDesc, buffer, bufferLen, 0) -
close()套接字描述符并退出close(sockDesc)
如果在send()/recv()期间连接中断,我发现返回步骤2可以连接。
这个解决方案好吗?我应该关闭套接字描述符并返回步骤 1 吗?
另一个我无法理解的有趣观察是
我停止我的回声服务器并启动客户端。我创建了一个套接字(第 1 步)并调用 connect() 失败(如预期的那样),但随后我继续调用 connect(),比方说 10 次。重试 5 次后,我启动服务器,connect() 成功。但是在send() 调用期间,它会收到SIGPIPE 错误。我想知道:
1) 每次connect() 失败时,我是否需要创建一个新套接字?根据我的理解,只要我没有在套接字上执行任何send()/recv(),它就和新的一样好,我可以将相同的fd 重复用于connect() 调用。
2) 我不明白为什么在服务器启动并且connect() 成功时收到SIGPIPE。
【问题讨论】:
-
按照建议更改代码关闭 scoket-descriptor 并创建新套接字并连接后,SIGPIPE 问题不再发生。
-
我发现此链接很有用,并且与您的问题相关,因为您使用的是发送而不是写:stackoverflow.com/questions/9048959/…