Компилируется и линкуется нормально без ошибок и предупреждений но несоединяется.
Коннектится только к хостам находящимся в локальной сети в частности к 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 секунды, а потом отвечала что соединение не установлен?