【发布时间】:2012-02-16 08:37:15
【问题描述】:
我写了两个函数,它们应该启动一个 TCP-Server/Client。如果我用 IP“127.0.0.1”(仅用于测试)调用它们,那么一切正常。但是,如果我使用计算机的公共 IP 呼叫他们,我会遇到连接超时。有人知道可能是什么问题吗?
这里是代码:
服务器:
bool fSTARTED = false;
struct timeval tv;
TCP_StartServer (const int iPort, SOCKET *iSOCKET)
{
WSADATA wsa;
SOCKET iSOCKETListen;
SOCKADDR_IN tAdr;
if(!fSTARTED)
{
if(WSAStartup(MAKEWORD(2,2), &wsa))
{
*iSOCKET = -1;
return;
}
tv.tv_sec = 5;
tv.tv_usec = 0;
fSTARTED = true;
}
iSOCKETListen = socket(AF_INET, SOCK_STREAM, 0);
memset(&tAdr, 0, sizeof(SOCKADDR_IN));
tAdr.sin_family = AF_INET;
tAdr.sin_port = htons(iPort);
tAdr.sin_addr.s_addr = htonl(INADDR_ANY);
if(bind(iSOCKETListen, (SOCKADDR*) & tAdr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
{
*iSOCKET = 0 - WSAGetLastError();
return;
}
if(listen(iSOCKETListen, SOMAXCONN) == SOCKET_ERROR)
{
*iSOCKET = 0 - WSAGetLastError();
return;
}
*iSOCKET = accept(iSOCKETListen, NULL, NULL);
if(*iSOCKET == INVALID_SOCKET)
{
*iSOCKET = 0 - WSAGetLastError();
return;
}
return;
}
客户:
TCP_StartClient (char *sIP, const int iPort, SOCKET *iSOCKET)
{
WSADATA wsa;
SOCKADDR_IN tAdr;
if(!fSTARTED)
{
if(WSAStartup(MAKEWORD(2,2), &wsa))
{
*iSOCKET = -2;
return;
}
tv.tv_sec = 5;
tv.tv_usec = 0;
fSTARTED = true;
}
*iSOCKET = socket(AF_INET, SOCK_STREAM, 0);
if(*iSOCKET == INVALID_SOCKET)
{
*iSOCKET = 0 - WSAGetLastError();
return;
}
memset(&tAdr, 0, sizeof(SOCKADDR_IN));
tAdr.sin_family = AF_INET;
tAdr.sin_port = htons(iPort);
tAdr.sin_addr.s_addr = inet_addr(sIP);
if(connect(*iSOCKET, (SOCKADDR*) &tAdr, sizeof(SOCKADDR)) == SOCKET_ERROR)
{
*iSOCKET = 0 - WSAGetLastError();
return;
}
return;
}
【问题讨论】:
-
如果超时,
StartClient中的sIParg 的值是多少? -
你打开对应的端口了吗?
-
取决于操作系统(Windows 2008、Windows 7 等),您可以配置防火墙来防止这种情况...
-
@Yahia 我猜是 Windows,因为
WSADATA。 -
@VictorSorokin 我同意,但这并不能告诉我们 Windows 版本,而且并非所有 Windows 版本都带有内置防火墙...