2017-09-18 45 views
0

我是Windows套接字编程的新手。我有一个设备通过基于ipv6协议的端口提供udp数据。我试图在Windows 7的Visual Studio中编写的控制台应用程序中捕获此信息。套接字创建和绑定成功,但没有收到指定的端口。在Windows套接字程序中未收到udp数据

我已经在Linux中完成了这个工作,因为我基本上是一个Linux系统软件开发人员,它工作的很完美。还有什么我需要做的,以获得窗口中的UDP数据包。我在windows中使用wireshark进行了检查,发现UDP数据包是从设备传送到PC的。

工作代码实现在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); 
} 

代码在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

Ho关于你的防火墙设置?你检查过那些吗? –

+0

我已通过禁用Windows防火墙测试,但仍然无奈.. – Rouf

回答

0

我实现了基于UDP协议的客户端 - 服务器连接(从智能手机操作鼠标和键盘输入),唯一的区别是我用ipv4代替。同样的事情 - 它完全在linux上工作,但在Windows上我没有看到任何传入的数据包。

对我来说,这件事是以管理员身份运行程序,并手动将其添加到防火墙的权限。一般来说,这在某些Windows PC上并不稳定,但在将我的服务器零件程序安装到C:\ Program Files后,它已开始工作或多或少。