我正在使用典型的套接字API在Linux平台上用C++编写网络应用程序,我正在研究将字节数组写入TCP流的两种替代方法:通过调用write()或调用send( ).我知道,因为这是Linux,套接字句柄只是一个文件描述符,因此在套接字上执行read()和write()调用是有效的,但套接字API也提供了send()和recv( )执行相同任务的功能.
因此,我想知道是否有任何特殊原因选择一类功能而不是另一类功能 - 是针对网络写入/读取优化的发送/接收功能,它们是否表现更好等等?或者我使用哪些功能真的是武断的?read()和write()在所有情况下都能正常运行吗?
感谢您的任何见解!
在我的客户端代码中,我按照以下步骤连接到套接字:
创建套接字
sockDesc = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)
Run Code Online (Sandbox Code Playgroud)连接(在发生故障时重试'x'时间)
connect(sockDesc, (sockaddr *) &destAddr, sizeof(destAddr))
Run Code Online (Sandbox Code Playgroud)
(填写后填写destAddr)
使用socket进行send()/ recv()操作:
send(sockDesc, buffer, bufferLen, 0)
recv(sockDesc, buffer, bufferLen, 0)
Run Code Online (Sandbox Code Playgroud)close() 套接字描述符并退出
close(sockDesc)
Run Code Online (Sandbox Code Playgroud)如果在send()/ recv()连接断开期间,我发现我可以通过返回到步骤2进行连接.
这个解决方案好吗?我应该关闭套接字描述符并返回步骤1吗?
另一个我无法理解的有趣观察是当我停止我的echo服务器并启动客户端时.我创建了一个Socket(步骤1)并且调用connect()失败(正如预期的那样)但是我继续打电话connect(),比方说,10次.重试5次后,我启动服务器并connect()成功完成.但在send()通话期间它收到SIGPIPE错误.我想知道:
1)每次connect()失败都需要创建一个新套接字吗?根据我的理解,只要我没有在套接字上执行任何send()/ recv()它就像新的一样好,我可以重用它fd来进行connect()调用.
2)我不明白SIGPIPE服务器启动并connect()成功后收到的原因.