2016-02-10 5 views
2

У меня есть веб-сервис, написанный на .net на удаленном компьютере с IIS. Я пытаюсь подключиться к нему с помощью программы C, используя socker для выполнения SOAP-запроса.recv останавливает или не возвращает все данные (код C)

Моя проблема заключается в том, что у меня есть некоторые probem получающее данные:

Цикл приема данных не работает таким образом, или в другом.

Если я пишу:

nByte = 1; 
while(nByte!=512) 
{ 
    nByte = recv(sockfd,buffer,512, 0); 
    if(nByte < 0) 
    { 
     // check the error 
    } 
    if(nByte > 0) 
    { 
     // append buffer to received data 
    } 
} 

иногда не возвращает все данные, если его запустить без отладчика и breackpoints.

Если я попытаюсь: while(nByte!=0) в конце данных он заглох и по ошибке.

Как это должно быть сделано? Спасибо, Antonino

** EDIT ** я решил мою ситуацию по-другому, я проверяю возвращаемое значение для конца мыло XML:

nByte = 1; 
while(nByte!=0) 
{ 
    nByte = recv(sockfd,buffer,512, 0); 
    if(nByte < 0) 
    { 
     // check the error 
    } 
    if(nByte > 0) 
    { 
     // append nByte buffer to received data 
     if(strstr("</soap:Envelope>", buffer) != NULL) 
     break; 
    } 
} 

Это очень грустно .. .

ответ

1

Где он говорит, что заполняет буфер? Прочитайте человек изображение. Он блокируется, пока не может быть передан хотя бы один байт данных, а затем передает все данные.

3
#define BUFFERSIZE 512 

byte buffer[BUFFERSIZE]; 
int nByte = BUFFERSIZE; 
int rByte; 

while(nByte!=0) 
{ 
    rByte = recv(sockfd, &buffer[BUFFERSIZE-nByte], nByte, 0); 
    if(rByte < 0) 
    { 
     // socket error 
     break; 
    } 
    if(rByte == 0) 
    { 
     // connection closed by remote side or network breakdown, buffer is incomplete 
     break; 
    } 
    if(rByte>nByte) 
    { 
    // impossible but you must check it: memory crash, system error 
    break; 
    } 
    nByte -= rByte; // rByte>0 all is ok 
    // if nByte==0 automatically end of loop, you read all 
    // if nByte >0 goto next recv, you need read more bytes, recv is prtialy in this case 
} 

//**EDIT** 

if(nByte!=0) return false; 

// TO DO - buffer complete 
+0

таким образом, он получает только READSIZE байтов, я хочу загрузить весь поток, пока соединение не закрыто, но он никогда не вернется 0. – Perry

+0

увидеть теперь после редактирования – theWalker

+0

«таким образом, он получает только READSIZE байт» - нет, мы читаем все, но не всегда возвращаем все сокеты, и в моем ответе мы должны прочитать больше – theWalker