2017-09-18 2 views
0

私はWindowsソケットプログラミングを初めて利用しています。私はポートを介してudpデータを提供するデバイス、ipv6プロトコルに基づいています。私はWindows 7のビジュアルスタジオで書かれたコンソールアプリケーションでこれをキャプチャしようとしています。ソケットの作成とバインドは成功しましたが、指定されたポートからは何も受信されません。Windowsのソケットプログラムでudpデータが受信されない

私は基本的にLinuxシステムソフトウェア開発者であり、完璧に動作しているので、Linuxでこれを行っています。 WindowsでUDPパケットを取得するために必要なことは他にありますか?私はWindowsでwiresharkをチェックし、UDPパケットがデバイスからPCに送信されていることがわかりました。 Linuxでの完了

ワーキングコード:Windowsで

int main() 
{ 
     struct sockaddr_in6 ipv6_addr; 
     int addrlen, ipv6_sockfd, cnt, err; 
     char response[200], cmd[500]; 
     cJSON *param, *root; 

     memset(response, 0, sizeof(response)); 
     ipv6_sockfd = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP); 
     if (ipv6_sockfd < 0) { 
      perror("socket"); 
      exit(1); 
     } 

     bzero((char *)&ipv6_addr, sizeof(ipv6_addr)); 
     ipv6_addr.sin6_family = AF_INET6; 
     ipv6_addr.sin6_addr = in6addr_any; 
     ipv6_addr.sin6_port = htons(DISCOVERY_PORT); 
     addrlen = sizeof(ipv6_addr); 

     if (bind(ipv6_sockfd, (struct sockaddr *)&ipv6_addr, sizeof(ipv6_addr)) < 0) { 
      perror("bind"); 
      exit(1); 
     } 

     cnt = recvfrom(ipv6_sockfd, response, sizeof(response), 0, (struct sockaddr *)&ipv6_addr, &addrlen); 
     if (cnt < 0) { 
      perror("recvfrom"); 
      exit(1); 
     } 

     DBG("Response = \"%s\"\n", response); 
     close(ipv6_sockfd); 
} 

コード:

#include "stdafx.h" 
#include <winsock2.h> 
#include <ws2tcpip.h> 
#include <stdio.h> 

#define DISCOVERY_PORT 13006 
#define DEFAULT_BUFLEN 512 

#include <WinSock2.h> 
#pragma comment(lib,"ws2_32.lib") 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    //UDP Data 
    int addrlen, msglen; 
    char message[300]; 
    int err, opt = 1; 
    SOCKET s; 
    struct sockaddr_in6 hum, addr; 

    //Initializing winsock 
    WSADATA wsa; 
    err = WSAStartup(MAKEWORD(2, 2), &wsa); 
    if (err != 0) 
    { 
     printf("\nFailed Initializing Winsock EROR CODE : %d\n", err); 
     return 1; 
    } 

    //UDP Socket creation 
    s = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP); 
    if (s == INVALID_SOCKET) 
    { 
     printf("\nUDP socket creation failed ERROR CODE : %d\n", WSAGetLastError()); 
     closesocket(s); 
     WSACleanup(); 
     return 1; 
    } 

    //UDP socket definition 
    memset(&hum, 0, sizeof(addr)); 
    hum.sin6_family = AF_INET6; 
    hum.sin6_addr = in6addr_any; 
    hum.sin6_port = htons(DISCOVERY_PORT); 

    //UDP SOCKET Binding 
    if (bind(s, (sockaddr *)&hum, sizeof(hum)) == SOCKET_ERROR) 
    { 
     printf("\nUDP socket binding failed ERROR CODE : %d\n", WSAGetLastError()); 
     closesocket(s); 
     WSACleanup(); 
     return 1; 
    } 

    //UDP Receiving data 
    addrlen = sizeof(addr); 
    msglen = recvfrom(s, message, sizeof(message), 0, (struct sockaddr *)&addr, &addrlen); 
    if (msglen == SOCKET_ERROR) 
    { 
     printf("\nUDP Broadcast not received ERROR CODE : %d\n", WSAGetLastError()); 
     closesocket(s); 
     WSACleanup(); 
     return 1; 
    } 

    printf("\nMessage: %s\n", message); 
    return 0; 
} 
+2

ファイアウォールの設定についてあなたはそれらをチェックしましたか? –

+0

私はWindowsファイアウォールを無効にしてテストしましたが、まだ無力です。 – Rouf

答えて

0

私はスマートフォンから、マウスとキーボードの入力を処理するためのUDPプロトコル(オーバークライアント - サーバ接続を実装しました)、唯一の違いはipv4を代わりに使用したことです。同じこと - それはLinux上で完璧に働いていましたが、ウィンドウでは受信パケットが見えませんでした。

私にとっては、プログラムを管理者として実行し、手動でファイアウォールのアクセス許可に追加することでした。一般的に、これは一部のWindows PCでは安定していませんでしたが、C:\ Program Filesにサーバーのパートプログラムをインストールした後、多かれ少なかれ動作し始めました。

関連する問題