2012-02-05 12 views
0

안녕하세요, getaddrinfo()에서 IP 주소를 가져 와서 바인딩하는 간단한 서버를 만들려고합니다. ifconfig를 사용하여, 내가 바운드하고 싶은 wlan0 192.168.2.10의 ip 주소를 찾았습니다. 불행히도 제가 구속력이있는 것 같은 주소는 내 장치입니다. 어떤 이유로 getaddrinfo ("192.168.2.10", "3490", & hings, & res)를 초기화 할 때; res는 NULL 포인터로 리턴된다. 나는 그의 코드를 과시 할 것이다.우분투의 특정 IP에 바인딩

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netdb.h> 
#include <arpa/inet.h> 
#include <signal.h> 

#define MAXDATASIZE 500; 

int main(int argc, char *argv[]){ 
    // dealing with client socket 
    struct sockaddr_storage their_addr; 
    socklen_t addr_size; 
    // server socket 
    struct addrinfo serverSide,*serverInfo,*sortIP; 
    int optValRet; 
    int listenSock, newSock; 
    // this is for reading in information 
    char buf[501]; 
    char point[INET6_ADDRSTRLEN]; 
    char compare[INET6_ADDRSTRLEN] = "192.168.2.10"; 
    // this is for handeling child processes and signals 
    struct sigaction sa; 
    sa.sa_handler = NULL; 
    sigemptyset(&sa.sa_mask); 
    sa.sa_flags = SA_RESTART; 
    if(sigaction(SIGCHLD, &sa, NULL) == -1){ 
     printf("We have a problem, sigaction is not working.\n"); 
     perror("\n"); 
     exit(1);  
    } 
    // this sets up addrinfo 
    memset(&serverSide, 0, sizeof serverSide); 
    serverSide.ai_family = AF_UNSPEC; 
    serverSide.ai_socktype = SOCK_STREAM; 
    serverSide.ai_flags = INADDR_ANY; 
    // set up the address 
    if(getaddrinfo("192.168.2.10","3490",&serverSide,&serverInfo)!=0){ 
     printf("get addr not success\n"); 
     perror("\n"); 
     return 1; 
    } 

    printf("Got address lists\n"); 

    for(sortIP = serverInfo; sortIP = sortIP->ai_next; sortIP != NULL){ 

     if((listenSock = socket(sortIP->ai_family, sortIP->ai_socktype, sortIP->ai_protocol))==-1){ 
      continue; 
     } 
     if(setsockopt(listenSock,SOL_SOCKET,SO_REUSEADDR,&optValRet,sizeof(int))==-1){ 
      perror("\n"); 
      exit(1); 
     } 
     if(bind(listenSock,sortIP->ai_addr,sortIP->ai_addrlen) == -1){ 
      perror("\n"); 
      close(listenSock); 
      continue;  
     } 
     break; 
    } 
    if(sortIP == NULL){printf("sort ip is null.");} 
    inet_ntop(sortIP->ai_family,sortIP->ai_addr,point,sizeof point); 
    printf("Tell the clients connect to ip address %s on port 3490\n",point); 
    listen(listenSock, 10); 
    addr_size = sizeof their_addr; 
    newSock = accept(listenSock,(struct sockaddr *)&their_addr,&addr_size); 
    recv(newSock, buf, 500, 0); 
    printf("%s\n",buf); 
    close(listenSock); 
    close(newSock); 
    freeaddrinfo(serverInfo); 
    return 0; 
} 

이제 null을 반환한다는 사실 외에 다른 질문이 있습니다. wifi 라우터가 내 서브넷에 대해 192.168.2.10의 IP 주소를 할당했기 때문에 네트워크 외부에 있고 내 서버에 연결하려고하면 내 IP 주소가 무엇인지 어떻게 알 수 있습니까? 나는 내부 네트워크 IP가 외부 네트워크 IP와 다르다고 가정하고있다. 나는 틀린가? 어쨌든 그건 저의 두 가지 질문입니다.

도움 주셔서 감사합니다.

+0

내가 왜 투표를 중단 했습니까? 나는이 질문에 대해 어디에서 다른 질문을 할 것인가? –

답변

3

이 잘못하고 즉각적인 문제 : 당신은 같은 것을 원하는

for (sortIP = serverInfo; sortIP = sortIP->ai_next; sortIP != NULL) 

:

for (sortIP = serverInfo; sortIP != NULL; sortIP = sortIP->ai_next) 

을하지만 난 개인적으로 while 루프와 함께 갈 것입니다.

1

주 질문에 INADDR_ANY에 바인딩해야합니다. 그게 그 모든 혼란을 피합니다. 또한 :

recv(newSock, buf, 500, 0); 
printf("%s\n",buf); 

%s 형식 지정은 임의의 바이너리 데이터에 대한 아니에요, 단지 C 스타일의 문자열입니다. 또한 recv에서 반환 값을 버립니다. 받은 바이트 수를 알 수있는 다른 방법은 없습니다.

네트워크 외부에서 동적 IP 주소를 찾으려면 호스트 이름을 할당 한 수십 개의 IP 게시 서비스 중 하나를 사용하여 동적 IP 주소에 매핑하십시오.

관련 문제