【发布时间】:2011-06-14 06:54:27
【问题描述】:
在连接到我的网络上的设备时遇到问题。每当我调用 getaddrinfo() 时,它都会返回 11001。我用 IP_ADDRESS 字符串(全局变量)中的许多不同 IP 对此进行了检查。我用 nslookup 检查了所有无效的数字,大部分都存在。
getaddrinfo-returns-always-11001-host-not-found 似乎在问类似的问题,但那里没有答案。
目前,我的代码甚至没有尝试连接到远程设备,只是尝试解析 IP。一旦成功,我就可以继续解决更大更混乱的问题。
实施:
int connectToDevice(char *sendbuf, char *recvbuf, SOCKET ConnectSocket)
{
WSADATA wsaData;
struct addrinfo *result = NULL,
*ptr = NULL,
hints;
struct timeval tval;
fd_set rset, wset;
int iResult;
u_long mode = -1;
//Initialize Winsock
iResult = WSAStartup(MAKEWORD(2,2), &wsaData);
if (iResult != 0)
{
printf("WSAStartup failed with error: %d\n", iResult);
return 1;
}
ZeroMemory( &hints, sizeof(hints) );
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
//Resolve the server address and port
iResult = getaddrinfo(IP_ADDRESS, DEFAULT_PORT, &hints, &result);
if ( iResult != 0 )
{
printf("getaddrinfo failed with error: %d\n", iResult);
WSACleanup();
return 1;
}
// Attempt to connect to an address until one succeeds
for(ptr=result; ptr != NULL ;ptr=ptr->ai_next)
{
// Create a SOCKET for connecting to server
ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);
if (ConnectSocket == INVALID_SOCKET)
{
printf("socket failed with error: %ld\n", WSAGetLastError());
WSACleanup();
return 1;
}
//set socket to non-blocking
iResult = ioctlsocket(ConnectSocket, FIONBIO, &mode); //if mode is set to non-zero, socket set to non-blocking.
if(iResult != NO_ERROR)
{
printf("socket failed with error: %ld\n", WSAGetLastError());
WSACleanup();
return 1;
}
// Connect to server.
iResult = connect( ConnectSocket, ptr->ai_addr, (int)ptr->ai_addrlen);
if (iResult == SOCKET_ERROR ) //if an error and not WSAEWOULDBLOCK, then close socket and try next address
{
if(WSAEWOULDBLOCK != WSAGetLastError())
{
closesocket(ConnectSocket);
ConnectSocket = INVALID_SOCKET;
continue; //this returns control to the For loop. I.e. if a socket error, try next address
}
else //otherwise if the error was WSAEWOULDBLOCK, then use select to check for connections.
{
FD_ZERO(&rset); //initialise fd_sets for reading and writing; both the same.
FD_SET(ConnectSocket, &rset);
wset = rset;
//set tval to timeout value
tval.tv_sec = TIMEOUT;
tval.tv_usec= 0;
//select statement
//select ignores first parameter
//select takes 3xfd_sets, read set, write set, and exception set.
//select's last parameter is timeout in the form of a timeval struct
//if return == 0, timeout occured.
//if return == SOCKET_ERROR, error occured, use WSAGetLastError to check for details.
iResult = select(ConnectSocket, &rset, &wset, NULL, &tval);
if (iResult ==0)
{
closesocket(ConnectSocket);
printf("Timeout reached, closing socket");
WSACleanup();
return 1;
}
else if(iResult == SOCKET_ERROR)
{
printf("socket failed with error: %ld\n", WSAGetLastError());
WSACleanup();
return 1;
}
}
}
break; //Breaks out of the for loop. Will only occur if continue not executed
}
freeaddrinfo(result);
if (ConnectSocket == INVALID_SOCKET)
{
printf("Unable to connect to server!\n");
WSACleanup();
return 1;
}
return 0;}
大部分代码已从 msdn 网站上锁定和库存,但看起来一切正常。
【问题讨论】:
-
IP_ADDRESS 已被各种设置为:服务器(本地服务器名称)192.168.1.1(服务器 IP)127.0.0.1 192.168.1.66(设备 IP)192.168.1.120(我的电脑)
-
如果你给它一个主机名,它是否可以工作,比如
localhost? -
@romkyns,不,它仍然返回 11001,我已经使用本地服务器名称和 localhost 对其进行了测试
-
我遇到了完全相同的问题。对此有何解决方案?
-
您找到解决方案了吗?
标签: c++ c windows sockets winsock2