TCP / IP принимает не возвращаются, но клиент делает - PullRequest
2 голосов
/ 09 июня 2010

сервер:
vxworks 6.3
вызывает обычный сокет, bind, listen, затем:

for (;;)
{
  client = accept(sfd,NULL,NULL);
  // pass client to worker thread
}

client:
.NET 2.0
Конструктор TcpClient для подключения к серверукоторый принимает строку hostname и int port, например:

TcpClient client = new TcpClient(server_ip, port);

Это нормально работает, когда сервер компилируется и выполняется в windows (native c ++).

с перерывами, конструктор для TcpClientвернет экземпляр, не выдавая никакого исключения, но вызов accept в vxWorks не возвращается с клиентом fd.tcpstatShow указывает, что принятие не произошло.

Что может заставить конструктор TcpClient (который вызывает 'Connect') возвращать экземпляр, в то время как вызов accept на сервере не возвращает?Похоже, что это связано с тем, что система делает в фоновом режиме - более вероятно, что этот симптом возникнет, когда сервер занят сохранением данных во флэш-памяти или общим ресурсом NFS, когда клиент пытается подключиться, но может произойти, когда онэто также не так.

Я попытался отрегулировать приоритет потока, выполняющего accept
Я посмотрел размер очереди в 'listen'.Достаточно.
Всего должно хватить общего числа дескрипторов файлов (пока это не подтверждено, первым делом с утра)

Ответы [ 4 ]

1 голос
/ 17 июня 2010

было бы возможно для вас опубликовать Wireshark / Netmon о том, что происходит на проводе?

0 голосов
/ 19 июня 2010

Ваш сервер accept() выглядит неправильно.Я знаю, что вызов POSIX accept() имеет:

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); 

, где *addr - обязательный указатель, который записывается, если вызов работает - действительно, одно из состояний отказа для вызова:1007 *

[EFAULT]    The address parameter is not in a writable part of the user address space.

Я не занимался программированием сокетов Windows, но я понимаю, что он совместим с POSIX, и в руководстве Биджа не упоминаются исключения для Windows для accept () , поэтому это должновсе еще применяется.В некоторой степени актуально, что вызов Python accept () также «возвращает» поле address (скажу несколько, поскольку Python сделал все возможное, чтобы эмулировать сетевой API C, как это имело смысл).* Я бы предложил проверить errno и использовать perror после вызова accept на сервере, чтобы проверить, установлен ли [EFAULT] (он также сообщит вам, если у вас закончились дескрипторы, так как errno будет установленна [EMFILE] или [ENFILE])

Если это не является проблемой, используйте ncat в качестве сервера или клиента для дальнейшего изучения,Я бы запустил его с -vv, так как вы хотите точно знать, когда установлены соединения, что отправлено и так далее.

0 голосов
/ 18 июня 2010

Можно ли привязать сервер к другому порту и посмотреть, принимает ли он там?Если клиент возвращается, звучит так, как будто он получил подтверждение от чего-то на вашем сервере.Я не знаю насчет vxworks, но в Windows вы всегда должны стараться не связываться ни с чем под 1000.

0 голосов
/ 15 июня 2010

Причин может быть много, однако мы не узнаем, если не получим больше информации со стороны сервера и клиента. Выдает ли какие-либо ошибки? Список ошибок TCP / IP можно найти здесь Ошибка Windows Socket. На стороне сервера вы ловите какие-либо исключения? Может быть, вы можете попытаться закрыть соединение (с задержкой в ​​1 секунду) после ошибки?

...