【问题标题】:Problem connecting a linux server and windows client with sockets使用套接字连接 linux 服务器和 windows 客户端的问题
【发布时间】:2011-05-18 18:15:23
【问题描述】:

大家好 我正在尝试了解有关套接字以及如何使用它们的更多信息,但我已经被困在一个问题上一段时间了。

我从 Beej 的网络编程指南开始,并在我正在使用的 linux (Fedora 14) 机器上从 this page 制作了谈话者和听众。它有效,我可以让它互相交谈。

然后我继续使用 Windows (7) 并使用 this 教程并启动并运行它,并且可以在 Windows 机器上向自己发送消息。我真正拥有的唯一变化是我使用的是 getHostbyAddr 而不是名称。

当我将两者粘合在一起时,我开始遇到问题,或者说现在是一个问题。我在 linux 机器上运行 Beej 的监听器,我尝试让 Johnnie 的客户端向它发送消息。我在 Windows 机器上收到了一个 winsock 错误 10061,并且在 linux 上什么也没有出现(不足为奇)。我已经用 linux 上的防火墙对此进行了测试,但仍然出现该错误。

我能做些什么来解决这个问题?

谢谢

已编辑以添加更多信息:

当我运行 tcpdump 时,我得到了这个

[root@localhost ~]# tcpdump tcp port 4950
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:08:56.246753 IP TLARGE.WIFI.schoolname.EDU.62394 > hmd46.cs.schoolname.edu.sybasesrvmon: Flags [S], seq 150153995, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
12:08:56.246794 IP hmd46.cs.schoolname.edu.sybasesrvmon > TLARGE.WIFI.schoolname.EDU.62394: Flags [R.], seq 0, ack 150153996, win 0, length 0
12:08:56.746170 IP TLARGE.WIFI.schoolname.EDU.62394 > hmd46.cs.schoolname.edu.sybasesrvmon: Flags [S], seq 150153995, win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0
12:08:56.746221 IP hmd46.cs.schoolname.edu.sybasesrvmon > TLARGE.WIFI.schoolname.EDU.62394: Flags [R.], seq 0, ack 1, win 0, length 0
12:08:57.246138 IP TLARGE.WIFI.schoolname.EDU.62394 > hmd46.cs.schoolname.edu.sybasesrvmon: Flags [S], seq 150153995, win 8192, options [mss 1460,nop,nop,sackOK], length 0
12:08:57.246185 IP hmd46.cs.schoolname.edu.sybasesrvmon > TONJELARGE.WIFI.schoolname.EDU.62394: Flags [R.], seq 0, ack 1, win 0, length 0
^C
6 packets captured
6 packets received by filter
0 packets dropped by kernel

运行 netstat 给了我这个:

[root@localhost ~]# netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State      PID/Program name   
tcp        0      0 0.0.0.0:58661               0.0.0.0:*                   LISTEN      1083/rpc.statd      
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1013/rpcbind        
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1265/sshd           
tcp        0      0 127.0.0.1:631               0.0.0.0:*                   LISTEN      1148/cupsd          
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1554/sendmail: acce
tcp        0      0 :::56315                    :::*                        LISTEN      1083/rpc.statd      
tcp        0      0 :::111                      :::*                        LISTEN      1013/rpcbind        
tcp        0      0 :::22                       :::*                        LISTEN      1265/sshd            
tcp        0      0 ::1:631                     :::*                        LISTEN      1148/cupsd     

这两个都来自linux机器

【问题讨论】:

  • 您使用哪些端口?您确定防火墙没有在 Linux 端阻止?
  • 我使用的是 4950(只是基于 Beej 代码中的内容。)我只是关闭了防火墙并再次尝试,然后得到了同样的错误(使用 / etc/init.d/iptables 保存/停止命令)。

标签: windows linux sockets


【解决方案1】:

错误10061 表示WSAECONNREFUSED。在您发布的链接中,我看到客户端正在使用端口 80。您确定将其修改为 4950 吗?

肯定有东西通过服务器,否则它不会向你发送“我不喜欢你”RST(这就是连接被拒绝的意思:它不仅拒绝你的连接,更侮辱你它告诉你的伤害)。

编辑 1

netstat 输出看来,4950 似乎没有人在收听。

编辑 2

我终于让自己阅读了那些 beej 的东西(老实说,我一直认为他的教程最糟糕)。这没有引起任何警报吗?你正在创建一个 udp 套接字,这就是为什么没有人在 TCP 4950 中监听,这就是你无法连接的原因。

hints.ai_socktype = SOCK_DGRAM;

你有两个选择:

  • 在 windows 端使用 UDP 套接字
  • 将服务器端的代码更改为使用TCP

目前的服务器代码不适合TCPrecvfrom 和所有这些东西),但应该很容易适应)。

【讨论】:

  • 是的,我确定我做到了(这也是我在 Windows 机器上使用的东西,它正在工作)
  • @CraftyViking 好的,只是为了确保。到 linux 盒子前说tcpdump tcp port 4950。然后连接到服务器,看看会发生什么。
  • 好的,所以我试过了,tcpdump 上显示了一些东西,但侦听器上仍然没有。
  • @CraftyViking 编辑您的问题并粘贴 tcpdump 显示的内容。还要粘贴 netstat -tlnp 在启动服务器后显示的内容。
  • @CraftyViking 似乎没有进程在该端口上监听
猜你喜欢
  • 2021-03-31
  • 2016-12-21
  • 2015-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
相关资源
最近更新 更多