[英]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 ...
如果您看不到结果有任何差异,则问题不在于默认的流控制机制。
与所有套接字API一样,您应该检查send()的返回值(应该是发送的字节数),然后使用诊断函数来查看有什么问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.