2017-09-18 8 views
0

Je suis nouveau dans la programmation de socket Windows. J'ai un périphérique qui donne des données udp via un port basé sur le protocole ipv6. J'essaye de capturer ceci dans une application de console écrite dans le studio visuel dans Windows 7. La création de douille et la liaison sont réussies mais rien n'est reçu du port indiqué.Données udp non reçues dans le programme de socket Windows

Je l'ai fait sous Linux depuis que je suis fondamentalement un développeur de logiciels système Linux et qu'il fonctionne parfaitement. Y at-il autre chose que je dois faire pour obtenir des paquets UDP dans Windows. J'ai vérifié avec wireshark dans Windows et constaté que les paquets UDP viennent de l'appareil au PC.

code de travail Fait sous Linux:

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); 
} 

code dans Windows:

#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

Quels sont les paramètres de votre pare-feu? Avez-vous vérifié ceux-ci? –

+0

J'ai testé en désactivant le pare-feu de Windows, mais toujours impuissant .. – Rouf

Répondre

0

J'ai mis en place une connexion client-serveur via le protocole udp (pour la manipulation de la souris et le clavier du téléphone intelligent), la seule différence est que j'ai utilisé ipv4 à la place. Même chose - ça fonctionnait parfaitement sur Linux, mais sur Windows je n'ai vu aucun paquet entrant. La chose qui a fonctionné pour moi était d'exécuter le programme en tant qu'administrateur et également l'ajouter manuellement aux permissions du pare-feu. En général, ce n'était pas stable sur certains PC Windows, mais après l'installation de mon programme de pièce serveur à C: \ Program Files, il a commencé à fonctionner plus ou moins bien.