2014-03-07 2 views
0

나는 그것을 잘 컴파일 Microsoft에서 ++ 예를 들어이 소켓 C를 실행하려고하지만 클릭하면이 첫 번째 줄 // Validate the parameters에 중지 실행하고 단지 내가 뭔가를소켓 예제 실행 방법 C++?

#undef UNICODE 

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

// link with Ws2_32.lib 
#pragma comment(lib, "Ws2_32.lib") 

int __cdecl main(int argc, char **argv) 
{ 

    //----------------------------------------- 
    // Declare and initialize variables 
    WSADATA wsaData; 
    int iResult; 
    INT iRetval; 

    DWORD dwRetval; 

    int i = 1; 

    struct addrinfo *result = NULL; 
    struct addrinfo *ptr = NULL; 
    struct addrinfo hints; 

    struct sockaddr_in *sockaddr_ipv4; 
    // struct sockaddr_in6 *sockaddr_ipv6; 
    LPSOCKADDR sockaddr_ip; 

    char ipstringbuffer[46]; 
    DWORD ipbufferlength = 46; 

    // Validate the parameters 
    if (argc != 3) { 
     printf("usage: %s <hostname> <servicename>\n", argv[0]); 
     printf("  provides protocol-independent translation\n"); 
     printf("  from an ANSI host name to an IP address\n"); 
     printf("%s example usage\n", argv[0]); 
     printf(" %s www.contoso.com 0\n", argv[0]); 
     return 1; 
    } 

    // Initialize Winsock 
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData); 
    if (iResult != 0) { 
     printf("WSAStartup failed: %d\n", iResult); 
     return 1; 
    } 

    //-------------------------------- 
    // Setup the hints address info structure 
    // which is passed to the getaddrinfo() function 
    ZeroMemory(&hints, sizeof(hints)); 
    hints.ai_family = AF_UNSPEC; 
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_protocol = IPPROTO_TCP; 

    printf("Calling getaddrinfo with following parameters:\n"); 
    printf("\tnodename = %s\n", argv[1]); 
    printf("\tservname (or port) = %s\n\n", argv[2]); 

    //-------------------------------- 
    // Call getaddrinfo(). If the call succeeds, 
    // the result variable will hold a linked list 
    // of addrinfo structures containing response 
    // information 
    dwRetval = getaddrinfo(argv[1], argv[2], &hints, &result); 
    if (dwRetval != 0) { 
     printf("getaddrinfo failed with error: %d\n", dwRetval); 
     WSACleanup(); 
     return 1; 
    } 

    printf("getaddrinfo returned success\n"); 

    // Retrieve each address and print out the hex bytes 
    for(ptr=result; ptr != NULL ;ptr=ptr->ai_next) { 

     printf("getaddrinfo response %d\n", i++); 
     printf("\tFlags: 0x%x\n", ptr->ai_flags); 
     printf("\tFamily: "); 
     switch (ptr->ai_family) { 
     case AF_UNSPEC: 
      printf("Unspecified\n"); 
      break; 
     case AF_INET: 
      printf("AF_INET (IPv4)\n"); 
      sockaddr_ipv4 = (struct sockaddr_in *) ptr->ai_addr; 
      printf("\tIPv4 address %s\n", 
       inet_ntoa(sockaddr_ipv4->sin_addr)); 
      break; 
     case AF_INET6: 
      printf("AF_INET6 (IPv6)\n"); 
      // the InetNtop function is available on Windows Vista and later 
      // sockaddr_ipv6 = (struct sockaddr_in6 *) ptr->ai_addr; 
      // printf("\tIPv6 address %s\n", 
      // InetNtop(AF_INET6, &sockaddr_ipv6->sin6_addr, ipstringbuffer, 46)); 

      // We use WSAAddressToString since it is supported on Windows XP and later 
      sockaddr_ip = (LPSOCKADDR) ptr->ai_addr; 
      // The buffer length is changed by each call to WSAAddresstoString 
      // So we need to set it for each iteration through the loop for safety 
      ipbufferlength = 46; 
      iRetval = WSAAddressToString(sockaddr_ip, (DWORD) ptr->ai_addrlen, NULL, 
       ipstringbuffer, &ipbufferlength); 
      if (iRetval) 
       printf("WSAAddressToString failed with %u\n", WSAGetLastError()); 
      else  
       printf("\tIPv6 address %s\n", ipstringbuffer); 
      break; 
     case AF_NETBIOS: 
      printf("AF_NETBIOS (NetBIOS)\n"); 
      break; 
     default: 
      printf("Other %ld\n", ptr->ai_family); 
      break; 
     } 
     printf("\tSocket type: "); 
     switch (ptr->ai_socktype) { 
     case 0: 
      printf("Unspecified\n"); 
      break; 
     case SOCK_STREAM: 
      printf("SOCK_STREAM (stream)\n"); 
      break; 
     case SOCK_DGRAM: 
      printf("SOCK_DGRAM (datagram) \n"); 
      break; 
     case SOCK_RAW: 
      printf("SOCK_RAW (raw) \n"); 
      break; 
     case SOCK_RDM: 
      printf("SOCK_RDM (reliable message datagram)\n"); 
      break; 
     case SOCK_SEQPACKET: 
      printf("SOCK_SEQPACKET (pseudo-stream packet)\n"); 
      break; 
     default: 
      printf("Other %ld\n", ptr->ai_socktype); 
      break; 
     } 
     printf("\tProtocol: "); 
     switch (ptr->ai_protocol) { 
     case 0: 
      printf("Unspecified\n"); 
      break; 
     case IPPROTO_TCP: 
      printf("IPPROTO_TCP (TCP)\n"); 
      break; 
     case IPPROTO_UDP: 
      printf("IPPROTO_UDP (UDP) \n"); 
      break; 
     default: 
      printf("Other %ld\n", ptr->ai_protocol); 
      break; 
     } 
     printf("\tLength of this sockaddr: %d\n", ptr->ai_addrlen); 
     printf("\tCanonical name: %s\n", ptr->ai_canonname); 
    } 

    freeaddrinfo(result); 
    WSACleanup(); 

    return 0; 
} 

답변

0
if (argc != 3) 

이 프로그램은 두 개의 명령 줄 인수 인 <hostname> <servicename>을 사용합니다.

중 하나는 :

A) 실행 직접하지 디버거의 명령 줄 (에서 프로그램), 그리고 인수를 제공합니다. 예 :

C:\somewhere\> sampleprogram.exe example.com 80 

B) 편집 디버깅 옵션은 일부 인수를 사용하여 프로그램을 시작합니다.

  1. Visual Studio에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다.
  2. 디버깅 페이지 (왼쪽에 있음)를 선택하십시오.
  3. 명령 인수 필드를 편집하십시오.

enter image description here

2
if (argc != 3) { 
     printf("usage: %s <hostname> <servicename>\n", argv[0]); 
     printf("  provides protocol-independent translation\n"); 
     printf("  from an ANSI host name to an IP address\n"); 
     printf("%s example usage\n", argv[0]); 
     printf(" %s www.contoso.com 0\n", argv[0]); 
     return 1; 
    } 

argc 카운트를 놓치지 않았다 물어보고 싶은 중지하고 프로그램에 부여한 명령 행 인수의 수. 프로그램이 이름을 전달한 이후로 항상 1 이상이되지만이 프로그램에는 두 개의 매개 변수가 더 필요합니다. printf과 같이 호스트 이름과 서비스 이름이 필요합니다.

This StackOverflow answer은 디버깅하려는 프로그램에 명령 줄 인수를 설정하는 방법을 보여줍니다.