2012-12-16 284 views
0

我試圖實現在C小UDP-服務器/客戶端應用程序的支持,並得到了在服務器端兩個錯誤:recvfrom的:錯誤地址 & & sendto:不支持協議的地址族。我搜索了這個錯誤,並搜索了答案,但是,不幸的是,它們並沒有真正的幫助......也許我以一種錯誤的方式投射了一個參數,並沒有得到它。我希望你能給我一個提示:)。recvfrom的:錯誤地址,SENDTO:地址家族不受協議

#include <unistd.h> 
#include <ctype.h> 
#include <sys/socket.h> 
#include <sys/types.h> 
#include <arpa/inet.h> 
#include <errno.h> 

#define BUFFSIZE 256 
#define IP "127.0.0.1" 
#define PORT 7755 

int main(void){ 

    int socket_fd = socket(AF_INET, SOCK_DGRAM, 0); 
    char buffer[1] = "s"; 

    struct sockaddr_in src_addr; 
    struct sockaddr_in dest_addr; 

    src_addr.sin_family = AF_INET; 
    src_addr.sin_port = htons(PORT); 
    src_addr.sin_addr.s_addr = inet_addr(IP); 

    if(socket_fd==-1) 
    perror("socket"); 

    if(bind(socket_fd, (struct sockaddr*)&src_addr, sizeof(src_addr))==-1) 
    perror("bind"); 

    if(recvfrom(socket_fd, buffer, 2, 0, (struct sockaddr*)&dest_addr, (unsigned int *)sizeof(struct sockaddr_in))==-1) 
    perror("recvfrom"); 

    if(sendto(socket_fd, buffer, 2, 0,(struct sockaddr*)&dest_addr, sizeof(dest_addr))==-1) 
    perror("sendto"); 

    if(close(socket_fd)==-1) 
    perror("close"); 

    return 0; 

} 
+0

可能重複的[簡單的消息傳遞應用程序...得到錯誤14:錯誤的地址](http://stackoverflow.com/questions/8320090/simple-messaging-application-getting-errno-14-bad-address ) –

回答

8

您需要傳遞一個有效的指針給recvfrom。 (unsigned int *)sizeof(struct sockaddr_in)不是有效的指針。

變化

if(recvfrom(socket_fd, buffer, 2, 0, (struct sockaddr*)&dest_addr, 
      (unsigned int *)sizeof(struct sockaddr_in) == -1) 

到例如

socklen_t len = sizeof dest_addr; 
if(recvfrom(socket_fd, buffer, 2, 0, 
      (struct sockaddr*)&dest_addr, &len) == -1) 

您還構建您發送一個無效的數組,你的陣列具有1的長度,但你說的sendto/recvfrom的,它具有2的長度,從而改變

char buffer[1] = "s"; 

char buffer[] = "s"; 

(字符串 「s」 爲字符 's' 和一個0字節,所以buffer將具有長度2在後者的情況下。)

+0

非常感謝你:D。現在它工作:)。 – leiseliesel

-1

在Fedora 18 Beta版recv/recvmsg/recv從主要頁面引用:

ssize_t recv(int sockfd, void *buf, size_t len, int flgags); 
ssize_t recvfrom(int sockfd, void*buf, size_t len, int flags, 
     struct sockaddr *src_addr, socklen_t* addrlen); 

recvfrom應調整來自:

recvfrom(socket_fd, buffer, 2, 0, (struct sockaddr*)&dest_addr, 
      (unsigned int *)sizeof(struct sockaddr_in) == -1) 

要:

recvfrom (socket_fd, buffer, sizeof(buffer), 0, 
      (struct sockaddr*)&dest_addr, &addrlen); 
  • 你不初始化dest_addr
  • 陣列(eg _buffer_)始終是指針類型
  • 緩衝區在生產程序中必須大於(動態調整大小),否則緩衝區的固定大小將成爲堆棧粉碎(安全漏洞)的目標。
相關問題