繁体   English   中英

C ++下的套接字问题

[英]Socket problem under C++

我通过以下方式打开了服务器连接

SOCKADDR_IN SockAddr;
SockAddr.sin_port=htons(445);
SockAddr.sin_family=AF_INET;
SockAddr.sin_addr.s_addr=*((unsigned long*)host->h_addr);

// Attempt to connect to server
if(connect(Socket,(SOCKADDR*)(&SockAddr),sizeof(SockAddr))!=0)
{
    printf("Failed to establish connection with server\r\n");
    WSACleanup();
    system("PAUSE");
    return 0;
}

然后,我尝试通过TCP连接发送数据,如下所示:

unsigned char completePacket[100] = something;

send(Socket, (char *) completePacket, 100, 0);

这可以正常工作2次,但是第三次​​好像没有发送数据包...我是否需要在每次发送后冲洗袜子或以某种方式重置它们?

谢谢

send(Socket, (char *) completePacket, 100, 0);

很好,但是您应该始终检查返回值。 send实际发送的内容可能比您发送的要少(尽管仅发送了300个字节,这不太可能是问题所在。)

您不需要冲洗套接字。

也许问题出在接收方? 请记住,TCP提供的是流,而不是数据包或消息。 一个发送呼叫可能需要几个recv呼叫才能全部接收。 并且由多个发送调用发送的数据可能仅在一个recv调用中被接收。 您必须跟踪收到的数据量。

如果要检查通过网络传输的数据,请安装网络监视器,例如Wireshark。

当您频繁发送少量数据时,TCP / IP堆栈将根据其流控制算法来缓冲数据。 这是为了优化带宽利用。 这称为Nagle算法。 您的观察结果很可能是由于Nagle的算法已启用(默认情况下处于启用状态)。 但这可能完全是另一回事。 您可以通过以下消除方法来确保。

connect后放入以下代码

int flag = 1;
int result = setsockopt(sock,            
                 IPPROTO_TCP,
                 TCP_NODELAY,
                 (char *) &flag,
                 sizeof(flag));
if (result < 0)
... handle the error ...

如果您看不到结果有任何差异,则问题不在于默认的流控制机制。

如果另一端在发送下一个之前没有确认数据包,则由于RFC 896中指定的Nagle算法 ,其他数据包可能会延迟。 从本质上讲,一旦确认了已发送的未完成数据,便会缓冲其他较小的发送并将其发送到一个较大的数据包中。 这有助于防止网络被大量小数据包淹没。

与所有套接字API一样,您应该检查send()的返回值(应该是发送的字节数),然后使用诊断函数来查看有什么问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM