2015-12-03 2 views
0

На моем сервере у меня есть этот код в данный момент:C - сокет программирования клиент-сервер - Подключение по имени хоста

 #define h_addr h_addr_list[0] 

     serverAddr.sin_port = htons(port); 

     /* Set IP address to localhost */ 
     hostname[1023] = "\0"; 
     gethostname(hostname, 1023); 
     printf("HostName: %s\n", hostname); // this one prints correctly 

     my_hostent = gethostbyname(hostname); 
     printf("Host: %s\n", my_hostent->h_addr); 
     printf("IP: %c\n", inet_ntoa(my_hostent->h_addr)); 
     serverAddr.sin_addr.s_addr = *hostname; 

А на стороне клиента, у меня есть это, что вы должны написать хост в качестве параметра, поэтому я мог бы написать -h www.abc.com в этом примере, я позволю себе сказать, что мои серверные узлы также находятся на www.abc.com, но они никогда не общаются в данный момент, но когда я печатаю имя хоста, он говорит то же самое.

код клиента.

#define h_addr h_addr_list[0] 

struct hostent *server; 

server = gethostbyname(hostname); 
serverAddr.sin_addr.s_addr = server->h_addr; 

переменная «hostname» является параметром из начала программы.

это ошибка клиента:

warning: assignment makes integer from pointer without a cast 
    serverAddr.sin_addr.s_addr = server->h_addr; 

это ошибки сервера:

server.c:42:18: warning: assignment makes integer from pointer without a cast 
    hostname[1023] = "\0"; 
       ^
server.c:43:3: warning: implicit declaration of function ‘gethostname’ [-Wimplicit-function-declaration] 
    gethostname(hostname, 1023); 
^
server.c:48:3: warning: implicit declaration of function ‘inet_ntoa’ [-Wimplicit-function-declaration] 
    printf("IP: %c\n", inet_ntoa(lol->h_addr)); 
^

Может кто-нибудь увидеть, что мой отказ с розетками и соединив их вместе?

На данный момент, если я поставил обе стороны INADDR_ANY он будет работать и автоматически подключаться,

+0

пытался также делать: serverAddr.sin_addr.s_addr = lol-> h_addr; но он говорит, что я делаю целое число из указателя без приведения –

ответ

2

Проблема заключается в том, что serverAddr.sin_addr.s_addr является uint32_t и server->h_addr является char *.

h_addr поле фактически является псевдонимом для h_addr_list[0], где h_addr_list является char **. Это поле указывает на массив адресных структур, который может быть либо struct in_addr, либо struct in6_addr.

В случае gethostbyname, это будет struct in_addr, так что вам нужно, чтобы бросить его в том, что и назначить его serverAddr.sin_addr вместо serverAddr.sin_addr.s_addr:

serverAddr.sin_addr = *((struct in_addr *)server->h_addr); 

Это не является допустимым заявление:

hostname[1023] = "\0"; 

Что вы хотите, это:

char hostname[1023] = {0}; 

Это инициализирует весь массив нулями.

2
server.c:42:18: warning: assignment makes integer from pointer without a cast 
    hostname[1023] = "\0"; 
       ^

"\0" является строка, представляющая буквальным массив из двух const char с, как ноль. В вашей инструкции присваивания, как и в большинстве других контекстов, выражение преобразуется в указатель на первый символ. Очевидно, hostname является массивом char или char *, так что hostname[1023] является lvalue, представляющим один char. Вы пытаетесь присвоить этому символу указатель char.

Вы хотите полукокса буквального вместо:

hostname[1023] = '\0'; 

или, что то же самое, только

hostname[1023] = 0; 
server.c:43:3: warning: implicit declaration of function ‘gethostname’ [-Wimplicit-function-declaration] 
    gethostname(hostname, 1023); 
^
server.c:48:3: warning: implicit declaration of function ‘inet_ntoa’ [-Wimplicit-function-declaration] 
    printf("IP: %c\n", inet_ntoa(lol->h_addr)); 
^

Вы не смогли #include заголовки объявления функций gethostname() и inet_ntoa(). В системе POSIX, это будут

#include <unistd.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
Смежные вопросы