尝试连接winsock时出现错误10061
Error 10061 when trying to connect with winsock
我有一个客户端和服务器在同一台计算机上运行。客户端通过端口80连接到127.0.0.1。服务器同时正在侦听端口80。
当我启动客户端并尝试连接时,它抛出错误10061(被目标计算机主动拒绝)。我试着关闭我的本地防火墙,但这并没有改变任何事情。我肯定受够了。以下是连接到服务器的代码:
void Base::Connect(string ip, string port)
{
int status;
SOCKET ConnectSocket = INVALID_SOCKET;
struct addrinfo hints;
struct addrinfo *servinfo; // will point to the results
memset(&hints, 0, sizeof hints); // make sure the struct is empty
hints.ai_family = AF_UNSPEC; // don't care IPv4 or IPv6
hints.ai_socktype = SOCK_STREAM; // TCP stream sockets
// get ready to connect
status = getaddrinfo(ip.c_str(), port.c_str(), &hints, &servinfo);
// Socket Setup
if ((ConnectSocket = socket(servinfo->ai_family, servinfo->ai_socktype, servinfo->ai_protocol)) == INVALID_SOCKET)
{
printf("[NETWORKING] An error occured when setting up socketn");
}
// Connect
WSACleanup();
if (connect(ConnectSocket, servinfo->ai_addr, (int)servinfo->ai_addrlen) == SOCKET_ERROR)
{
int error = WSAGetLastError();
printf("Connect error: ", error);
}
}
这是来自监听传入连接的服务器的代码:
int _tmain(int argc, _TCHAR* argv[])
{
// WINDOWS SETUP
WSAData wsaData;
if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
{
fprintf(stderr, "WSAStartup failed.n");
exit(1);
}
// PREPARE TO LAUNCH
int status;
struct sockaddr_storage their_addr;
socklen_t addr_size;
int sockfd, new_fd = 0;
struct addrinfo hints;
struct addrinfo *servinfo; // will point to the results
memset(&hints, 0, sizeof hints); // make sure the struct is empty
hints.ai_family = AF_UNSPEC; // don't care IPv4 or IPv6
hints.ai_socktype = SOCK_STREAM; // TCP stream sockets
hints.ai_flags = AI_PASSIVE; // fill in my IP for me
if ((status = getaddrinfo(NULL, "80", &hints, &servinfo)) != 0)
{
fprintf(stderr, "getaddrinfo error: %sn", gai_strerror(status));
getchar();
exit(1);
}
// GET THE FILE DESCRIPTOR
SOCKET mSocket = INVALID_SOCKET;
mSocket = socket(servinfo->ai_family, servinfo->ai_socktype, servinfo->ai_protocol);
// WHAT PORT AM I ON
bind(mSocket, servinfo->ai_addr, servinfo->ai_addrlen);
int backlog = 2;
listen(mSocket, backlog);
// SERVER STARTED LISTENING SUCCESFULLY
printf("Server is listenening...n");
// ACCEPT
printf("Server starts accepting clients...n");
addr_size = sizeof their_addr;
new_fd = accept(mSocket, (struct sockaddr*)&their_addr, &addr_size);
printf("Server ended");
getchar();
// lose the pesky "Address already in use" error message
char yes='1';
if (setsockopt(mSocket,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) {
perror("setsockopt");
exit(1);
}
return 0;
}
欢迎任何帮助!提前感谢
在客户端:
- 在呼叫CCD_ 2之前不要呼叫
WSACleanup()
- 您没有对
getaddrinfo()
进行任何错误处理 - 您没有将
ai_flags
设置为与您的输入值相匹配(如AI_NUMERICHOST
) - 您没有释放
getaddrinfo()
返回的内存 - 您没有考虑指定
AF_UNSPEC
到getaddrinfo()
,因此它可能会返回多个地址。您应该尝试连接到所有这些,直到其中一个成功为止
试试这个:
void Base::Connect(string ip, string port)
{
int status, error;
SOCKET ConnectSocket = INVALID_SOCKET;
struct addrinfo hints = {0};
struct addrinfo *servinfo; // will point to the results
hints.ai_family = AF_UNSPEC; // don't care IPv4 or IPv6
hints.ai_socktype = SOCK_STREAM; // TCP stream sockets
hints.ai_flags = AI_NUMERICHOST; // parse an IP address
//hints.ai_flags |= AI_NUMERICSERV; // parse a port number (not supported on Windows)
// get ready to connect
status = getaddrinfo(ip.c_str(), port.c_str(), &hints, &servinfo);
if (status != 0)
{
printf("getaddrinfo error: (%d) %sn", status, gai_strerror(status));
return;
}
addrinfo *addr = servinfo;
do
{
// Socket Setup
ConnectSocket = socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);
if (ConnectSocket == INVALID_SOCKET)
{
printf("socket error: %dn", WSAGetLastError());
}
else
{
// Connect
if (connect(ConnectSocket, addr->ai_addr, addr->ai_addrlen) != SOCKET_ERROR)
{
printf("connected to servern");
break;
}
printf("connect error: %dn", WSAGetLastError());
closesocket(ConnectSocket);
ConnectSocket = INVALID_SOCKET;
}
addr = addr->ai_next;
}
while (addr != NULL);
freeaddrinfo(servinfo);
if (ConnectSocket == INVALID_SOCKET)
printf("unable to connect to servern");
}
在服务器端:
- 您没有对
socket()
、bind()
或listen()
进行任何错误处理 - 调用
bind()
之前必须启用SO_REUSEADDR
,而不是之后。而且你甚至没有正确地启用它 - 您没有释放
getaddrinfo()
返回的内存
试试这个:
int _tmain(int argc, _TCHAR* argv[])
{
// WINDOWS SETUP
WSAData wsaData;
if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
{
fprintf(stderr, "WSAStartup failed.n");
exit(1);
}
// PREPARE TO LAUNCH
int status;
struct sockaddr_storage their_addr;
socklen_t addr_size;
SOCKET client;
struct addrinfo hints = {0};
struct addrinfo *servinfo; // will point to the results
hints.ai_family = AF_UNSPEC; // don't care IPv4 or IPv6
hints.ai_socktype = SOCK_STREAM; // TCP stream sockets
hints.ai_flags = AI_PASSIVE; // fill in my IP for me
//hints.ai_flags |= AI_NUMERICSERV; // parse a port number (not supported on Windows)
status = getaddrinfo(NULL, "80", &hints, &servinfo);
if (status != 0)
{
fprintf(stderr, "getaddrinfo error: (%d) %sn", status, gai_strerror(status));
getchar();
exit(1);
}
// optional, loop through servinfo creating a separate
// listening socket for each address reported...
// GET THE FILE DESCRIPTOR
SOCKET mSocket = socket(servinfo->ai_family, servinfo->ai_socktype, servinfo->ai_protocol);
if (mSocket == INVALID_SOCKET)
{
fprintf(stderr, "socket error: %dn", WSAGetLastError());
freeaddrinfo(servinfo);
closesocket(mSocket);
getchar();
exit(1);
}
// lose the pesky "Address already in use" error message
BOOL yes = TRUE;
if (setsockopt(mSocket, SOL_SOCKET, SO_REUSEADDR, (char*)&yes, sizeof(yes)) == SOCKET_ERROR)
{
fprintf(stderr, "setsockopt error: %dn", WSAGetLastError());
freeaddrinfo(servinfo);
closesocket(mSocket);
getchar();
exit(1);
}
// WHAT PORT AM I ON
if (bind(mSocket, servinfo->ai_addr, servinfo->ai_addrlen) == SOCKET_ERROR)
{
fprintf(stderr, "bind error: %dn", WSAGetLastError());
freeaddrinfo(servinfo);
closesocket(mSocket);
getchar();
exit(1);
}
freeaddrinfo(servinfo);
int backlog = 2;
if (listen(mSocket, backlog) == SOCKET_ERROR)
{
fprintf(stderr, "listen error: %dn", WSAGetLastError());
closesocket(mSocket);
getchar();
exit(1);
}
// SERVER STARTED LISTENING SUCCESFULLY
printf("Server is listening...n");
// ACCEPT
addr_size = sizeof their_addr;
client = accept(mSocket, (struct sockaddr*)&their_addr, &addr_size);
if (client == INVALID_SOCKET)
{
fprintf(stderr, "accept error: %dn", WSAGetLastError());
}
else
{
char ip[NI_MAXHOST] = {0};
char port[NI_MAXSERV] = {0};
status = getnameinfo((struct sockaddr*)&their_addr, addr_size, ip, NI_MAXHOST, port, NI_MAXSERV, NI_NUMERICHOST | NI_NUMERICSERV);
if (status == 0)
printf("Client connected from %s:%sn", ip, port);
else
printf("Client connected. getnameinfo error: (%d) %sn", status, gai_strerror(status));
//...
closesocket(client);
}
closesocket(mSocket);
printf("Server ended");
getchar();
return 0;
}
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 尝试连接winsock时出现错误10061