안녕하세요, 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와 다르다고 가정하고있다. 나는 틀린가? 어쨌든 그건 저의 두 가지 질문입니다.
도움 주셔서 감사합니다.
내가 왜 투표를 중단 했습니까? 나는이 질문에 대해 어디에서 다른 질문을 할 것인가? –