UDP客户端打印两次接收数据[即收到的数据自身附加两次]

时间:2012-05-04 09:58:00

标签: objective-c sockets udp

目标:我正在建立一个UDP套接字来发送和接收数据。 我正在我的笔记本电脑上测试这个,所以我有一个在后台运行的服务器,它监听传入的消息并回复它。

问题:我看到服务器收到一个字符串,当它回传时,客户端读取字符串2次而不是ONE并添加乱码。如何解决这个问题?

代码的输出是:HelloHello09 [顺便说一句我得到的一些问题在09之前和之后都是颠倒的,但我无法粘贴它,lolz]

代码:

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

1 个答案:

答案 0 :(得分:1)

我刚刚看到你确实将BUFLEN定义为5(对不起,当我在上面写评论时我错过了)。我怀疑,你有一个NULL终止问题。 C中字符串的长度比您想要存储的字符数多一个,以便为NULL终止符腾出空间来指示字符串的结尾。

将您的BUFLEN定义更改为6,您会发现它的效果更好。