Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++环境下的套接字问题_C++_Sockets - Fatal编程技术网

C++环境下的套接字问题

C++环境下的套接字问题,c++,sockets,C++,Sockets,我通过以下方式打开了与服务器的连接 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(SockA

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

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次,但第三次似乎没有发送数据包。。。 我是否需要在每次发送后刷新sockts或以某种方式重置它们


谢谢

与所有套接字API一样,您应该检查send的返回值,该值应该是发送的字节数,然后使用诊断功能查看问题所在

send(Socket, (char *) completePacket, 100, 0);
可以,但您应该始终检查返回值。send可能实际上发送的比您告诉它的要少,但这不太可能是您只发送了300字节的问题

您不需要冲洗插座

也许问题出在接收器端?请记住,TCP提供的是流,而不是数据包或消息。一个发送呼叫可能需要几个recv呼叫才能全部接收。多个发送呼叫发送的数据可能只在一个recv呼叫中接收。你必须记录你收到了多少数据


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

如果另一方在发送下一个数据包之前未确认该数据包,则其他数据包可能会由于中指定的原因而延迟。本质上,一旦已经发送的未完成数据被确认,进一步的小发送将被缓冲并在一个较大的数据包中发送。这有助于防止网络被大量小数据包淹没。

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

连接后输入以下代码


如果在结果中看不到任何差异,则问题不是由于默认的流控制机制造成的

是的,我已经安装了Wireshark,这就是问题所在,因为某些奇怪的原因,我无法看到第三个数据包发送…请检查发送的返回值,是否有任何错误?端口445是windows SMB端口,如果您向其发送无意义的数据,它可能会关闭tcp连接。也这样做了,并且发送了正确数量的数据字节。很奇怪,它没有出现在nettraffic中。。。即使我经常发送,Wireshark也无法检测到它,而它可以检测到另一个。当你说第三次时,数据包似乎没有发送,这是否意味着数据根本没有到达客户端?寄什么回来?发布您如何实现客户端代码也会有所帮助。
int flag = 1;
int result = setsockopt(sock,            
                 IPPROTO_TCP,
                 TCP_NODELAY,
                 (char *) &flag,
                 sizeof(flag));
if (result < 0)
... handle the error ...