2016-04-12 52 views
0

sendto関数に問題があります。私はUDPサーバーから時間を得たいです。このような私のコード:sendto関数がエラーを返す - ウィンドウ上のUDPソケット

unsigned char msg[48]={010,0,0,0,0,0,0,0,0}; 
char* hostname=(char *)"tick.usno.navy.mil"; 
sockaddr_in server_addr; 
WSAData data; 
int result=WSAStartup(MAKEWORD(2, 2), &data); 
if (result != NO_ERROR) { 
    printf("WSAStartup failed with error: %d\n", result); 
    return 1; 
} 
int client_s = socket(AF_INET, SOCK_DGRAM,IPPROTO_UDP); 
if (client_s == INVALID_SOCKET) { 
    printf("socket failed with error: %ld\n", WSAGetLastError()); 
    WSACleanup(); 
    return 1; 
} 
unsigned short Port = 123; 
server_addr.sin_family = AF_INET;     // Address family to use 
server_addr.sin_port = htons(Port);   // Port num to use 
server_addr.sin_addr.s_addr = inet_addr(hostname); // IP address to use 
char out_buf[BUFFER_SIZE]; 
int retcode = sendto(client_s, reinterpret_cast<const char*>(msg), sizeof(msg), 0,(struct sockaddr *)&server_addr, sizeof(server_addr)); 
perror("sendto:"); 
if (retcode == SOCKET_ERROR) { 
    printf("sendto failed with error: %d\n", WSAGetLastError()); 
    closesocket(client_s); 
    WSACleanup(); 
    return 1; 
} 

私の出力は以下のようである:私はRECVとreciveデータをしようとすると

sendto:: No error 
sendto failed with error: 10013 

、私は間違って何かを得ました。私は、C + +のWindows上でUDPサーバーから時間を取得したい。ここで問題はどこですか?なぜ1つのエラーがエラーと1つのエラー10013と言って、どうすればそれを修正できますか?

+0

あなたの問題とは関係ありませんが、値 '010'は* decimal * tenではないことがわかりますか?これは8進数で、10進値は「8」です。 –

+1

'inet_addr'の結果を確認し、[そのドキュメント](https://msdn.microsoft.com/en-us/library/windows/desktop/ms738563(v=vs.85).aspx)を読むべきです。 。 (ヒント:それはホスト名を解決するための機能ではありません) – molbdnilo

答えて

1

古い回答(以下に記載されています)は情報ですが、この場合は正しくありません。

問題が最も可能性の高い次の2行

char* hostname=(char *)"tick.usno.navy.mil"; 
... 
server_addr.sin_addr.s_addr = inet_addr(hostname); // IP address to use 

inet_addr機能はドット区切りのIPv4アドレスを期待しています。未解決のホスト名ではありません。有効なIPv4ドット付き10進アドレスが指定されていない場合、この関数は有効なアドレスではないINADDR_NONEを返します。 sendto。質問でエラーが報告されますか?私は正直には分かりませんが、期待どおりにはうまくいかないでしょう。

ホスト名をIPアドレスに解決するには、getaddrinfoを使用する必要があります。リンクされたリファレンスには、それを使用する方法の例も含まれています。


エラー10013は、たとえば次のように表示されます。 this Windows socket error referenceWSAEACCESS、権限の問題があることを示します。少し検索すると、1024のポートがシステム用に予約されており、そのポートを使用するには特権が必要です。

NTPサーバーまたはクライアントを作成する場合は、アクセス権の昇格などを使用してプログラムを実行する必要があります。 「管理者として実行」を使用します。それはあなたが無条件sendto後に呼び出すperror呼び出しから来たメッセージ

 
sendto:: No error 

については


。まずWindows上では、ソケット機能はperrorが使用するerrnoを設定しません。第2に、以前の呼び出しが実際に失敗しなかった場合、errnoの状態は未定義です。

無条件で使用しないでください。Windowsソケット関数には使用しないでください。

+0

あなたはまだポート123に送ることができるはずです。 – molbdnilo

+0

私は管理者として実行する場合は同じです。あなたはペルーのために正しいです。読んでいないerrnoはLinuxのみです。 –

+0

@neiiic私の答えを更新しました –

関連する問題