两个套接字不会相互连接 (C++)
Two sockets won't connect to one another (C++)
我正在使用 C++ 网络,并且几乎编写了我的第一个程序,该程序由相互连接的服务器和客户端组成。这是我的代码-
server.cpp
#include "stdafx.h"
using namespace std;
int main()
{
int wsasuccessful;
WSAData WinSockData;
WORD DLLVERSION;
DLLVERSION = MAKEWORD(2, 1);
wsasuccessful = WSAStartup(DLLVERSION, &WinSockData);
if (wsasuccessful != 0)
{
printf("Error %d while starting WSA\n", wsasuccessful);
pause();
return 1;
}
SOCKADDR_IN ADDRESS;
int AddressSize = sizeof(ADDRESS);
SOCKET uc_socket;
uc_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
ADDRESS.sin_addr.s_addr = INADDR_ANY;
ADDRESS.sin_family = AF_INET;
ADDRESS.sin_port = htons(444);
if (WSAGetLastError() != 0)
{
printf("Error %d while establishing socket\n", WSAGetLastError());
pause();
return 1;
}
bind(uc_socket, (SOCKADDR *)&ADDRESS, AddressSize);
if (WSAGetLastError() != 0)
{
printf("Error %d while binding socket\n", WSAGetLastError());
pause();
return 1;
}
listen(uc_socket, 12);
if (WSAGetLastError() != 0)
{
printf("Error %d while binding socket\n", WSAGetLastError());
pause();
return 1;
}
SOCKET c_socket;
SOCKADDR client_sock;
int client_sock_size = sizeof(client_sock);
printf("Socket created; Set to listen for incoming connections");
c_socket = accept(uc_socket, (SOCKADDR *)&client_sock, &client_sock_size);
printf("Connection found!");
pause();
return 0;
}
client.cpp
#include "stdafx.h"
using namespace std;
int main()
{
int wsasuccessful = -1;
WSAData WinSockData;
WORD DLLVERSION;
DLLVERSION = MAKEWORD(2, 1);
wsasuccessful = WSAStartup(DLLVERSION, &WinSockData);
if (wsasuccessful != 0)
{
printf("Error %d in client while starting WSA\n", WSAGetLastError());
pause();
return 1;
}
SOCKET client_socket;
client_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (WSAGetLastError() != 0)
{
printf("Error %d in client while instantiating socket\n", WSAGetLastError());
pause();
return 1;
}
SOCKADDR_IN client_connection;
client_connection.sin_family = AF_INET;
client_connection.sin_port = (USHORT)(444);
client_connection.sin_addr.S_un.S_addr = (unsigned long)("0.0.0.0");
int connection_success = -1;
printf("Connection started!");
connection_success = connect(client_socket, (SOCKADDR *)&client_connection, sizeof(client_connection));
if (connection_success != 0)
{
printf("Error %d in client while instantiating socket\n", WSAGetLastError());
pause();
return 2;
}
printf("The client has found a server!");
printf("The last WSA error was: %d", WSAGetLastError());
pause();
return 0;
}
多次检查后我没有看到任何错误,但是在启动两者后我没有建立连接(当然是服务器优先)
我已经设置了防火墙以允许连接到网络
两个二进制文件卡在了监听(当然)和连接上。分别为服务器和客户端。
我检查了正在使用的端口和关联的 PID (netstat -a -o),果然,服务器正在侦听端口 444,如代码中所述。
是否有人对可能导致此问题的原因有任何想法?
0.0.0.0
(又名 INADDR_ANY
)不是客户端 connect()
的有效 IP 地址。如果服务器和客户端 运行 在同一台机器上,您可以使用 127.0.0.1
(又名 INADDR_LOOPBACK
),因为您的服务器绑定到 INADDR_ANY
,其中包括 [=15] =].
此外,这些陈述在客户端是错误的:
client_connection.sin_port = (USHORT)(444);
client_connection.sin_addr.S_un.S_addr = (unsigned long)("0.0.0.0");
您需要使用 inet_addr()
(或等效的)将 IP 地址从字符串格式转换为二进制格式。你需要使用 htons()
来代替,就像你在服务器端做的那样:
client_connection.sin_port = htons(444);
client_connection.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
此外,您的错误处理总体上是错误的。不要调用 WSAGetLastError()
除非实际上首先报告了错误。这意味着检查 socket()
的 return 值和 INVALID_SOCKET
的 accept()
,bind()
、listen()
的 return 值,以及connect()
for SOCKET_ERROR
(-1,不是 0)等。 connect()
可能会失败,而您没有正确检测到错误,所以当它真的失败时您认为它成功了。
我正在使用 C++ 网络,并且几乎编写了我的第一个程序,该程序由相互连接的服务器和客户端组成。这是我的代码-
server.cpp
#include "stdafx.h"
using namespace std;
int main()
{
int wsasuccessful;
WSAData WinSockData;
WORD DLLVERSION;
DLLVERSION = MAKEWORD(2, 1);
wsasuccessful = WSAStartup(DLLVERSION, &WinSockData);
if (wsasuccessful != 0)
{
printf("Error %d while starting WSA\n", wsasuccessful);
pause();
return 1;
}
SOCKADDR_IN ADDRESS;
int AddressSize = sizeof(ADDRESS);
SOCKET uc_socket;
uc_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
ADDRESS.sin_addr.s_addr = INADDR_ANY;
ADDRESS.sin_family = AF_INET;
ADDRESS.sin_port = htons(444);
if (WSAGetLastError() != 0)
{
printf("Error %d while establishing socket\n", WSAGetLastError());
pause();
return 1;
}
bind(uc_socket, (SOCKADDR *)&ADDRESS, AddressSize);
if (WSAGetLastError() != 0)
{
printf("Error %d while binding socket\n", WSAGetLastError());
pause();
return 1;
}
listen(uc_socket, 12);
if (WSAGetLastError() != 0)
{
printf("Error %d while binding socket\n", WSAGetLastError());
pause();
return 1;
}
SOCKET c_socket;
SOCKADDR client_sock;
int client_sock_size = sizeof(client_sock);
printf("Socket created; Set to listen for incoming connections");
c_socket = accept(uc_socket, (SOCKADDR *)&client_sock, &client_sock_size);
printf("Connection found!");
pause();
return 0;
}
client.cpp
#include "stdafx.h"
using namespace std;
int main()
{
int wsasuccessful = -1;
WSAData WinSockData;
WORD DLLVERSION;
DLLVERSION = MAKEWORD(2, 1);
wsasuccessful = WSAStartup(DLLVERSION, &WinSockData);
if (wsasuccessful != 0)
{
printf("Error %d in client while starting WSA\n", WSAGetLastError());
pause();
return 1;
}
SOCKET client_socket;
client_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (WSAGetLastError() != 0)
{
printf("Error %d in client while instantiating socket\n", WSAGetLastError());
pause();
return 1;
}
SOCKADDR_IN client_connection;
client_connection.sin_family = AF_INET;
client_connection.sin_port = (USHORT)(444);
client_connection.sin_addr.S_un.S_addr = (unsigned long)("0.0.0.0");
int connection_success = -1;
printf("Connection started!");
connection_success = connect(client_socket, (SOCKADDR *)&client_connection, sizeof(client_connection));
if (connection_success != 0)
{
printf("Error %d in client while instantiating socket\n", WSAGetLastError());
pause();
return 2;
}
printf("The client has found a server!");
printf("The last WSA error was: %d", WSAGetLastError());
pause();
return 0;
}
多次检查后我没有看到任何错误,但是在启动两者后我没有建立连接(当然是服务器优先)
我已经设置了防火墙以允许连接到网络
两个二进制文件卡在了监听(当然)和连接上。分别为服务器和客户端。
我检查了正在使用的端口和关联的 PID (netstat -a -o),果然,服务器正在侦听端口 444,如代码中所述。
是否有人对可能导致此问题的原因有任何想法?
0.0.0.0
(又名 INADDR_ANY
)不是客户端 connect()
的有效 IP 地址。如果服务器和客户端 运行 在同一台机器上,您可以使用 127.0.0.1
(又名 INADDR_LOOPBACK
),因为您的服务器绑定到 INADDR_ANY
,其中包括 [=15] =].
此外,这些陈述在客户端是错误的:
client_connection.sin_port = (USHORT)(444);
client_connection.sin_addr.S_un.S_addr = (unsigned long)("0.0.0.0");
您需要使用 inet_addr()
(或等效的)将 IP 地址从字符串格式转换为二进制格式。你需要使用 htons()
来代替,就像你在服务器端做的那样:
client_connection.sin_port = htons(444);
client_connection.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
此外,您的错误处理总体上是错误的。不要调用 WSAGetLastError()
除非实际上首先报告了错误。这意味着检查 socket()
的 return 值和 INVALID_SOCKET
的 accept()
,bind()
、listen()
的 return 值,以及connect()
for SOCKET_ERROR
(-1,不是 0)等。 connect()
可能会失败,而您没有正确检测到错误,所以当它真的失败时您认为它成功了。