2

IIS を搭載したリモート コンピューターに .net で記述された Web サービスがあり、socker を使用して SOAP 要求を実行する C プログラムで接続しようとしています。

私の問題は、データを受信する問題があることです。

受信データ ループは何らかの形で機能しません。

私が書く場合:

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
   }
}

デバッガーとブレークポイントなしで実行すると、すべてのデータが返されないことがあります。

試してみるとwhile(nByte!=0)、データの最後でストールしてエラーになります。

それはどのように行われるべきですか?ありがとう、アントニノ

**編集** 別の方法で状況を解決しました。soap xml end の戻り値を確認します。

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;
   }
}

それは非常に悲しいです...

4

2 に答える 2

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
于 2016-02-10T18:50:51.787 に答える
1

バッファがいっぱいになるとどこに書いてありますか? 男性のイメージを読み取ります。少なくとも 1 バイトのデータを転送できるようになるまでブロックし、到着したデータを転送します。

于 2016-02-10T17:53:46.037 に答える