Код эхо-сервера не работает - PullRequest
0 голосов
/ 11 октября 2010

У меня есть некоторый код сокета, который работает на моем компьютере с Linux, но не работает на моем компьютере PowerPC.

Код (при работе на компьютере с Linux) получает данные от клиента и затем отправляет данные обратноклиент.При тестировании с двумя приложениями netcat данные успешно переносятся.

ПРОБЛЕМА: при тестировании на PowerPC (под управлением VxWorks) отраженные данные никогда не принимаются клиентом ... (netcat и wireshark ничего не показывают).

На PowerPC сервер успешно ПРИНИМАЕТ данные (от клиента x86) и утверждает, что он успешно ВЫБИРАЛ их обратно ... но НЕТ ДАННЫХ не получено на клиенте (netcat на x86) ..Я думаю, что я где-то совершил какой-нибудь ENDIAN foobar.Вот фрагмент кода, который существует на PowerPC.С двумя Linux-блоками x86 код работает нормально ...

while(1) 
{
    readlen = recvfrom(sock, buf, BUFLEN, 0, (struct sockaddr *) &client_address, &slen);

    if (readlen == ERROR)
    {
        printf("RECVFROM FAILED()/n");
        return (ERROR);
    }

    printf("Received %d bytes FROM %s:%d\nData: %s\n\n", 
           readlen, inet_ntoa(client_address.sin_addr), ntohs(client_address.sin_port), buf);

    // Send it to right back to the client using the open UDP socket
    // but send it to OUTPORT
    client_address.sin_port = htons(OUTPORT);
    sendlen = sendto(sock, buf, BUFLEN, 0, (struct sockaddr *)&client_address, slen);


// more code ....
}

Может быть, мне тоже нужен адрес клиента?...

1 Ответ

0 голосов
/ 12 октября 2010

Я не думаю, что в коде, который вы показали, проблема с порядком байтов является проблемой, и на PowerPC с прямым порядком байтов htons() и т. Д. Все равно не работают (порядок сети равен big-endian)!

Я подозреваю, что вы используете slen в вызове recvfrom().Это входной-выходной параметр для recvfrom(), который должен быть передан как максимальный размер адресного буфера и содержит фактический размер адреса, который вы получили при возврате.

Если начальное значениеslen (до показанного вами цикла) слишком мало, адрес, сохраненный в client_address с помощью recvfrom(), будет усечен.

Так что slen следует установить на sizeof(client_address) простоперед звонком recvfrom().(Также вы должны убедиться, что slen объявлен с типом правильного размера - POSIX использует socklen_t для этого.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...