C++ winsock服务器端客户端远程连接
问题描述:
我想创建一个简单的应用程序,它在两台远程计算机之间交换消息。 “127.0.0.1”ip工作正常,等待客户端确认并连接到客户端,但如果我尝试使用同一端口的本地“192.168.0.15”或全局IP,服务器立即连接到无需等待客户。C++ winsock服务器端客户端远程连接
这里是我的服务器代码的一部分:
char ip[20] = "127.0.0.1"; int port = 19385;
SOCKET sockListen, sockConnect;
SOCKADDR_IN address;
sockConnect = socket (AF_INET, SOCK_STREAM, NULL);
address.sin_addr.s_addr = inet_addr (ip);
address.sin_family = AF_INET;
address.sin_port = htons (port);
sockListen = socket (AF_INET, SOCK_STREAM, NULL);
bind (sockListen, (SOCKADDR*)&address, AddressSize);
listen (sockListen, SOMAXCONN);
sockConnect = accept (sockListen, (SOCKADDR*)&address, &AddressSize);
...
请建议如何解决这个问题。 thx
答
在致电accept()
之前,您不应该初始化您的sockConnect
变量socket()
。 accept()
返回一个新的分配的套接字句柄已经连接到客户端。您正在泄漏socket()
分配的套筒手柄。
您只能将bind()
设置为属于运行该应用程序的本地计算机的NIC的IP。您无法将bind()
转换为外部IP。
您显示的代码根本没有执行任何错误处理。你需要补充的是,例如:
int errCode;
SOCKET sockListen = socket (AF_INET, SOCK_STREAM, NULL);
if (sockListen == INVALID_SOCKET)
{
errCode = WSAGetLastError();
// ...
}
else
{
SOCKADDR_IN address = {0};
address.sin_addr.s_addr = inet_addr (ip);
address.sin_family = AF_INET;
address.sin_port = htons (port);
if (bind (sockListen, (SOCKADDR*)&address, sizeof(address)) == SOCKET_ERROR)
{
errCode = WSAGetLastError();
// ...
}
else
{
if (listen (sockListen, SOMAXCONN) == SOCKET_ERROR)
{
errCode = WSAGetLastError();
// ...
}
else
{
int addressSize;
SOCKET sockClient = accept (sockListen, (SOCKADDR*)&address, &addressSize);
if (sockClient == INVALID_SOCKET)
{
errCode = WSAGetLastError();
// ...
}
else
{
// ...
closesocket(sockClient);
}
}
}
closesocket(sockListen);
}
你为什么不尝试使用boost.Asio。你会为自己节省很多头痛。 – Caesar 2012-08-08 15:54:44
不应该'sockConnect = socket(AF_INET,SOCK_STREAM,NULL);'初始化'sockListen'而不是'sockClient'? – Jaywalker 2012-08-08 16:14:08
sockListen也在下面初始化。订单没关系 – user1585185 2012-08-08 16:23:19