Привязать к конкретному IP в C для Ubuntu - PullRequest
0 голосов
/ 05 февраля 2012

Привет. Я пытаюсь создать простой сервер, который получает IP-адрес от getaddrinfo () и привязывается к нему.Используя ifconfig, я обнаружил, что у меня есть IP-адрес wlan0 192.168.2.10, к которому я хотел бы привязаться.К сожалению, адрес, к которому я, кажется, привязываю, является моим устройством.По какой-то причине, когда я инициализирую getaddrinfo («192.168.2.10», «3490», & hings, & res);Res возвращается к пустому указателю.Я покажу свой код ниже.

#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;
}

Теперь у меня есть еще несколько вопросов помимо того, что я возвращаю ноль.Так как маршрутизатор Wi-Fi назначил мне IP-адрес 192.168.2.10 для моей подсети, как мне узнать, какой у меня IP-адрес, если я нахожусь вне сети и пытаюсь связаться с моим сервером?Я предполагаю, что ip внутренней сети отличается от ip внешней сети ... я не прав?В любом случае, это мои два вопроса.

Спасибо за любую помощь!

Ответы [ 2 ]

3 голосов
/ 05 февраля 2012

Это неправильно и является вашей непосредственной проблемой:

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

Вы хотите что-то вроде:

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

, но я бы пошел с циклом while лично.

1 голос
/ 05 февраля 2012

К вашему основному вопросу, вы должны просто связать с INADDR_ANY. Это позволяет избежать всего этого беспорядка. Кроме того:

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

Спецификатор формата %s предназначен только для строк в стиле C, но не для произвольных двоичных данных. Также вы выбрасываете возвращаемое значение из recv. Нет другого способа узнать, сколько байтов вы получили.

Что касается поиска вашего динамического IP-адреса из-за пределов вашей сети, используйте любую из десятков служб публикации IP-адресов, которые присваивают вам имя хоста и сопоставляют его с вашим динамическим IP-адресом.

...