Проблема подключения Linux-сервера и Windows-клиента с сокетами - PullRequest
0 голосов
/ 18 мая 2011

Привет всем Я пытаюсь узнать больше о сокетах и ​​как их использовать, и я застрял в проблеме на некоторое время.

Я начал с руководства Биджа по сетевому программированию и создал докладчик и слушатель из этой страницы на компьютере с Linux, на котором я работаю. Это работает, и я могу заставить его говорить друг с другом.

Затем я перешел к 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 Ответ

3 голосов
/ 18 мая 2011

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

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

РЕДАКТИРОВАТЬ 1

Из вывода netstat кажется, что никто не слушает 4950.

РЕДАКТИРОВАТЬ 2

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

hints.ai_socktype = SOCK_DGRAM;

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...