2014-02-22 187 views
1
#include <stdio.h> 
#include <sys/socket.h> 
#include <netdb.h> 

int main() { 
    char buf[4] = { 0xff, 0xff, 0xff, 0xff }; 
    struct addrinfo adr, *res; 
    adr.ai_family = AF_INET; 
    adr.ai_socktype = SOCK_DGRAM; 
    getaddrinfo ("192.168.1.1", NULL, &adr, &res); 
    int sd = socket (res->ai_family, res->ai_socktype, res->ai_protocol); 
    if (sendto (sd, buf, sizeof (buf), MSG_OOB, res->ai_addr, res->ai_addrlen) < 0) 
      perror ("ERROR sendto"); //I have added an if tag and an error message posiblility 
    return 0; 
} 

ERROE SENDTO:不支持的操作Linux UDP客戶端,如何?

這是所有的消息。 beej的指南網絡編程,我已經讀了getaddrinfo的第二個參數是NULL,並且我編譯了它,它會很好,這一行沒有問題。現在,問題是操作不支持的錯誤消息。

+1

你在哪裏指定目標端口? – hek2mgl

+2

你應該看看'sendto'之類的東西的返回值,並適當地檢查'errno'。 – Joe

+0

請檢查http://www.abc.se/~m6695/udp.html – hek2mgl

回答

3

似乎有幾個錯誤。

首先,我相信MSG_OOB對於UDP是非法的。這可能是錯誤信息試圖說的。改爲嘗試0。

然後,getaddrinfo()調用看起來很奇怪(至少我不明白這一點)。你說「我編譯它,這將是好的,沒有問題,這條線」,但你沒有錯誤處理,以證明它...

我的直覺是,地址或端口的您在sendto()中使用的套接字地址不正確,並且在修復MSG_OOB後仍然會出現錯誤。是不是有一個原因,你不只是像here手動設置 - 你想讓getaddrinfo()爲你選擇一個合適的端口?我不認爲這是可行的:

如果服務爲NULL,則返回的套接字 地址的端口號將保持未初始化狀態。