【发布时间】:2016-02-17 23:29:00
【问题描述】:
我正在使用 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 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,如代码中所述。
有人对可能导致问题的原因有任何想法吗?
【问题讨论】:
-
client_connection.sin_addr.S_un.S_addr = (unsigned long)("0.0.0.0");将字符串转换为unsigned long没有意义。 -
大卫是对的。您必须改用
inet_addr("0.0.0.0")或等效项。 -
如果前面的 Winsock 调用返回 -1,您应该只检查
WSAGetLastError()。
标签: c++ sockets networking winsock