Задача сокетного программирования на С - PullRequest
0 голосов
/ 19 февраля 2010

Из приведенного ниже фрагмента кода, почему я получаю Read Socket для ответа

int Read(int sock, char *p, int size)
{
    int remain, read=0;

    remain = size;
    while (remain > 0 ) {

        if ((read = recv(sock, p, remain, 0)) < 0) {

            /* Error */
            return(read);
         } else if (read == 0 || *p == 0x0a) {

            /* EOF */
            break;
        }
        remain -= read;
        p += read;
    }

    return(size - remain);
}



while (!done)
{
    printf("***Reading  Socket for response***");
    rsplen= Read(myVsHandle.sock,(char *)encXMLResponse,MAX_RSP_LEN);
    if (rsplen < 0 )
    {
        printf("Internal Communication Error");
        return -1;
    }
    else if (rsplen >0)
        printf("Revieved response");
        done++;
        return 0;
    else if (rsplen == 0)
    {
        printf("Reading socket");
    }

Ответы [ 4 ]

1 голос
/ 19 февраля 2010

Вы ожидаете MAX_RSP_LEN байтов для чтения - много ли байтов для чтения? Может быть, ваш процесс застрял в блокировке read().

Кроме того, в зависимости от типа сокета, из которого вы recv() извлекаете данные, нет гарантии на количество прочитанных данных, поэтому поиск значения 0x0a может не сработать.

0 голосов
/ 19 февраля 2010

Вам не хватает фигурных скобок вокруг:

else if(rsplen > 0)
    ... statements

Это должно быть:

...
}else if (rsplen >0){
    printf("Revieved response");
    done++;
    return 0;
} ...
0 голосов
/ 19 февраля 2010

Ваша проблема может заключаться в том, что вы не заканчиваете вывод новой строкой. Попробуйте завершить вывод новой строкой (\n). stdout является буферизованной строкой, поэтому вы не сможете долго ничего видеть, если не выводите символ новой строки.

Другая возможность состоит в том, что вы не вернетесь с Read(), если не прочитали указанное количество байтов. В зависимости от значения MAX_RSP_LEN и количества доступных данных, Read() может ждать вечно.

Также ваш тест: *p == 0x0a выглядит подозрительно. Что вы здесь тестируете?

Редактировать : есть еще одна «ошибка»:

else if (rsplen >0)
    printf("Revieved response");
    done++;
    return 0;
else...

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

0 голосов
/ 19 февраля 2010

Это:

if ((read = recv(sock, p, remain, 0)) < 0) {

Должно быть

if ((read = recv(sock, p, remain, 0)) > 0) { // Greater then 0, because recv returns the number of bytes received if successful, if it fails -1.  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...