Мы переехали http://www.webxakep.net

Понедельник, 29.04.2024
На главную · Регистрация · Войти · Пользователи · User`Bars · Обратная связь · WebTools · Последние сообщения · Поиск

  • Страница 1 из 1
  • 1
Модератор форума: 3xstie  
WebXakep » On-Line обучение » Unix » 7.язык си.введение в сокеты.
7.язык си.введение в сокеты.

3xstieДата: Понедельник, 14.01.2008, 07:21 | Сообщение # 1
Полковник
Группа: ◄Модератор►
Сообщений:163
Статус: Offline
7.язык си.введение в сокеты.

H1 4ll)
Ну вообщем седня напишем простейший пример сокета - клиент который будет просто присоединятся к выбранному ИП и порту. на нем я расскажу о них, их видах, и т.п
ГОУ!
вот что пишет о сокетах википедиа

Quote

Сокеты (англ. sockets) — это название программного интерфейса для обеспечения информационного обмена между процессами. Процессы при таком обмене могут исполняться как на одной ЭВМ, так и на различных ЭВМ, связанных между собой сетью. Сокет — абстрактный объект, представляющий конечную точку соединения.
Интерфейс сокетов впервые появился в BSD Unix. Программный интерфейс сокетов описан в стандарте POSIX.1 и в той или иной мере поддерживается всеми современными операционными системами.
Сокет, на сленге современных системных администраторов, означает комбинацию IP-адреса и номера порта, например 10.10.10.10:80.

проще говоря это тип файлов(для unix), на которых основаны все сетевые программы, от клиента ftp, до сервера (Apache).
вот наш пример:
Code

#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/socket.h>
               
int main(int argc, char **argv)
{

         int sockfd;
         struct sockaddr_in cliaddr;
                
         if(argc != 3)
         {
           printf("Usage: ./cli [IP adress] [port]\n");
           exit(0);
         }
                 
         sockfd = socket(AF_INET, SOCK_STREAM, 0);        
                
         bzero(&cliaddr, sizeof(cliaddr));
         cliaddr.sin_family = AF_INET;
         cliaddr.sin_port = htons(*argv[2]);
         inet_pton(AF_INET, argv[1], &cliaddr.sin_addr);
                 
         connect(sockfd, (struct sockaddr *) &cliaddr, sizeof(cliaddr));
         return 0;
}

компилируем, запускаем, смотрим текущие подключения:

Code
$ gcc -s cli.c -o cli
$ ./cli 194.67.57.226 80

$

в другой консоли набираем:
Code
$ netstat  | grep 194.67.57.226
         TCP    tach              194.67.57.226       SYN_SENT
$

а теперь по строчно, конешно можно было в коде написать коменты, но получилось бы слишком грамоздко)

1: заголовочный файл netinet/in.h - в этом файле находится описание структура адреса сокета для IPv4

Code
struct sockaddr _in{
           short sin_family; /* Избранное семейство протоколов – всегда AF_INET */
           unsigned short sin_port; /* 16-битовый номер порта в сетевом порядке байт */
           struct in_addr sin_addr; /* Адрес сетевого интерфейса */
           char sin_zero[8]; /* Это поле не используется, но должно всегда быть заполнено нулями */
};
в нее мы будем водить ip адрес, порты и т.п.
2: заголовочный файл arpa/inet.h - необходим для функций преобразования IP адресов из строк ASCII в двоичные значения с сетевым порядком байтов и обратно. Из привычного для наших глаз вида, в код понятный процессору((inet_pton - в двоичные, inet_ntop - в ASCII)).
3: заголовочный файл sys/socket.h - описание функций для создания сокетов, соединения, и т.п.
5: функция main с параметрами командной строки
8: целая переменная, которой будем присваивать возращаемое сокетом значение. попросту дескриптор сокета.
9: наша структура адреса сокета, с указателем cliaddr(адрес клиента)
11: проверка на количество параметров при запуске программы


the daemons are no longer just in my head.
 


3xstieДата: Понедельник, 14.01.2008, 07:21 | Сообщение # 2
Полковник
Группа: ◄Модератор►
Сообщений:163
Статус: Offline
16: создание сокета, общий вид
int socket(int family, int type, int protocol); где
family - семейство протоклов, могут быть
Code
AF_INET - протоколы IPv4
AF_INET6 - протоколы IPv6
AF_LOCAL - протоколы доменных сокетов UNIX
AF_ROUTE - маршрутизирующие сокеты
AF_KEY - Сокет управления ключами

type - тип сокета, может быть
Code
SOCK_STREAM - потоковый сокет
SOCK_DGRAM - сокет дейтаграмм
SOCK_SEQPACKET - сокет последовательных пакетов
SOCK_RAW - символьный не структуированный сокет

protocol - протокол, может быть
Code
IPPROTO_TCP - транспортный протокол TCP
IPPROTO_UDP - траспортный протокол UDP
IPPROTO_SCTP - транспортный протокол SCTP

Сочетания этих констант(так как не все подходит к друг другу)
Code
                            
                        AF_INET    AF_INET6 AF_LOCAL AF_ROUTE AF_KEY
SOCK_STREAM          TCP/IP       TCP/IP         ДА
SOCK_DGRAM              UDP           UDP          ДА
SOCK_SEQPACKET       SCTP         SCTP         ДА
SOCK_RAW                  IPv4           Pv6           -               ДА          ДА

18: Функция bzero() присваивает количеству n байтов строки s нулевое значение. очищает байты под структуру.
Общийвид функции:
Code
void bzero(void * s , size_t  n );

19: указываем семействов нашей структуре адреса сокета, протокл IPv4
20: указываем порт, который берем из третьего параметра командной строки и отправляем в фуккцию htons:
Code
Функция htonl() преобразует хостовый порядок расположения байтов положительного целого hostlong в сетевой порядок расположения байтов.
Функция htons() преобразует хостовый порядок расположения байтов положительного короткого целого hostshort в сетевой порядок расположения байтов.
Функция ntohl() преобразует сетевой порядок расположения байтов положительного целого netlong в хостовый порядок расположения байтов.
Функция ntohs() преобразует сетевой порядок расположения байтов положительного короткого целого netshort в хостовый порядок расположения байтов.        

21: вызывем функцию inet_pton которая работает с обоими протоколами IPv4 и IPv6, переводит из ASCII в двоичный формат, ей родственная inet_pntop(p - представляемый n - численный формат, n to p или p to n);
Code

#include <arpa/inet.h>
        int inet_pton(int famiky, const cahr *strptr, void *addrptr);
        const char *inet_ntop(int family, const void *addrptr, chr *strptr, size_t len);
, где
family - либо AF_INET либо AF_INET6.
первая функция делает из строки на которую указывает srtptr и сохряняет результат с помощью addrptr.
Вторая все наоборот, из численного формата(addrptr) в форрмат представления(strptr).
len - длина принимающей строки для второй функции, что бы не переполнить буфер вызывающего процесса.
23: не посредствено сама функция соединения, после которой можно будет посылать и получать данные между клиентом и сервером фенкциями read/write и их модификациями, но об этом чуть поже.
Общий вид:
Code

include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen);
, где
sockfd дескриптор сокета(мы его получили при создании сокета функцией socket), второй и третий аргумент, укахатель наструктуру адреса сокета и ее размер., в структуре уже есть IP адрес, и номер порта.
24: выходим из main, не закрывая при этом наш с вами сокет, что бы его можно было увидеть netstat.
фуф...
как видите все просто, вызываем программу и параметрами ей задаем ip адрес и номер порта, программа в свою очередь создает сокет опредеоенного типа (потоковый сокет tcp), обнуляет сруктуру, перед помещением туда наших с вами данных, и конектится по указаному адресу.
ничего сложного
пока все, всем удачи.
Прикрепления: 3905041.jpg (29.3 Kb)


the daemons are no longer just in my head.
 


3xstieДата: Понедельник, 14.01.2008, 08:00 | Сообщение # 3
Полковник
Группа: ◄Модератор►
Сообщений:163
Статус: Offline
вот схема клиента и сервера, мы с вами пока упустили момент передачи данных межде ними, но посмотрите внимательно, для нормальной работы клиенту всего нужно создать сокет и присоединится к серверу, у сервера, же намного сложнее все: ему нужно создать сокет, забиндить(функция bind) адрес(т.е. указать ip адрес и port) поставитб сокет на прослушку(функция listen), превратить из активного сокета(который используется обычно клиентами) в пассивный а так же указать максимальное кол-во подключений. функция accept используется сервером для возращение следующего установленного подключения из начала уже установленных,
вообщем это давольно таки сложно, и будет рассматриватся в других статьях, а щас просто посмотрите общую схему соединения клиента и сервера.для ознакомления.
Прикрепления: 1664539.jpg (29.3 Kb)


the daemons are no longer just in my head.
 

WebXakep » On-Line обучение » Unix » 7.язык си.введение в сокеты.
  • Страница 1 из 1
  • 1
Поиск:
..:WX Group:..
WebXakep 2007 - 2008 year.
Desing by arXRush & ArxWolf :)
Все прова принадлежат ArxWolf © Webxakep.net, все представленные материалы на портале в целях ознакомления.[Хакерство и Безопасность]
Форум посвящённый сетевой безопасности, хакерству, исследованию, проникновению. Есть темы такие как : Основы новичкам, BUGTRAQ, ICQ, Email, IRC, Skype, MSN, Крякерам, Фрикерам, Мобильные устройства, Вирусология, Кодинг, ОС, Soft, Халява, ЖелезО, Купля, Продажа, Обмен, Трёпка, Книги, Статьи, Новости, Группировки, Взлом.

Rambler's Top100