ошибка сокета 10054 - PullRequest
       13

ошибка сокета 10054

4 голосов
/ 19 декабря 2011

У меня есть программа C / S.Клиент использует сокет для отправки файла на сервер, после отправки приблизительных данных, превышающих 700k , клиент (на win7) получит ошибку сокета 10054, что означает сброс соединения по пиру.

Сервер работалв CentOS 5.4 клиент - это виртуальная машина Windows7, запущенная в виртуальной коробке.клиент и сервер обмениваются данными через виртуальный сетевой интерфейс.Порт команды (отправка журнала) нормальный, но проблема в порте данных (отправка файла).Если это было вызвано неправильной конфигурацией размера буфера сокета или чем-то еще?Если кто-нибудь может помочь мне проверить проблему.Спасибо.

Каждый раз, когда я вызываю сокет отправки, буфер равен 4096 байт отправки (сокет, буфер, 4096, 0)

Конфигурация сокета CentOS.

#sysctl -a
...
net.ipv4.tcp_rmem = 4096        87380   4194304
net.ipv4.tcp_wmem = 4096        16384   4194304
net.ipv4.tcp_mem = 196608       262144  393216
net.ipv4.tcp_dsack = 1
net.ipv4.tcp_ecn = 0
net.ipv4.tcp_reordering = 3
net.ipv4.tcp_fack = 1

I 'я не совсем понимаю, что означает конфигурация буфера сокета, если это вызовет проблему с неполным получением результата?

1 Ответ

5 голосов
/ 19 декабря 2011

Это почти наверняка ошибка в вашем коде.Скорее всего, одна сторона считает, что истекло время ожидания другой стороны, и поэтому неправильно закрывает соединение.Чаще всего это происходит, когда вы вызываете функцию получения для получения данных, но на самом деле вы уже получили эти данные и просто не поняли их.Итак, вы ждете данные, которые вы уже получили, и, следовательно, время ожидания.

Например:

1) Клиент отправляет сообщение.

2) Клиент отправляет другойсообщение.

3) Сервер читает оба сообщения, но считает, что получил только одно, отправляет подтверждение.

4) Клиент получает подтверждение, ожидает второго подтверждения, который сервер никогда не отправит.

5) Сервер ожидает второго сообщения, которое фактически уже получено.

Теперь сервер ждет клиента, а клиент ждет сервера.Сервер был закодирован неверно и не осознавал, что фактически получил два сообщения за один раз.TCP не сохраняет границы сообщений.

Если вы расскажете мне больше о своем протоколе, я, вероятно, расскажу вам более подробно, что пошло не так.Что составляет сообщение?Какая сторона отправляет когда?Есть ли какие-либо подтверждения?И т. Д.

Но короткая версия такова, что каждая сторона, вероятно, ожидает другую.

Скорее всего, сброс соединения по одноранговому узлу является симптомом.Ваша проблема возникает, одна сторона тайм-аут и прерывает соединение.Это приводит к тому, что другая сторона получает сброс соединения, потому что другая сторона прервала соединение.

...