相关疑难解决方法(0)

写入套接字时使用write()而不是send()的性能影响

我正在使用典型的套接字API在Linux平台上用C++编写网络应用程序,我正在研究将字节数组写入TCP流的两种替代方法:通过调用write()或调用send( ).我知道,因为这是Linux,套接字句柄只是一个文件描述符,因此在套接字上执行read()和write()调用是有效的,但套接字API也提供了send()和recv( )执行相同任务的功能.

因此,我想知道是否有任何特殊原因选择一类功能而不是另一类功能 - 是针对网络写入/读取优化的发送/接收功能,它们是否表现更好等等?或者我使用哪些功能真的是武断的?read()和write()在所有情况下都能正常运行吗?

感谢您的任何见解!

c++ sockets network-programming

13
推荐指数
2
解决办法
1万
查看次数

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

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

  1. 创建套接字

    sockDesc = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)  
    
    Run Code Online (Sandbox Code Playgroud)
  2. 连接(在发生故障时重试'x'时间)

    connect(sockDesc, (sockaddr *) &destAddr, sizeof(destAddr))  
    
    Run Code Online (Sandbox Code Playgroud)

    (填写后填写destAddr)

  3. 使用socket进行send()/ recv()操作:

    send(sockDesc, buffer, bufferLen, 0)  
    recv(sockDesc, buffer, bufferLen, 0)  
    
    Run Code Online (Sandbox Code Playgroud)
  4. 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()成功后收到的原因.

c sockets linux

9
推荐指数
2
解决办法
1万
查看次数

标签 统计

sockets ×2

c ×1

c++ ×1

linux ×1

network-programming ×1