经过6次迭代后,send返回-1又称SOCKET_ERROR。我尝试添加一个睡眠函数,因此它会在再次循环之前等待一秒钟,但这使得它只会迭代2次。导致此错误的原因是什么?
#pragma comment(lib, "ws2_32.lib")
#include <iostream>
#include <windows.h>
void main ()
{
int reqVersion = 2;
WSADATA wsaData;
if (WSAStartup(MAKEWORD(reqVersion,0), &wsaData)==0)
{
// Check if major version is at least reqVersion
if (LOBYTE(wsaData.wVersion) >= reqVersion)
{
SOCKADDR_IN addr;
int addrlen = sizeof(addr);
SOCKET sListen;
SOCKET sConnect;
sConnect = socket(AF_INET, SOCK_STREAM, NULL);
addr.sin_addr.s_addr = inet_addr("192.168.0.7");
addr.sin_family = AF_INET;
addr.sin_port = htons(1234);
if(connect(sConnect, (SOCKADDR*)&addr, sizeof(addr)) == 0)
{
char message[10] = "Hellooooo";
for(int i = 0; i <50; i++)
{
int sendOutcome = send(sConnect, message, sizeof(message), 0);
if(sendOutcome == SOCKET_ERROR)
{
std::cout << "Socket Error..." << std::endl;
}
else
{
std::cout << "SENT..." << std::endl;
}
Sleep(1000);
}
}
else
{
std::cout << "Not Connected..." << std::endl;
}
}
else
{
std::cout << "Required version not available..." << std::endl;
}
// Cleanup winsock
if (WSACleanup()!=0)
{
std::cout << "Cleanup failed..." << std::endl;
}
}
else
{
std::cout << "Startup failed..." << std::endl;
}
system("PAUSE");
}
答案 0 :(得分:1)
获取实际错误总是有用的,正如sarnold的评论建议的那样。
通常,检查错误的套接字代码会在通过检查WSAGetLastError()
返回值检测到问题的代码后调用SOCKET_ERROR
。
您从WSAGetLastError()
获取的错误代码很重要,一旦您知道它的含义,您通常可以解决问题。
您可以使用FormatMessage()
显示此错误代码的文本,也可以在WinError.h标头中手动查找。
在这种情况下,10053为WSAECONNABORTED
,错误文本显示“已建立的连接已被主机中的软件中止。”
因此,我认为您连接的服务器由于某种原因正在中止连接。在没有看到服务器源代码的情况下,很难知道为什么会这样。