【问题标题】:Minimal TCP client-server: accept() never receives a connection?最小的 TCP 客户端-服务器:accept() 从不接收连接?
【发布时间】:2020-01-03 12:52:31
【问题描述】:

我从http://cs.ecs.baylor.edu/~donahoo/practical/CSockets/winsock.html 复制了 TCP/IP Sockets in C 一书的示例代码,并在 MinGW 上编译(通过将 clntLen 从 unsigned int 更改为 int 并将 void main 更改为int main)。

$ gcc.exe -Wall -o TCPEchoServerWS TCPEchoServerWS.c HandleTCPClientWS.c DieWithErrorWS.c -lws2_32
$ gcc.exe -o TCPEchoClientWS TCPEchoClientWS.c DieWithErrorWS.c -lws2_32

当我运行可执行文件时,服务器而不是客户端会触发 Windows 防火墙通知。

$ ./TCPEchoServerWS.exe 5000
inside for loop
$ ./TCPEchoClientWS.exe  169.1.1.1 "Echo this" 5000
connect() failed: 10060

从printf调试

    for (;;) /* Run forever */
    {
        printf("inside for loop");
        clntLen = sizeof(echoClntAddr);
        if ((clntSock = accept(servSock, (struct sockaddr *) &echoClntAddr, &clntLen)) < 0)
            DieWithError("accept() failed");
        printf("Handling client %s\n", inet_ntoa(echoClntAddr.sin_addr));

accept() 似乎永远不会返回。我认为这是因为它从来没有连接提取?请问有什么想法吗?我也试过用-lwsock32链接,禁用windows防火墙。

【问题讨论】:

  • "当我运行可执行文件时,服务器而不是客户端会触发 Windows 防火墙通知" - 应该如此。默认情况下,防火墙更关注入站连接而不是出站连接,因此它通常会阻止服务器,但很少会阻止客户端,除非另有配置。您是否告诉防火墙允许服务器尝试侦听的端口? Winsock 错误 10060 是 WSAETIMEDOUT,这很好地表明 connect() 甚至没有到达服务器,如果防火墙阻止了连接,就会出现这种情况。
  • @Remy Lebeau 我曾尝试禁用防火墙,并且刚刚添加了一个无效的入站规则。当我 netstat -a 服务器显示为 TCP 0.0.0.0:5000 DESKTOP---------- LISTENING 时,我尝试了 $ ./TCPEchoClientWS.exe 0.0.0.0 "Echo this" 5000 connect() 失败: 10049
  • 错误 10049 是 WSAEADDRNOTAVAIL0.0.0.0IPv4 通配符 IP。你可以bind()一个IPv4套接字到它,即绑定一个服务器来监听所有本地IPv4地址,但是一个IPv4客户端不能connect()到它,只能到一个真正的IPv4地址。当服务器绑定到特定 IP 时,客户端必须 connect() 到该特定 IP(或端口转发到它的 IP,例如路由器的 WAN IP)。当服务器绑定到通配符 IP 时,客户端可以connect() 到属于服务器机器的任何 IP(或任何端口转发到它的 IP)。在服务器上使用ipconfig 查看其本地IP。
  • 感谢@RemyLebeau 教我。在尝试了从ipconfig 获得的所有地址之后,我尝试了 127.0.0.1,它成功了。
  • 证明你的客户端一般可以连接到你的服务器。如果您仍然无法连接到本地主机之外的服务器,那么您显然有网络路由问题,而不是编码问题

标签: sockets tcp mingw winsock


【解决方案1】:

原来我使用了错误的IP(我只是从书上的命令中复制了一个)。

我只需要按照 Remy 的建议使用来自 ipconfig 的 IPv4 地址。

【讨论】:

    猜你喜欢
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 2022-01-16
    • 2021-11-06
    • 2019-06-06
    • 1970-01-01
    相关资源
    最近更新 更多