【发布时间】:2013-03-13 11:05:23
【问题描述】:
我对网络非常陌生,并且在 while 循环期间发送消息时遇到问题。
据我所知,我应该这样做:
Create Socket()
Connect()
While
Do logic
Send()
End while
Close Socket()
但是它发送一次然后返回-1。
代码只有在我在循环中创建套接字时才会起作用。
While
Create Socket()
Connect()
Do logic
Send()
Close Socket()
End while
这是我正在使用但不起作用的代码部分:
//init winsock
WSAStartup(MAKEWORD(2, 0), &wsaData);
//open socket
sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
//connect
memset(&serveraddr, 0, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
serveraddr.sin_addr.s_addr = inet_addr(ipaddress);
serveraddr.sin_port = htons((unsigned short) port);
connect(sock, (struct sockaddr *) &serveraddr, sizeof(serveraddr));
while(true) {
if (send(sock, request.c_str(), request.length(), 0)< 0 /*!= request.length()*/) {
OutputDebugString(TEXT("Failed to send."));
} else {
OutputDebugString(TEXT("Activity sent."));
}
Sleep(30000);
}
//disconnect
closesocket(sock);
//cleanup
WSACleanup();
函数CheckForLastError()返回:10053
WSAECONNABORTED 软件导致连接中止。 已建立的连接被主机中的软件中止,可能是由于数据传输超时或协议错误
谢谢
【问题讨论】:
-
connect 也应该在 while 循环之外。您能否展示您遇到问题的示例?
-
正确的方法是第一个示例中的方法,它只发送一次然后返回错误。您应该致电WSAGetLastError 来获取该错误,这应该会提示您失败的原因。您的第二个示例仅因为您在重复第一个示例而起作用;创建套接字,连接,发送,关闭套接字,回到第一步。
-
该IP地址是否在监听任何流量?
-
你研究过
WSAECONNABORTED是什么意思吗?这可能会为您提供如何进行的线索 -
将您最后的
request+="\r\n";更改为request+="\r\n\r\n";。 HTTP 需要 double newline 来结束请求,而你只发送一个,所以 HTTP 服务器就在等你完成发送。
标签: c++ windows sockets networking winsock