2009-01-20 97 views
4

好了,所以我试图得到一些UDP代码工作,我几乎没有绿色的,当涉及到网络中使用C.从hereSocket编程用C

基本上编程我使用的样本文件我只是侦听给定端口上的传入UDP数据包,然后我想以相同的方式发回一些数据。以下是相关部分。

此时插座设置和必然选择的端口并等待传入​​数据包:

printf("GSProxy: waiting to recvfrom...\n"); 

addr_len = (socklen_t) sizeof their_addr; 
if ((numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0, 
    (struct sockaddr *)&their_addr, &addr_len)) == -1) { // argument 6 gives a warning but is correct int 
    perror("recvfrom"); 
    exit(1); 
} 

printf("GSProxy: got packet from %s\n", 
inet_ntop(their_addr.ss_family, 
    get_in_addr((struct sockaddr *)&their_addr), s, sizeof s)); 
printf("GSProxy: packet is %d bytes long\n", numbytes); 
buf[numbytes] = '\0'; 
printf("GSProxy: packet contains \"%s\"\n", buf); 

char retmsg[] = "Hello!"; 
if ((numbytes = sendto(sockfd, retmsg, 7, 0, 
    (struct sockaddr *) &their_addr, &addr_len)) == -1) { 
    perror("GSPProxy: sendto"); 
    exit(1); 
} 

printf("GSProxy: Sent %i bytes.\n", numbytes); 

我只是想送“你好!”字符串返回给发件人。

失败,错误“GSPProxy: sendto: File name too long”。据我所知,这是[ENAMETOOLONG]错误代码。

但是......这是什么意思?什么文件?什么太久了?

难道我不能重复使用套接字发回数据,或者我刚刚犯了另一个newb错误?

最好的问候,

回答

14

你不应该通过插座结构长度的地址sendto() - 它需要实际长度(即"addr_len",不"&addr_len")。

将长度为的地址的长度改为recvfrom()的原因在于,如果真实地址恰好变短,那么它将被该函数更改。

换句话说,替换:

if ((numbytes = sendto (sockfd, retmsg, 7, 0, 
    (struct sockaddr *) &their_addr, &addr_len)) == -1) { 

有:

if ((numbytes = sendto (sockfd, retmsg, 7, 0, 
    (struct sockaddr *) &their_addr, addr_len)) == -1) { 
1

呃,至少在 '& addr_len' 你的sendto或许应该还没有被转交地址通过:即:应该只是addr_len。