2017-09-18 22 views
0

Windows 소켓 프로그래밍을 처음 사용합니다. 나는 ipv6 프로토콜 기반의 포트를 통해 UDP 데이터를 제공하는 장치를 가지고 있습니다. Windows 7의 Visual Studio로 작성된 콘솔 응용 프로그램에서이 내용을 캡처하려고합니다. 소켓 만들기 및 바인딩은 성공적이지만 지정된 포트에서 아무 것도 수신되지 않습니다.udp 데이터가 Windows 소켓 프로그램에 수신되지 않음

기본적으로 리눅스 시스템 소프트웨어 개발자이기 때문에 Linux에서이 작업을 수행했으며 완벽하게 작동합니다. Windows에서 UDP 패킷을 얻으려면 다른 방법이 있습니까? Windows에서 wireshark를 검사하여 UDP 패킷이 장치에서 PC로 전송되고 있음을 확인했습니다.

작업 코드는 리눅스에 완료 :

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에서 : 나는 스마트 폰에서 마우스와 키보드 입력을 처리하기 위해 (UDP 프로토콜을 통해 클라이언트 - 서버 연결을 구현했습니다

#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

), 유일한 차이점은 ipv4를 대신 사용한다는 것입니다. 똑같은 일은 리눅스에서 완벽하게 작동하지만 윈도우에서는 들어오는 패킷을 보지 못했습니다.

나에게 효과가 있었던 것은 관리자로 프로그램을 실행하고 수동으로 방화벽의 권한에 추가하는 것이 었습니다. 일반적으로 이것은 일부 Windows PC에서는 안정적이지 않지만 C : \ Program Files에 내 서버 부품 프로그램을 설치 한 후 더 이상 작동하지 않습니다.