1

この文字列が動的に作成されたとき(コード内の別の変数の値と同じ値に設定したとき)、UDPパケットで送信している文字列の受信に問題があります。これとは異なり、この文字列の作成時に文字列に定数値を設定した場合、この問題は発生しません。文字列を送信するために使用する方法は次のとおりです。

- (void) sendUDPMessage {
 int sockfd;
 struct sockaddr_in server_addr;
 char myBroad[]="255.255.255.255";
 struct hostent *hptr = gethostbyname(myBroad);
 sockfd = socket(AF_INET, SOCK_DGRAM, 0);
 bzero(&server_addr, sizeof(struct in_addr));
 server_addr.sin_family = AF_INET;
 server_addr.sin_port = htons(15000);
 server_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
 memcpy(&server_addr.sin_addr, hptr->h_addr_list[0], sizeof(struct in_addr));
 int opt = 1;
 setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(int));
 NSString *string = [NSString stringWithFormat:@"%@ %@",user.name,user.surname];
 sendto(sockfd, &string, sizeof(string), 0, (struct sockaddr*)&server_addr, sizeof server_addr);
 NSLog(@"message sent : %@",string);
}

そしてこれはudpパケットを受信するための方法です:

- (void) server {
 int serverfd;
 struct sockaddr_in server_addr;
 struct sockaddr_in client_addr;
 serverfd = socket(AF_INET, SOCK_DGRAM, 0);
 bzero(&server_addr, sizeof(struct sockaddr_in));
 server_addr.sin_family = AF_INET;
 server_addr.sin_port = htons(15000);
 server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
 bind(serverfd, (struct sockaddr *) &server_addr, sizeof(struct sockaddr_in));
 socklen_t clisize = sizeof(struct sockaddr_in);
 bzero(&client_addr, clisize);
 while (1) {
    NSString *string=@"";
    NSLog(@"wainting for messages");
    recvfrom(serverfd, &string, 200, 0, (struct sockaddr *) &sin, &clisize);
    NSLog(@"message received : %@",string);
 }
}

NSStringを定義すると*string= @ "hello!"; 文字列の内容を正しく受け取ることができます。NSObjectを送信しようとすると、同じ問題が発生します。私は何が欠けていますか?ありがとう!

4

2 に答える 2

0

コードがNSStringオブジェクトを送受信しようとしています。NSStringは文字のシーケンスではありません。それはオブジェクトです。オブジェクトの内容は、受信者にとって意味がありません。文字列に含まれる文字を送信する必要があります。

送信側では、NSStringに含まれる文字を送信する必要があります(UTF8String:またはを介して取得cStringUsingEncoding:)。受信側では、テキストを受信して​​から、+stringWithUTF8String:またはを使用してNSStringを作成する必要があります。+stringWithCString:encoding:

于 2012-12-20T13:15:48.863 に答える
0

目標が実際の目的でソケットを使用することである場合は、GCDAsyncSocket(および関連するクラス)を試してみてください。

これがソケットの動作についての洞察を得るために遊んでいるだけの場合(および/またはこれをCプロジェクトでも使用したい場合)、コードの修正バージョンは次のとおりです。

- (void) sendUDPMessage {
 int sockfd;
 struct sockaddr_in server_addr;
 char myBroad[]="255.255.255.255";
 struct hostent *hptr = gethostbyname(myBroad);
 sockfd = socket(AF_INET, SOCK_DGRAM, 0);
 bzero(&server_addr, sizeof(struct in_addr));
 server_addr.sin_family = AF_INET;
 server_addr.sin_port = htons(15000);
 server_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
 memcpy(&server_addr.sin_addr, hptr->h_addr_list[0], sizeof(struct in_addr));
 int opt = 1;
 setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(int));
 NSString *string = [NSString stringWithFormat:@"%@ %@",user.name,user.surname];

 // sendto(sockfd, &string, sizeof(string), 0, (struct sockaddr*)&server_addr, sizeof server_addr);
 // get a pointer to the raw string bytes in UTF-8 encoding:
 const char *bytes = string.UTF8String;
 // send the bytes, using strlen() to get the number of bytes in the UTF-8 string
 // Note! this may not be equal to string.length, which gives the number of UTF-8 chars.
 sendto(sockfd, bytes, strlen(bytes), 0, (struct sockaddr*)&server_addr, sizeof server_addr);

 NSLog(@"message sent : %@",string);
}

そしてこれはudpパケットを受信するための方法です:

- (void) server {
 int serverfd;
 struct sockaddr_in server_addr;
 struct sockaddr_in client_addr;
 serverfd = socket(AF_INET, SOCK_DGRAM, 0);
 bzero(&server_addr, sizeof(struct sockaddr_in));
 server_addr.sin_family = AF_INET;
 server_addr.sin_port = htons(15000);
 server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
 bind(serverfd, (struct sockaddr *) &server_addr, sizeof(struct sockaddr_in));
 socklen_t clisize = sizeof(struct sockaddr_in);
 bzero(&client_addr, clisize);

while (1) {
    NSLog(@"waiting for messages");
    char buf[1024]; // this is a static buffer to receive raw bytes
    int bytesread = recvfrom(serverfd, buf, 1024, 0, (struct sockaddr *) &sin, &clisize);
    if ( bytesread > 0 )
    {
        NSString *string = [[NSString alloc] initWithBytes:buf length:bytesread encoding:NSUTF8StringEncoding];
        NSLog(@"message received : %@",string);
        // for non-arc projects don't forget to release string
    }
}
}

(未テスト)

このコードにはまださまざまな問題がありますが、これは簡単なデモとしてのみ使用できます。たとえば、すべての戻り値をチェックし、すべてのエラーを処理する必要があります。呼び出しがブロックされる可能性があることに注意する必要があります(特にこれを防止しない限り)。作成する前にメッセージ全体を受信する必要がありますNSString(たとえば、受信したパケットがより大きい場合)バッファ。UTF-8にはマルチバイト文字があるため、これを部分的に単純に行うことはできません)

あなたは警告されました!

于 2012-12-20T13:38:19.747 に答える