2009-07-11 3 views
0

그래도 C 소켓을 처음 사용하는 사람은 없지만 setsockopt를 실행하는 IP 주소를 추출하는 방법이 있는지 궁금합니다. 아래의 코드를 살펴보면 내 IP 주소 인 변수 mc_addr을 정의하는 것을 제외하고는 멀티 캐스트 소켓에있는 모든 것을 보낼 준비가되었습니다. 내가 잘못한 것이 진짜일까요? 그렇다면 언제든지 알려 주시기 바랍니다. 지금 당장은 주로 mc_addr 변수를 채우는 것에 관심이 있습니다. 나는 C 언어 (C#, Python, C++, 그리고 이번 여름의 시작부터 Objectove-C)에 프로그램 한 적이 없기 때문에 C 언어에 대해 알고 있어야하고 도움을 구하는 모든 것을 모른다.C 소켓에서 IP 주소 추출하기

File.h

#define MYPORT 5673   /* port for our multicast socket */ 

int sock;     /* socket descriptor */ 
char send_str[MAX_LEN];  /* string to send */ 
struct sockaddr_in mc_addr; /* socket address structure */ 
unsigned int send_len;  /* length of string to send */ 
char* mc_addr_str;   /* multicast IP address */ 
unsigned short mc_port;  /* multicast port */ 
unsigned char mc_ttl;  /* time to live (hop count) */ 

file.c는 여기

mc_port = MYPORT; 
/* create a socket for sending to the multicast address */ 
if ((sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { 
    NSLog(@"ERROR: broadcastMessage - socket() failed"); 
    return 1; 
} 

/* set the TTL (time to live/hop count) for the send */ 
if ((setsockopt(sock, IPPROTO_IP, IP_MULTICAST_TTL, 
     (void*) &mc_ttl, sizeof(mc_ttl))) < 0) { 
    NSLog(@"ERROR: broadcastMessage - setsockopt() failed"); 
    return 1; 
} 

// define the IP address we will be using 
mc_addr = // ??? 

/* construct a multicast address structure */ 
memset(&mc_addr, 0, sizeof(mc_addr)); 
mc_addr.sin_family  = AF_INET; 
mc_addr.sin_addr.s_addr = inet_addr(mc_addr_str); 
mc_addr.sin_port  = htons(mc_port); 

/* clear send buffer */ 
memset(send_str, 0, sizeof(send_str)); 

while (fgets(send_str, MAX_LEN, stdin)) { 
    send_len = strlen(send_str); 

    /* send string to multicast address */ 
    if ((sendto(sock, send_str, send_len, 0, 
      (struct sockaddr *) &mc_addr, sizeof(mc_addr))) != send_len) { 
     NSLog(@"ERROR: broadcastMessage - sendto() sent incorrect number of bytes"); 
     return 1; 
    } 

    /* clear send buffer */ 
    memset(send_str, 0, sizeof(send_str)); 
} 

close(sock); 
return 0; 
+0

http://stackoverflow.com/questions/236231/how-do-i-choose-a-multicast-address-for-my-applications-use – mark4o

답변

2

"우리가 사용할 IP 주소를 정의하십시오."여기서 mc_addr_str (mc_addr_str을 기반으로 이미있는 코드로 mc_addr 자체가 채워져 있음)을 설정해야합니다. 같은 뭔가 :

mc_addr_str = "239.20.30.40"; 

정말 당신이 선택하는 주소를 멀티 캐스트 (Multicast) 란 무엇인가 당신에게 달려 - 난 그냥 밖으로 집어 내가 거기에 넣어 한 사람이 범위를 "관리적 범위". 클라이언트와 서버는 미리 동의해야합니다 (또는 클라이언트가 서버 유니 캐스트에 접속하여 어떤 멀티 캐스트 주소를 구독해야하는지 묻는 것처럼 다른 방식으로 협상해야합니다).

This site이 도움이 될 수 있습니다.

+0

방금이 코드를 작성하면 어떻게됩니까? 나는 그것이 효과가있을 것이라고 확신하지만, 나는 단지 확인하고 싶다. mc_addr = IN_ADDR_ANY; –

+0

아니요, 멀티 캐스트 대상 주소로 설정해야하며 IN_ADDR_ANY은 멀티 캐스트 대상이 아닙니다. (mc_addr은 대상 주소입니다. 원본 주소는 bind()에 의해 설정되지만 bind()는 호출하지 않으므로 가장 적합한 로컬 주소 만 사용하게됩니다. – caf

1

Multicast client example in C 및 다른 here이다.
첫 번째 예에서 해당 줄은 당신이 C을 이해하지 않고 C++에 프로그래밍 된 수 있는지 잘 모르겠습니다

saddr.sin_addr.s_addr = inet_addr("226.0.0.1"); //your mcast IP address 

입니다.

+0

그날 뒤로, 나는 C++과 C 모두를 프로그래밍하지 않고 이해 C. 분명히 이해하기 시작하면 분명히 코드가 훨씬 좋아졌습니다 .-) –