Программа клиент с сокетами несоединяется с сервером (Пишу сканер портов функция соединения неможет соединится с сервером)

Модератор: Модераторы разделов

Аватара пользователя
netelis
Сообщения: 95
ОС: Debian Wheezy i686

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

Сообщение netelis »

Пишу сканер портов функция соединения неможет соединится с сервером.
Компилируется и линкуется нормально без ошибок и предупреждений но несоединяется.
Коннектится только к хостам находящимся в локальной сети в частности к localhost.
Главный модуль
port_scanner.cpp

Код:

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <pthread.h> #include <ctype.h> #include "scan.h" void sock_connect(int i,char *hnm); pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; void *pthr1(void *a1); void *pthr2(void *a2); int ffd; struct hostent *htn; struct in_addr **adl; static char hnm[25]; static char hna[25]; int main(int argc,char **argv) { ffd=open("./hosts",O_RDWR); if(ffd<0) { perror("неможет открыть файл hosts"); exit(1); }; read(ffd,hnm,sizeof(hnm)); close(ffd); for(int hj=0;hj<=25;hj++) { if(isprint(hnm[hj])) { } else { hnm[hj]=(char)0; }; }; if((htn=gethostbyname(hnm))==NULL) { perror("gethostbyname"); exit(0); }; printf("hnm %s\n",hnm); adl=(struct in_addr **)htn->h_addr_list; static int hi; for(hi=0;adl[hi]!=NULL;hi++) { printf("%s\n",inet_ntoa(*adl[hi])); strcpy(hna,inet_ntoa(*adl[hi])); }; pthread_attr_t pa1,pa2; pthread_t pt1,pt2; void *arg1; void *arg2; pthread_attr_init(&pa1); pthread_attr_init(&pa2); int pr=pthread_create(&pt1,&pa1,pthr1,NULL); if(pr==0) { printf("Create a thread 1\n"); } else { perror("thread 1"); exit(1); }; sleep(10); pr=pthread_create(&pt2,&pa2,pthr2,NULL); if(pr==0) { printf("Create thread 2"); } else { perror("thread 2"); exit(2); }; for(;;){}; return 0; }; void *pthr1(void *) { for(int i=0;i<=10000;i+=2) { pthread_mutex_lock(&mutex); sock_connect(i,hna); sleep(1); pthread_mutex_unlock(&mutex); }; }; void *pthr2(void *) { for(int i=1;i<=10000;i+=2) { pthread_mutex_trylock(&mutex); sock_connect(i,hna); sleep(1); pthread_mutex_unlock(&mutex); }; };

Заголовочный файл где находится функция соединения sock_connect где есть ошибка.
scan.h

Код:

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <pthread.h> #include <unistd.h> #include <stdio.h> #include <fcntl.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netinet/ip.h> #include <arpa/inet.h> #include <netdb.h> int ff; static char hst_nm[10]; void sock_connect(int i,char *hnm)//Эта функция { static int sh; struct in_addr sib; struct sockaddr_in my_addr,peer_addr; sh=socket(AF_INET,SOCK_STREAM,IPPROTO_IP); if(sh==-1) { perror("socket error\n"); return; }; if(inet_aton(hnm, &sib) != 1){ printf("Неправильно задан адрес сервера\n"); exit(1); }; memset(&my_addr,0,sizeof(my_addr)); my_addr.sin_family=AF_INET; my_addr.sin_port=htons(i); my_addr.sin_addr=sib; struct sockaddr *ssp=(struct sockaddr *)&my_addr; if(connect(sh,ssp,sizeof(my_addr))==-1) { perror("connect"); return; }; printf("port %d\n",i); ff=open("./ports",O_RDWR); if(ff<0) { ff=open("./ports",O_CREAT | O_RDWR); }; static char pn[10]; int cp; sprintf(pn,"%d",i); printf("%s\n",pn); lseek(ff,0,SEEK_END); write(ff,pn,sizeof(pn)); close(ff); close(sh); return; };

Может я поля структуры sockaddr_in неправильно заполнил?
В параметры функции sock_connect я передаю строку в уоторой записан IP адресс потом преобразую функцией inet_aton в представление типа struct in_addr.
Причина зависания функция connect при попытке соединится с хостом ждет сколько угодно времени даже если сервер не весит на том порту на которое клиент шлет соединение. Как зделать чтоб функия connect ждала определенное время напр 3 секунды, а потом отвечала что соединение не установлен?
Спасибо сказали: