1

通常のTCP接続を介してサーバーにバイナリデータを常に送信するAndroidアプリケーションのiOSバージョンに取り組んでいます。そして、Java コードは正常に動作しますが、プレーン C のコードは動作しません。最初の一連のデータがサーバーに送信された後、接続が切断されます。CFNetwork フレームワークを使用して Java ソリューションを再実装することができましたが、私の C コードにはまだ問題があります...

C コード (エラー チェックと興味のないコードを削除):

mSocket = socket(AF_INET, SOCK_STREAM, 0);
//...        
connect(mSocket, (struct sockaddr *)&sin, sizeof(sin));
int keepalive = 1;  
int res = setsockopt(mSocket, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive, 
                          sizeof(int));

int set = 1;
setsockopt(mSocket, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int));

unsigned char buffer* = //...;
int ret = send(mSocket, buffer, bufferLen, 0);  //handshake with server, runs fine

while(/*there is new data*/) {
       buffer = new_data(); //some fake method
       ret = send(mSocket, buffer, bufferLen, 0); //On the second iteration 
                                                  //write returns -1
}

ただし、CFNetwork に基づくこの Objective-C コードは問題なく動作します...

Objective-C コード:

 CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, 
                                   host, 
                                   port, 
                                   &readStream, 
                                   &writeStream);
 CFWriteStreamOpen(mServerWriteStream);

 while(/*there is new data*/) {
     NSData* data = //....
     int wroteBytes = CFWriteStreamWrite(mServerWriteStream, [data bytes], [data length]);
 }

だから私はCコードで何が間違っているのか困惑しており、ヒントをいただければ幸いです

ありがとうございました

4

2 に答える 2

2

通常の TCP 接続が必要な場合は、そのようなプロトコルでソケットを作成する必要があります。それ以外の:

mSocket = socket(AF_INET, SOCK_STREAM, 0);

次のように作成する必要があります。

#include <netinet/in.h>
mSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

私のシステムでは IPPROTO_TCP は 0 ではなく 6 として定義されています。

于 2012-06-03T16:04:54.187 に答える