TCP Unix send () очень медленный C - PullRequest
0 голосов
/ 13 апреля 2011

Редактировать: Оказалось, проблема с моим встроенным адаптером Ethernet.Работает хорошо сейчас.Спасибо всем.

Когда я отправляю файл через TCP-сокет, для завершения передачи требуется много времени (~ 4 секунды для 1,5 Мбайт).Тот же файл перемещается почти мгновенно по TFTP.Я знаю, что tftp использует UDP, который должен быть быстрее, но я все еще думаю, что мой способ передачи слишком медленный.Я подключен 100 Мбит / с полудуплекс, через кроссовер кабель.Отправитель - UNIX, а получатель - .Net в Windows TcpClient.

Итак, что все думают?Нужен ли мне лучший код на C?Может быть, что-то не так с сетью?

Вот мой код C:

int main(void)
{
    //some initializing stuff
    int AcceptSocket, ClientRecvSocket;

    alen = sizeof(fsin);
    int AcceptSocket = passiveTCP("20075", 10);
    //Wait for client connections, and spawn a new thread to communicate with each one
    pszRecvBuf = malloc((size_t) BUFSIZE);
    while (1)
    {
        ClientRecvSocket = accept(AcceptSocket, &fsin, &alen);
        printf("\nDebug: Accepted Connection\n");
        if (ClientRecvSocket < 0)
        {
            sprintf(szStr, "Error accepting client connection : %d",
                    ClientRecvSocket);
            perror(szStr);
        }
        else
        {
            printf("\nDebug: Starting Thread\n");
            ThreadStatus = pthread_create(&ClientThread, NULL, ClientRecv,
                    (void *) &ClientRecvSocket);
            pthread_join(ClientThread, NULL);
        }
    }
}

void *ClientRecv(void *ClientSocket)
{
    pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
    int Socket = *(int *) ClientSocket;

    unsigned char *file_buffer;
    file_buffer = malloc(1572864 * sizeof(unsigned char));

    //set file data to something

    SendLen = send(Socket, file_buffer, 1572864 * sizeof(unsigned char), 0);
    shutdown(Socket, SHUT_RDWR);
    free(file_buffer);
}
int passiveTCP(char *service, int qlen)
{
     return passivesock(service, "tcp", qlen);
}

Ответы [ 2 ]

1 голос
/ 13 апреля 2011

С первого взгляда, глядя на это, внутри вашей функции ClientRecv, вы потребляете слишком много ресурсов ...

unsigned char *file_buffer;
file_buffer = malloc(1572864 * sizeof(unsigned char));

Вы выделяете для этого память, но куда она уходит ... следует попробовать освободить указатель на этот буфер ....

Интересно, чтобы служить и помогать другим, это то, что вы используете какую-то оболочку-оболочку, и, пожалуйста, укажите, какую именно .... я сильно подозреваю, что вы используете нестандартное программное обеспечение - возможно, у этого программного обеспечения есть определенные "проблемы"?

0 голосов
/ 13 апреля 2011

Вместо этого попробуйте подключить полный дуплекс.

Поскольку для TCP требуется подтверждение (примерно) каждого передаваемого пакета, полудуплексный канал связи должен прекратить передачу для обработки получения этих ACK.Это может проявляться в виде коллизий, приводящих к потере пакетов и, в конечном итоге, к запуску средств управления перегрузкой TCP.

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