2012-02-05 21 views
0

您好我想作一个简单的服务器,在一个IP地址需要从getaddrinfo()和与之结合。使用ifconfig,我发现我有一个我想绑定到的wlan0 192.168.2.10的IP地址。不幸的是,我似乎要约束的地址是我的设备。因为当我初始化的getaddrinfo( “192.168.2.10”, “3490”,& hings,& RES)由于某种原因; res会返回到一个NULL指针。我会炫耀我的代码波纹管。绑定到下Ubuntu的一个特定的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路由器分配了我的IP地址192.168.2.10为我的子网,我怎么找到我的IP地址是什么,如果我是外网,并试图联系我的服务器?我假设内部网络IP不同于外部网络IP ...我错了吗?无论如何,这些是我的两个问题。

感谢您的帮助!

+0

为什么我下投票?我还会在哪里问这个问题? – 2012-02-05 04:05:54

回答

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地址。

相关问题