#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 Похоже, что ни один процесс не прослушивает этот порт