URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 2209
[ Назад ]

Исходное сообщение
"Сокеты"

Отправлено zhr , 27-Окт-03 15:06 
Не работает :о)

Точнее ситуация такая. После компиляции и запуска программы в первый раз
видим на экране

./scan 192.168.0.1 1 100
......
Port: 17 status: 0
Port: 18 status: 0
Port: 19 status: 0
Port: 20 status: 0
Port: 21 status: 0
Port: 22 status: 0
Port: 23 status: 0
Port: 24 status: 0
Port: 25 status: 0
......

В общем врет все. Со второго запуска видим.
......
Port: 17 status: -1
Port: 18 status: -1
Port: 19 status: -1
Port: 20 status: -1
Port: 21 status: 0
Port: 22 status: 0
Port: 23 status: -1
Port: 24 status: -1
Port: 25 status: 0
......
Что в принципе соответствует действительности :о)
Тоже самое наблюдается если не запускать прогу пару минут.

P.S. Если честно, то эт моя первая попытка ченить написать под UNIX, так что сильно не пинать.
---src---
#include "./include/test.h"
int     err_con;
int     port_from ;
int     port_to;
int     sock;
int     counter;

struct sockaddr_in      sock_addr;
struct hostent*         hst;

void GetParam(int g_argc, char *g_argv[]);

int main(int argc, char *argv[])
{
        GetParam(argc,argv);

        hst = gethostbyname(argv[1]);

        for(counter=(int)min(port_from,port_to);counter!=(int)max(port_from,port_to)+1;counter++)
        {
                sock = socket(AF_INET,SOCK_STREAM,0);

                bzero(&sock_addr,sizeof(sock_addr));
                sock_addr.sin_family      =   AF_INET;
                sock_addr.sin_addr.s_addr =   ((struct in_addr*)hst->h_addr_list[0])->s_addr;
                sock_addr.sin_port        =   htons(counter);
                bind(sock,(SA*)&sock_addr,sizeof(sock_addr));

                err_con = connect(sock,(SA *)&sock_addr,sizeof(sock_addr));
                printf("Port: %i status: %i \n",counter,err_con);

                close(sock);
        }
return 0;
}

void GetParam(int g_argc, char *g_argv[])
{
        switch(g_argc)
        {
                case 3:
                     port_from = port_to = atoi(g_argv[2]);
                     if(port_from == 0)
                     {
                        printf("Error. Port value = 0\n");
                        exit(1);
                     }
                     break;
                case 4:
                     port_from = atoi(g_argv[2]);
                     port_to   = atoi(g_argv[3]);
                     if(port_from == 0 || port_to == 0)
                     {
                        printf("Error. Port value = 0\n");
                        exit(1);
                     }
                     break;
                default:
                     printf("Usage: scan <host> <port> or scan <host> <port_from> <port_to>\n");
                     exit(1);
                     break;
        }
}


Содержание

Сообщения в этом обсуждении
"Сокеты"
Отправлено zhr , 27-Окт-03 15:10 
Сори ...
Сегодня весь инет что за уралом с завидной переодичностью падает. Поэтому отправилось два сообщения.

"Сокеты"
Отправлено Olej , 27-Окт-03 15:28 
>Сори ...
>Сегодня весь инет что за уралом с завидной переодичностью падает. Поэтому отправилось
>два сообщения.

Нужно скопировать отсюда что нужно (код программный) - а ветку удалить.
По коду ("первый опыт UNIX") - везде, везде ... в каждом вызове - проверяйте код возврата!



"Сокеты"
Отправлено Olej , 27-Окт-03 15:35 
>Не работает :о)

Посмотрите:
http://qnx.org.ru/index.php?option=com_minibb&action=vthread...
- может чего подскажет ;-)?


"Сокеты"
Отправлено zhr , 27-Окт-03 17:11 
Всё ... помоему нашел.

Вызов bind() в данном случае не имел смысла (тем более в цикле :о) ).

#include<sys/socket.h>
int bind(int socket, const struct sockaddr *addr, socklen_t addrlen)
"Клиент TCP обычно позволяет ядру выбирать динамически назначаемы порт, если приложение не требует зарезервированного порта ..." и т.д по тексту

т.е. Если приложение не есть сервер, а простой клиент, и номер порта нам не важен, то и вызов функции bind необязателен.

Надеюсь что я прав :)


"Сокеты"
Отправлено genie , 28-Окт-03 01:29 
Absolutno prav - bind sovershenno zdes' ne nuzhen.


>Всё ... помоему нашел.
>
>Вызов bind() в данном случае не имел смысла (тем более в цикле
>:о) ).
>
>#include<sys/socket.h>
>int bind(int socket, const struct sockaddr *addr, socklen_t addrlen)
>"Клиент TCP обычно позволяет ядру выбирать динамически назначаемы порт, если приложение не
>требует зарезервированного порта ..." и т.д по тексту
>
>т.е. Если приложение не есть сервер, а простой клиент, и номер порта
>нам не важен, то и вызов функции bind необязателен.
>
> Надеюсь что я прав :)