LinuxForum.Fans
Тема

Программирование сокетов

Автор: Nixel 4 сообщений 3330 просмотров
#17416

Привет всем. Начал изучать программирование сокетов в линух и столкнулся с одной проблемой, вот часть листинга:

text
....

#define PORTNUM 13000 #define HOSTLEN 256 #define oops(msg) {perror(msg);exit(1);}

int main(int ac, char *av[]){ struct sockaddr_in saddr; struct hostent *hp; char hostname[HOSTLEN]; int sock_id, sock_fd; FILE *sock_fp; time_t thetime;

if ((sock_id = socket(PF_INET, SOCK_STREAM, 0)) == -1)oops("socket"); bzero ((void*)&saddr, sizeof(saddr)); gethostname (hostname, HOSTLEN); hp = gethostbyname(hostname); printf("After gethostbyname!");

.....

проблема в состоит в том, что функция gethostbyname(hostname) не работает.
Сообщение "After gethostbyname!" не будет распечатанно из-за того что програма остановится на данной функции и не захочет идти дальше!

вставлял вместо gethostname (hostname, HOSTLEN); вот это strcpy(hostname, "127.0.0.1"), результат все тот-же!!! (((

Помогите решить проблему!

g++ (GCC) 4.4.3
Linux debian 2.6.26-2-amd64

Заранее спасибо за помощь!!

#17743

Попробуйте скомпилировать и прогнать вот это:

text

#include <stdio.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <strings.h>
#include <arpa/inet.h>

struct hostent *he; struct in_addr a;

int main (int argc, char **argv) { if (argc != 2) { fprintf(stderr, "usage: %s hostname\n", argv[0]); return 1; } he = gethostbyname (argv[1]); if (he) { printf("name: %s\n", he->h_name); while (*he->h_aliases) printf("alias: %s\n", *he->h_aliases++); while (*he->h_addr_list) { bcopy(*he->h_addr_list++, (char *) &a, sizeof(a)); printf("address: %s\n", inet_ntoa(a)); } } else herror(argv[0]); return 0; }

Модифицировал пример исходя из присланного Вами куска кода - все работает.

#17774

При запуске с параметром "localhost" выдал следующее:

text
user@debian:~/project/c++/socket$ ./prog localhost
name: localhost
address: 127.0.0.1

А если с параметром "debian" то вот что:

text
user@debian:~/project/c++/socket$ ./prog debian   
name: debian.domain.name
alias: debian
address: 127.0.1.1

тоесть как я понял в данном примере ф-ия "gethostbyname()" вернула результат, а что же не так в моем примере? и что нужно сделать?

И еще, если в вашем примере в параметре передать всякую ерунду, например "qwerty", то после прохождения условия "if (he)" выполнение программы пойдет по ветви else, при этом "herror(argv[0]);" выдаст "./prog: Unknown host";
А если в моем примере передать функции неверное значение, например ту же строку "qwerty", то сразу-же произойдет ошибка сегментирования, причем в самой функции gethostbyname, т.к. дальнейшее выполнение программы прекращается и не выполнится printf следующий за gethostbyname!

Вот мои инклуды:

text
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#17836

Вот честно говоря, не знаю... Можете мне сбросить в личку ВЕСЬ ваш код?

Войдите или зарегистрируйтесь, чтобы ответить.