我是一个使用OpenSuse 12.2的项目的noob程序员,我遇到了一个奇怪的连接行为,我编写了一个简单的bsd套接字服务器程序。我很确定这个问题与Yast2中的网络设置有关,因为当我打开/关闭某些设置时问题似乎消失了。希望有人可以帮我指导这个模糊的雾! :d
基本上,本地网络中有一台旧的Windows NT客户端计算机尝试连接并将数据包发送到服务器计算机上的几个端口,现在正在替换并更新到运行OpenSuse Linux的新计算机。我有一个简单的服务器程序,使用BSD套接字设置来侦听这些端口。客户端和服务器通过以太网路由器相互连接。
我启动服务器并等待连接...但是当我启动客户端计算机并尝试建立与服务器的连接时,我的服务器程序没有任何变化(它应该接受连接并打印关于它正在接收的所有消息的各种消息)。奇怪的是,如果我在服务器计算机上更改以下网络设置,可以获得预期的行为:
1)让客户端和服务器保持运行
2)打开Yast2
3)转到网络设置,单击以编辑相关的以太网卡
4)在常规选项卡下更改激活设备设置从“在引导时”到“在线连接”
5)接受更改,退出Yast2。
6)再次执行上述所有步骤,除了重置激活设备回到“启动时”
7)接受更改,退出Yast2。
8)突然,服务器程序接受来自客户端的连接并开始打印出消息! :o
我很高兴看到服务器代码工作正常,但我对网络连接行为感到困惑。我想也许更改/重置设置会以某种方式迫使系统识别传入连接,或更新相关以太网卡上的某些配置,但我真的不知道。
我是OpenSuse Linux的新手,没有配置网络设置的经验。有谁知道是什么原因引起了这个问题,或者对我能做些什么做出任何想法来弄清楚为什么它不是简单的连接,为什么摆弄网络设置会让它发生?我目前的目标是获得平滑的连接,而无需在服务器计算机上不断设置/重置网络设置以实现目标。谢谢!
更新1: @selbie:我会发布服务器代码,但我认为这可能会让我的工作遇到麻烦。就像我之前说过的那样,它是一个非常基本的bsd套接字服务器。我基本上为三个端口构建套接字,将每个套接字设置为侦听,将它们添加到FD_SET,然后无限循环,进行select调用以查看是否已准备好读取任何端口,然后循环遍历所有端口返回的fd集中的文件描述符,用于查看是否需要接受新连接(在这种情况下,生成用于通信的新套接字并将其添加到文件描述符集)或以其他方式recv()在已接受的套接字文件上挂起的字节描述。还有其他的东西(比如主设备和临时fd设置,并根据需要关闭套接字),但无论如何我用自己的虚拟客户端程序测试了服务器代码(正确连接没有问题,并在2秒内发送简单消息)间隔),并且非常有信心它在正常条件下正常工作。我真的怀疑这里的根本问题是在Yast设置中,除非你对服务器代码中可能出现的可能导致上述奇怪连接行为的某些事情有一些具体的想法吗?
UPDATE2: @ selbie:嗯,我使用“SuSEfirewall2 off”命令禁用了bash终端中的OpenSuse防火墙......以及修复它的 ! XD非常感谢!我尝试打开防火墙,我遇到了和以前一样的问题,一旦我禁用了防火墙,连接就开始工作了。我猜测防火墙最终导致问题。我想知道,那么,每当服务器代码运行时,我是否应该始终关闭防火墙?或者,如何在代码中处理这类问题?