почему это может быть "плохой номер файла", когда я пишу в сокет - PullRequest
0 голосов
/ 27 марта 2012

У меня проблема с отправкой сообщения на сокет сервера от клиента. Функция записи возвращает ошибку - неверный номер файла . Это означает, что у меня нет разрешения на запись в этот сокет. Но с другого клиента я могу написать в этот сокет и сделать это успешно. Самое интересное, что когда другой клиент подключился к серверу, мой (проблемный) клиент тоже может отправить сообщение.

код моего клиента:

SOCKET OnceCommand;
struct sockaddr_in SAddress4;

struct autoC
{
  char buf[4];
  short fromx;
  short fromy;
  short tox;
  short toy;
  char step;
  char cycle;
};
union autocomm{
  char byte[14];
  struct autoC command;
} Command1, Command2;

memset(&SAddress4,0,sizeof(SAddress4));
SAddress4.sin_family = AF_INET;
SAddress4.sin_port = htons(444);
SAddress4.sin_addr.s_addr = inet_addr(RobotsIP[Robot1]);
memset(&(SAddress4.sin_zero),0,8);

if((OnceCommand = socket(AF_INET,SOCK_STREAM,0))!=SOCKET_ERROR)
{
  Err(OnceCommand);
  if(conn = connect(OnceCommand,(struct sockaddr *)&SAddress4,sizeof(struct sockaddr))!=SOCKET_ERROR)
  {
    rc = write(OnceCommand,(char*)Command1.byte,sizeof(Command1.byte));
    if(rc < 0)
    {
      perror("Client-write() error");
      rc = getsockopt(OnceCommand, SOL_SOCKET, SO_ERROR, &temp, &length);
      if(rc == 0)
      {
        Err(OnceCommand);
        perror("SO_ERROR was");
      }
      closesocket(OnceCommand);
    }
    else
    {
      adv_printf("Client-write() is OK\n");
      adv_printf("String successfully sent lol!\n");
    }
    shutdown(OnceCommand,2);
    closesocket(OnceCommand);
  }
}

в SO_ERROR был "неверный номер файла"

Я использую сокеты lib в микроконтроллере ADAM-5510 на базе ROM-DOS.

Я пытался решить эту проблему, используя НЕБЛОКИРОВАТЬ сокеты, но select возвращает только флаг готовности к чтению.

Ответы [ 2 ]

0 голосов
/ 08 апреля 2012

Проблема не в клиентской части программы.Может быть из-за использования библиотеки сокетов advantech или другой серверной программы, принимающей соединение клиентов, но не имеющей данных для чтения.Когда я изменил серверную программу, чтобы получать данные только путем выбора, она начинает работать нормально.

0 голосов
/ 28 марта 2012

Вы используете 0 для протокола.Что это должно быть?Если TCP, попробуйте использовать IPPROTO_TCP в вызове сокета, т. Е.

OnceCommand = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...