2012-05-04 11 views
0

目標:データを送受信するUDPソケットを作っています。 私はラップトップでこれをテストしています。そのため、受信メッセージを待ち受けているバックグラウンドでサーバを実行しています。UDPクライアントは受信したデータを2回印刷します。受信データが2回追加される]

問題:サーバーが1つの文字列を受け取り、それがエコーバックすると、クライアントは1つではなく文字列を2回読み込み、不気味さを追加します。これを解決する方法は?コードから

出力は次のとおりです。HelloHello09

[LOLZ、ところで私ALSは09の前にし、その背後に逆さまにしているいくつかのquestionsmarksを得るが、私はそれを貼り付けることはできません]

コード:

#define BUFLEN 5 
#define PORT 12345 

#import <Foundation/Foundation.h> 

#define srvr_IP "127.0.0.1" 

void errorSig(char *); 

int main (int argc, const char * argv[]) 
{ 
int sockSend = socket(AF_INET, SOCK_DGRAM, 0); 
struct sockaddr_in si_other; 

char buf[BUFLEN] = "Hello"; 
char bufrec[BUFLEN]; 

@autoreleasepool { 

    si_other.sin_family = AF_INET; 
    si_other.sin_port = htons(PORT); 
    inet_pton(AF_INET, srvr_IP, &si_other.sin_addr); 
    memset(&si_other.sin_zero, 0, sizeof(si_other.sin_zero)); 

    int size = sizeof(si_other); 
    sendto(sockSend, buf, BUFLEN, 0, 
      (struct sockaddr *)&si_other, size); 

    recvfrom(sockSend, bufrec, BUFLEN, 0, (struct sockaddr *)&si_other, (unsigned int*)&size); 
    NSString *test = [[NSString alloc]initWithUTF8String:bufrec]; 
    NSLog(@" data is: %@", test); 

    close(sockSend); 
    } 
return 0; 
} 
+0

これは私にとっては 'C'のようには見えないのですか? – Nick

+0

@Nickは何を言った。これらの "@autoreleasepool"と "[NSString alloc]"は何ですか?推測では、問題は文字列がNULL終端されているかどうかと関係がありますが、bufとbufrecがメモリ内で隣接していることがよく分かります。それらの間にギャップがなく、ヌル終端文字がない場合は、両方とも一緒に印刷されています。 BUFLENとは何か、それ以上の情報なしでは言い表せません。 – Vicky

答えて

1

私はちょうどあなたが実際にBUFLENを5と定義したのを見たことがあります(上記のコメントを書いたときに私はそれを忘れてしまいました)。私が推測しているように、NULL終了の問題があります。 Cの文字列の長さは、文字列の終わりを示すNULL終端文字のためのスペースを確保するために、格納したい文字数の1倍以上です。

BUFLENの定義を6に変更すると、はるかにうまく動作するはずです。

関連する問題