2010-11-24 2 views
0

У меня было несколько проектов и макетов с использованием TCP-сокета, но это первый раз, когда я столкнулся с этим.TCP Socket не получает данные, пишет/отправляет не таймаут?

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

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

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

здесь свалка из подглядывать:

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 [email protected]@......=.. 
    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 = 799808987 Seq Len = 0 Win = 24820 Опции =

0: 000c 295d 6f44 0800 20f5 a3b5 0800 4500 ..)]oD.. .....E. 
    16: 0034 c849 4000 4006 5e17 0a01 0025 0a01 [email protected]@.^....%.. 
    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 = 4205016630 Seq Len = 0 Win = 49640

0: 0800 20f5 a3b5 000c 295d 6f44 0800 4500 .. .....)]oD..E. 
    16: 0028 e4c8 4000 4006 0000 0a01 003d 0a01 .([email protected]@......=.. 
    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 Нажмите Ack = 799808988 = 4205016630 Seq Len = 2 Win = 49640

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

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

0: 000c 295d 6f44 0800 20f5 a3b5 0800 4500 ..)]oD.. .....E. 
    16: 0028 c84a 4000 4006 5e22 0a01 0025 0a01 .([email protected]@.^"...%.. 
    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 Ребро Ack = 799808988 = 4205016632 Seq Len = 0 Win = 49640

0: 0800 20f5 a3b5 000c 295d 6f44 0800 4500 .. .....)]oD..E. 
    16: 0028 e4ca 4000 4006 0000 0a01 003d 0a01 .([email protected]@......=.. 
    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 .([email protected]@.^!...%.. 
    32: 003d 22b2 89db 2fac 1ddc faa3 7639 5010 .=".../.....v9P. 
    48: 60f2 cf8b 0000 5555 5555 5555    `.....UUUUUU 
+0

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 = 1805515051 Seq Len = 0 Win = 24818 solaris61 -> 10.1.0.37 TCP-D = 8882 S = 35112 = син СтартПослед 921698308 Len = 0 Win = 49640 Опции = 10.1.0.37 -> solaris61 TCP D = 35112 S = 8882 Syn Ack = 921698309 Seq = 1829645518 Len = 0 Win = 24820 Опции = < 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 – marcus 2010-11-24 16:46:35

+0

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 – marcus 2010-11-24 16:46:56

+0

@marcus, вы можете отредактировать сам вопрос, там было бы гораздо читабельнее. – 2010-11-24 16:49:39

ответ

1

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

0

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

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

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

Смежные вопросы