Проблема с подключением сервера Linux и клиента Windows с помощью сокетов

#windows #linux #sockets

#Windows #linux #сокеты

Вопрос:

Всем привет, я пытаюсь узнать больше о сокетах и о том, как их использовать, и вот уже некоторое время я застрял на одной проблеме.

Я начал с руководства Beej по сетевому программированию и создал говорящего и слушающего с этой страницы на компьютере Linux (Fedora 14), над которым я работаю. Это работает, и я могу заставить их разговаривать друг с другом.

Затем я перешел на Windows (7) и поработал с этим руководством, запустил его и могу отправлять сообщения самому себе на компьютере с Windows. Единственное изменение, которое у меня действительно есть, это то, что я использую getHostbyAddr, а не по имени.

Именно тогда, когда я склеиваю их вместе, у меня начинают возникать проблемы, или, скорее, одна проблема на данный момент. Я запускаю прослушиватель от Beej на компьютере Linux и пытаюсь заставить клиента от Johnnie отправить ему сообщение. Я получаю ошибку winsock 10061 на компьютере с Windows, и в 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

Комментарии:

1. Какие порты вы используете? Вы уверены, что брандмауэр не блокирует на стороне Linux?

2. Я использую 4950 (просто основываясь на том факте, что это было то, что было в коде Beej.) И я просто отключил брандмауэр и попробовал еще раз и получил ту же ошибку (используя команду /etc/init.d / iptables save / stop).

Ответ №1:

10061 Означает WSAECONNREFUSED ошибку. В ссылке, которую вы разместили, я вижу, что клиент использует порт 80. Вы уверены , что изменили его на 4950 ?

Что-то определенно доходит до сервера, иначе оно не отправило бы вам сообщение «Ты мне не нравишься» RST (вот что означает отказ в соединении: оно не только отказывает вам в соединении, но и в довершение ко всему сообщает вам об этом).

ПРАВКА 1

Судя по netstat результату, кажется, что никто его не слушает 4950 .

ПРАВКА 2

Я наконец заставил себя прочитать этот материал beej (честно говоря, я всегда считал его учебные пособия худшими). Разве это не вызвало никакой тревоги ? Вы создаете сокет udp, вот почему его никто не прослушивает TCP 4950 , вот почему вы не можете подключиться.

 hints.ai_socktype = SOCK_DGRAM;
  

У вас есть два варианта:

  • Используйте сокет UDP на стороне Windows
  • Измените код на стороне сервера, чтобы использовать TCP .

Серверный код в его нынешнем виде не подходит для TCP ( recvfrom и всего такого прочего), но должен быть легко адаптирован).

Комментарии:

1. Да, я уверен, что сделал (это было то, с чем я работаю и на компьютере с Windows, и там это работает)

2. @CraftyViking Хорошо, просто чтобы убедиться. Добрался до окна Linux и говорю tcpdump tcp port 4950 . Затем подключитесь к серверу, посмотрите, что произойдет.

3. Хорошо, итак, я попробовал это, и все отображается в tcpdump, но на прослушивателе по-прежнему ничего.

4. @CraftyViking Отредактируйте свой вопрос и вставьте то, что показывает tcpdump. Также вставьте то, что netstat -tlnp отображается после запуска сервера.

5. @CraftyViking Похоже, что ни один процесс не прослушивает этот порт