TCP Socket не получает данные, запись / отправка не происходит по таймауту? - PullRequest
0 голосов
/ 24 ноября 2010

Я выполнил несколько проектов и макетов с использованием сокета TCP, но я впервые столкнулся с этим.

У меня есть серверное приложение Linux на машине Solaris Sparc, которая должна приниматьсоединение от OCX на веб-сервере, но данные не получены.Я использовал netstat, чтобы убедиться, что соединение установлено.

Я создал крошечный tcp-клиент для подключения, который будет выполнять роль веб-сервера / ocx, но при записи он останавливается и время ожидания не наступает.Даже если я оставлю соединение и подожду несколько часов, ничего не произойдет.Я даже зашел так далеко, что использовал setsockopt, чтобы убедиться, что установлено низкое значение тайм-аута.Кроме того, с другой стороны, данные не принимаются, и оператор select делает тайм-аут при опросе набора fd.

У кого-нибудь есть идея, почему запись или отправка не будут превышать время ожидания при записи в соксет?Кроме того, кто-нибудь знает, почему на сервере не был установлен набор чтения fd?

здесь дамп из snoop:

solaris61 -> 10.1.0.37    TCP D=8882 S=35111 Fin Ack=1805515051 Seq=897643511 Len=0 Win=49640
10.1.0.37 -> solaris61    TCP D=35111 S=8882 Ack=897643512 Seq=1805515051 Len=0 Win=24818
solaris61 -> 10.1.0.37    TCP D=8882 S=35112 Syn Seq=921698308 Len=0 Win=49640 Options=<mss 1460,nop,wscale 0,nop,nop,sackOK>
10.1.0.37 -> solaris61    TCP D=35112 S=8882 Syn Ack=921698309 Seq=1829645518 Len=0 Win=24820 Options=<nop,wscale 0,nop,nop,sackOK,mss 1460>
solaris61 -> 10.1.0.37    TCP D=8882 S=35112 Ack=1829645519 Seq=921698309 Len=0 Win=49640
solaris61 -> 10.1.0.37    TCP D=8882 S=35112 Push Ack=1829645519 Seq=921698309 Len=2 Win=49640
10.1.0.37 -> solaris61    TCP D=35112 S=8882 Ack=921698311 Seq=1829645519 Len=0 Win=24818

с использованием "snoop -x0 -s1500"

solaris61 -> 10.1.0.37 TCP D = 8882 S = 35291 Syn Seq = 4205016629 Len = 0 Win = 49640 Опции =

   0: 0800 20f5 a3b5 000c 295d 6f44 0800 4500    .. .....)]oD..E.
  16: 0034 e4c7 4000 4006 0000 0a01 003d 0a01    .4..@.@......=..
  32: 0025 89db 22b2 faa3 7635 0000 0000 8002    .%.."...v5......
  48: c1e8 148a 0000 0204 05b4 0103 0300 0101    .è..............
  64: 0402                                       ..

10.1.0.37 -> solaris61 TCP D = 35291 S =8882 Syn Ack = 4205016630 Seq = 799808987 Len = 0 Win = 24820 Options =

   0: 000c 295d 6f44 0800 20f5 a3b5 0800 4500    ..)]oD.. .....E.
  16: 0034 c849 4000 4006 5e17 0a01 0025 0a01    .4.I@.@.^....%..
  32: 003d 22b2 89db 2fac 1ddb faa3 7636 8012    .=".../.....v6..
  48: 60f4 8ec1 0000 0103 0300 0101 0402 0204    `...............
  64: 05b4                                       ..

solaris61 -> 10.1.0.37 TCP D = 8882 S = 35291 Ack = 799808988 Seq = 4205016630 Len = 0 Win = 49640

   0: 0800 20f5 a3b5 000c 295d 6f44 0800 4500    .. .....)]oD..E.
  16: 0028 e4c8 4000 4006 0000 0a01 003d 0a01    .(..@.@......=..
  32: 0025 89db 22b2 faa3 7636 2fac 1ddc 5010    .%.."...v6/...P.
  48: c1e8 147e 0000                             .è.~..

solaris61 -> 10.1.0.37 TCP D = 8882 S = 35291 Push Ack = 799808988 Seq = 4205016630 Len = 2 Win = 49640

   0: 0800 20f5 a3b5 000c 295d 6f44 0800 4500    .. .....)]oD..E.
  16: 002a e4c9 4000 4006 0000 0a01 003d 0a01    .*..@.@......=..
  32: 0025 89db 22b2 faa3 7636 2fac 1ddc 5018    .%.."...v6/...P.
  48: c1e8 1480 0000 750a                        .è....u.

10.1.0.37 -> solaris61TCP D = 35291 S = 8882 Ack = 4205016632 Seq = 799808988 Len = 0 Win = 24818

   0: 000c 295d 6f44 0800 20f5 a3b5 0800 4500    ..)]oD.. .....E.
  16: 0028 c84a 4000 4006 5e22 0a01 0025 0a01    .(.J@.@.^"...%..
  32: 003d 22b2 89db 2fac 1ddc faa3 7638 5010    .=".../.....v8P.
  48: 60f2 cf8c 0000 5555 5555 5555              `.....UUUUUU

solaris61 -> 10.1.0.37 TCP D = 8882 S = 35291 Fin Ack = 799808988 Seq = 4205016632 Len =0 Win = 49640

   0: 0800 20f5 a3b5 000c 295d 6f44 0800 4500    .. .....)]oD..E.
  16: 0028 e4ca 4000 4006 0000 0a01 003d 0a01    .(..@.@......=..
  32: 0025 89db 22b2 faa3 7638 2fac 1ddc 5011    .%.."...v8/...P.
  48: c1e8 147e 0000                             .è.~..

10.1.0.37 -> solaris61 TCP D = 35291 S = 8882 Ack = 4205016633 Seq = 799808988 Len = 0 Win = 24818

   0: 000c 295d 6f44 0800 20f5 a3b5 0800 4500    ..)]oD.. .....E.
  16: 0028 c84b 4000 4006 5e21 0a01 0025 0a01    .(.K@.@.^!...%..
  32: 003d 22b2 89db 2fac 1ddc faa3 7639 5010    .=".../.....v9P.
  48: 60f2 cf8b 0000 5555 5555 5555              `.....UUUUUU

Ответы [ 2 ]

1 голос
/ 24 ноября 2010

Снизитесь до tcpdump(1) и / или snoop(1M), чтобы увидеть, что происходит на проводе с обеих сторон. Это, вероятно, лучший вариант для поиска объяснения, учитывая «магию», которую вы описываете. Опубликуйте подробности по мере их обнаружения.

0 голосов
/ 24 ноября 2010

Вы получите тайм-аут, только если он не получит подтверждение TCP для чего-то, что было отправлено. Ваш дамп показывает, что все отправленные данные были подтверждены, поэтому время ожидания не должно быть. Единственные данные, которые были отправлены, были 2 байта от solaris61.

Звучит так, как будто вы говорите, что намеревались отправить некоторые данные в solaris61. Эти данные никогда не отправлялись. Как вы отправляете эти данные? Если вы пишете с использованием буферизованного stdio, данные могут все еще находиться в буфере. Например, если это буферизованная строка, то она будет буферизована до отправки новой строки. Вместо этого вы можете отключить буферизацию с помощью setvbuf() или просто использовать send() для прямой отправки данных.

(Если вы уже делаете это, пожалуйста, опубликуйте эту часть кода.)

...