能够ping通,使用socket connect报错10049

使用socket与另外一台计算机互联,可以ping通,但在调用connect时阻塞二十多秒后返回错误,查了一下报错10049,但ip地址确认了很多遍是对的。

按照意见试了一下发现还是不太行,但这次问题似乎出现在sockaddr_in转sockaddr上面 转为sockaddr后字符串就无效了。我用的是(SOCKADDR*)&sockaddr_in

你socket绑定的端口对面没开放出来,或者被防火墙拦截了。

引用 皆我百晓生 小程序回复内容作答:

错误代码10049表示“无法访问的地址”(WSAEADDRNOTAVAIL)。这通常是由于以下几种原因引起的:

  1. IP 地址不正确:请确保您输入的 IP 地址是正确的。检查您在 connect 函数中传递的目标 IP 地址是否正确,并且没有任何语法错误。

  2. 网络配置问题:如果您在同一网络上能够 ping 通目标计算机,确保目标计算机的网络配置是正确的。检查子网掩码、默认网关等是否正确配置。

  3. 防火墙或安全软件:防火墙或安全软件可能会阻止与目标计算机建立连接。请确认您的防火墙或安全软件是否允许从您的计算机上的应用程序发出连接请求。

如果您确定 IP 地址和网络配置是正确的,并且没有防火墙或安全软件问题,但仍然遇到错误代码10049,您可能需要进一步检查网络设置或与网络管理员联系以获得更多帮助。希望这些信息对您有所帮助!

如果有两台计算机在同一局域网上使用了相同的IP地址,就会发生冲突。
路由配置错误可能导致无法访问指定的IP地址。
目标计算机的网络接口可能被禁用或故障。
然后就是关闭防火墙
检察上面就好

ip能ping通,那么端口号是不是可以telnet 通呢?

参考gpt
错误代码10049表示"无效的地址"
在调用connect函数时,除了指定IP地址外,还需要指定目标计算机上的端口号。
防火墙或网络配置问题:防火墙或其他网络配置可能会阻止您的连接。请确保您的计算机和目标计算机之间没有防火墙或网络配置问题,并且允许您的应用程序建立连接。
权限问题:某些操作系统可能需要管理员权限才能建立某些类型的连接。请确保您的应用程序以管理员权限运行。

【以下回答由 GPT 生成】

根据所提供的信息,出现10049错误的原因可能是以下几种情况:

  1. IP地址确实无效:请再次确认IP地址是否正确,确保没有输入错误或使用了无效的IP地址。可以通过在命令行中输入ipconfigifconfig命令来检查本机的IP地址,并与目标计算机的IP地址进行对比。

  2. 网络连接问题:虽然您可以通过ping命令成功ping通目标计算机,但是在建立socket连接时仍然出现问题。这可能是由于网络中存在其他的防火墙或安全设备,它们可能会阻止socket连接。您可以尝试临时关闭防火墙或安全设备,然后再次尝试建立连接。如果成功连接,则说明问题可能是由于防火墙或安全设备引起的。在这种情况下,您可以配置防火墙或安全设备以允许特定端口或协议上的连接,或者联系网络管理员以获取更多帮助。

  3. 端口被占用:目标计算机上的端口可能已经被其他程序或服务占用,并且无法建立socket连接。您可以尝试更改连接时使用的端口号,或者使用一些工具来查找和释放占用端口的程序或服务。

无论是哪种情况,以下是一些示例代码,可以用于在Python中使用socket连接另一台计算机:

import socket

# 定义目标计算机的IP地址和端口号
target_ip = '192.168.0.100'
target_port = 8080

# 创建socket对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

try:
    # 连接到目标计算机
    client_socket.connect((target_ip, target_port))
    print("连接成功")
except socket.error as e:
    print("连接失败:", e)

# 可选:关闭socket连接
client_socket.close()

请注意,上述示例代码只是一种示例,具体的代码实现可能因您的需求而有所不同。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

先生可以试一下写的demo

#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>

int main() {
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
        perror("WSAStartup failed");
        return 1;
    }

    SOCKET clientSocket;
    clientSocket = socket(AF_INET, SOCK_STREAM, 0);
    if (clientSocket == INVALID_SOCKET) {
        perror("socket creation failed");
        return 1;
    }

    struct sockaddr_in serverAddr;
    serverAddr.sin_family = AF_INET;
    serverAddr.sin_port = htons(80); // Example port, change to your desired port
    serverAddr.sin_addr.s_addr = inet_addr("IP_ADDRESS"); // Replace with the actual IP address

    int connectResult = connect(clientSocket, (struct sockaddr*)&serverAddr, sizeof(serverAddr));
    if (connectResult == SOCKET_ERROR) {
        perror("connect failed");
        closesocket(clientSocket);
        WSACleanup();
        return 1;
    }

    // Now you can send and receive data using clientSocket

    closesocket(clientSocket);
    WSACleanup();
    return 0;
}

最后发现是另外一端防火墙没关,研究了自己代码半天,感觉没问题,没想到最后是这个问题