2009-01-20 100 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。