两个套接字无法相互连接 (C++)
Two sockets won't connect to one another (C++)
我正在使用C++网络,并且几乎编写了我的第一个程序,由服务器和相互连接的客户端组成。这是我的代码-
服务器.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 WSAn", 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 socketn", WSAGetLastError());
pause();
return 1;
}
bind(uc_socket, (SOCKADDR *)&ADDRESS, AddressSize);
if (WSAGetLastError() != 0)
{
printf("Error %d while binding socketn", WSAGetLastError());
pause();
return 1;
}
listen(uc_socket, 12);
if (WSAGetLastError() != 0)
{
printf("Error %d while binding socketn", 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;
}
客户端.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 WSAn", 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 socketn", 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 socketn", 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
,其中包括127.0.0.1
。
此外,这些语句在客户端是错误的:
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()
和 accept()
的返回值INVALID_SOCKET
、bind()
、listen()
的返回值和 SOCKET_ERROR
的 connect()
(为 -1,而不是 0)等。 connect()
可能失败了,并且您没有正确检测到错误,因此当它真正失败时,您认为它成功了。
相关文章:
- 当套接字连接断开时检测C/C++Unix
- 无法在windows上使用mingw将sqlite3与c连接
- 到连接组件算法的问题(递归)
- QTcpSocket在不阻塞GUI的情况下重新连接到服务器
- 无法在C++中建立与MySQL数据库的连接
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 在Qt Creator中,如何在连接到正在运行的进程后查看控制台输出
- 连接 dockerized 模型和 dockerized 数据库时出现"无法 SQLConnect"错误
- 使用 bfs 解决连接组件问题时得到错误的答案
- 在C++的两个字符串中连接以逗号分隔的唯一值
- 如何修复valgrind启动时的致命错误(与libc6-dbg和libc6-dbg:i386连接)
- C++应用程序 MySQL odbc 数据库连接错误:在引发"otl_tmpl_exception<>"实例后终止调用
- OSX蓝牙打开RFCOMMChannelAsync声称已连接,但未建立连接,并且从未调用过委托
- 在 libcurl 连接池中预创建连接
- 套接字连接"Operation not permitted"错误,甚至使用升压/平发器根.cpp
- libcurl 和 DNS ttl 中的内部连接管理
- 如何应用 libcurl 的持久连接选项
- 提升 ASIO - io_service 不要等待连接到线程
- WinSock2:connect() 提供"连接被拒绝"
- 升压信号2将插槽传递到成员功能以断开连接