powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите разобратся с IP адресами
39 сообщений из 39, показаны все 2 страниц
Помогите разобратся с IP адресами
    #34297946
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго всем времени суток :)

Вот возникла проблема:

Пишу программу на Си, использую сокеты, но когда начинаю анализировать поступивший пакет мне вместо реальных IP пишет какую-то муть :(

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
typedef struct IPHeader {
  UCHAR   iph_verlen;   
  UCHAR   iph_tos;     
  USHORT  iph_length;   
  USHORT  iph_id;       
  USHORT  iph_offset;  
  UCHAR   iph_ttl;      
  UCHAR   iph_protocol; 
  USHORT  iph_xsum;    
  ULONG   iph_src;      // IP отправителя
  ULONG   iph_dest;    // IP получателя
} IPHeader;

IN_ADDR pack_adr;
...

  rec = recv(cli_disc, buf, sizeof(buf),  0 );

...

  IPHeader* hdr = (IPHeader *)buf;
                                  
  printf(" From : ");
  pack_adr.s_addr = hdr->iph_src;
  printf(inet_ntoa(pack_adr));

  printf(" To : ");
  pack_adr.s_addr = hdr->iph_dest;
  printf(inet_ntoa(pack_adr));

IP которые выводятся на экран неимеют ничего общего с реальными.
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34297974
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Открой для себя htonl, ну и htons для кучи :)
Дело в том, что в Internet принят другой порядок байт, противоположный к хостовому Intel-а
Нужно просто переставить байтики
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34298126
SnowMan2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтото мне сдается, что recv не берет Header. Сам определял обратный адрес из функции accept (при передаче с каналом) или recfrom (без канала)
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34298143
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно пример или ссылку на документацию по данным функциям?
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34298160
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
НАЗВАНИЕ
htonl, htons, ntohl, ntohs - переводят данные из узлового порядкарасположения байтов в сетевой и наоборот

СИНТАКСИС
#include <netinet/in.h>

uint32_t htonl(uint32_t hostlong);

uint16_t htons(uint16_t hostshort);

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);

ОПИСАНИЕ
Функция htonl() преобразует узловой порядок расположениябайтов положительного целого hostlong в сетевой порядок распол
ожения байтов.

Функция htons() преобразует узловой порядок расположения байтовположительного короткого целого hostshort в сетевой пор
ядок расположения байтов.

Функция ntohl() преобразует сетевой порядок расположения байтовположительного целого netlong в узловой порядок располо
жения байтов.

Функция ntohs() преобразует сетевой порядок расположения байтовположительного короткого целого netshort в узловой поря
док расположения байтов.

В архитектуре i80x86 узловой порядок расположения байтов - этотакой порядок, при котором последний значимый байт стоит
в начале числа, а при сетевом порядке расположения байтов, используемом в интернет, наоборот: первый значимый байт сто
ит в начале числа.
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34298167
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем, htonl для адреса, htons для порта.

Остальные две, соответсвенно, наоборот.
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34298182
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем понятно, а как сее в printf вывести? Какой формат?
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34298188
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LepajВ общем понятно, а как сее в printf вывести? Какой формат?

4 байта - 4 октета адреса ;)
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34298341
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan)
4 байта - 4 октета адреса ;)

Т.е. получается, что возвращается 24 байта?
Например адрес 127.0.0.1 будет иметь вид:

01111111 00000000 00000000 00000001

или же возвращается другое значение? так как я понял ф-ция inet_ntoa() сама преобразует значение в читабельный формат, а что возвращается в ф-ции htonl?

если можно, дайте пожайлуста пример вывода на экран (printf) значения возвращаемого htonl...

P.S.: Извините за тупой вопрос, но я только учусь работать с сокетами и пока имею довольно туманное представления о них...
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34298440
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lepaj Gluk (Kazan)
4 байта - 4 октета адреса ;)

Т.е. получается, что возвращается 24 байта?
Например адрес 127.0.0.1 будет иметь вид:

01111111 00000000 00000000 00000001


Loopback ты нарисовал правильно.
Одного не пойму, 24 то откуда взялось ???
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34298564
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan)
Loopback ты нарисовал правильно.
Одного не пойму, 24 то откуда взялось ???

24 байта, занимает адрес 4 числа по 8 байт дает 24 байта, вот только как их в си преобразовать и вывести на экран?
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34298577
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lepaj Gluk (Kazan)
Loopback ты нарисовал правильно.
Одного не пойму, 24 то откуда взялось ???

24 байта, занимает адрес 4 числа по 8 байт дает 24 байта, вот только как их в си преобразовать и вывести на экран?

Странно, а я всегда думал, что 4 октета по 8 бит дадут 32 бита
Пойду подучу арифметику
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34298578
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lepaj Gluk (Kazan)
Loopback ты нарисовал правильно.
Одного не пойму, 24 то откуда взялось ???

24 байта, занимает адрес 4 числа по 8 байт дает 24 байта, вот только как их в си преобразовать и вывести на экран?

Ты же сам уже написал, что для этого есть inet_ntoa. :)
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34298625
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lepaj, не путай строчное представление адреса, узловое и сетевое. Читай документацию, что я тебе запостил, + ниже следующую и все вопросы сами отпадут.

автор
НАЗВАНИЕ
inet_aton, inet_addr, inet_network, inet_ntoa, inet_makeaddr, inet_lnaof, inet_netof - работа с адресами интернет

СИНТАКСИС
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int inet_aton(const char *cp, struct in_addr *inp);

in_addr_t inet_addr(const char *cp);

in_addr_t inet_network(const char *cp);

char *inet_ntoa(struct in_addr in);

struct in_addr inet_makeaddr(int net, int host);

in_addr_t inet_lnaof(struct in_addr in);

in_addr_t inet_netof(struct in_addr in);

ОПИСАНИЕ
inet_aton() преобразовывает обычный вид IP-адреса cp (из номеров и точек) в двоичный код и сохраняет его в структуре,
на которую указывает inp. inet_aton возвращает ненулевое значение, если адрес правильный, и возвращает ноль, если он н
еверен.

Функция inet_addr() преобразует обычный вид IP-адреса cp (из номеров и точек) в двоичный код в сетевом порядке располо
жения байтов. Если входящий адрес неверен, то возвращается INADDR_NONE (обычно -1). Это - устаревший способ, посколь
ку уже существует inet_aton, описанный выше; способ также считается устаревшим, потому что -1 фактически являетсяправи
льным адресом (255.255.255.255), а inet_aton четко определяет, есть ошибкав адресе или нет.

Функция inet_network() извлекает сетевой номерв хостовом порядке расположения байтовиз адреса cp, записанном в виде но
меров и точек. Если входящий адрес неверен, то возвращается -1.

Функция inet_ntoa() преобразует IP-адрес in, заданный в сетевом порядке расположения байтов, в стандартный строчный ви
д, из номеров и точек. Строка располагается в статически размещенном буфере; последующие вызовы перепишут его данные.

Ф ункция inet_makeaddr() создает IP-адрес в сетевом порядке расположения байтов, комбинируя номер сети net с локальным
адресом host в сети net (оба в хостовом порядке расположения байтов).

Функция inet_lnaof() возвращает часть адреса для локального хостаиз IP-адреса in. Адрес локального хоста возвращается
в хостовом порядкеразмещения байтов.

Функция inet_netof() возвращает сетевую часть IP-адреса in. Сетевой номер возвращается в виде байтов, порядок которых
определяетсясистемой локального хоста.

Структура in_addr, используемая в функциях inet_ntoa(), inet_makeaddr(), inet_lnoaf() и inet_netof(), определе н а в
netinet/in.h таким образом:

struct in_addr {
unsigned long int s_addr;
}

Заметим, что для i80x86 хостовый порядок расположения байтовозначает размещение сначала наименьшего значащего байта, а
сетевой порядок расположения байтов (используемый в интернет) подразумевает размещение в начале наибольшего значимог о
байта.
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34298637
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan)
Странно, а я всегда думал, что 4 октета по 8 бит дадут 32 бита
Пойду подучу арифметику

блин, ну прокосячил :( пойду тоже арифметику учить :)

AkhТы же сам уже написал, что для этого есть inet_ntoa. :)

Ну так inet_ntoa неправильный результат возвращает.
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34298739
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan)Пойду подучу арифметику тут не в арифметике дело, а в плане :)
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34298813
SnowMan2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут в 5-ой главе про сокеты хорошо сказано

http://www.lcard.ru/~nail/frolov/bsp/v23/home.htm
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34298940
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan)
Дело в том, что в Internet принят другой порядок байт, противоположный к хостовому Intel-а
Нужно просто переставить байтики

Akh
ОПИСАНИЕ
Функция htonl() преобразует узловой порядок расположениябайтов положительного целого hostlong в сетевой порядок распол
ожения байтов.


Т.е. получается, что функция htonl() меняет порядок байтов на сетевой, а inet_ntoa() преобразует к читабельному строчнуму виду...

Но почему компилятор ругается на такую конструкцию printf("%s",inet_ntoa(inet_ntoa(htonl(pack_adr)));?
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34298945
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Карабас Барабас Gluk (Kazan)Пойду подучу арифметику тут не в арифметике дело, а в плане :)
Posted via ActualForum NNTP Server 1.3

Плановое хозяйство это СИЛА ;)
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34299032
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lepaj
Но почему компилятор ругается на такую конструкцию printf("%s",inet_ntoa(inet_ntoa(htonl(pack_adr)));?

Пришел к такой конструкции :

pack_adr.s_addr = hdr->iph_src;
pack_adr.s_addr = ntohl(pack_adr.s_addr);
printf("%s",inet_ntoa(pack_adr));

но, все равно на экран выводит неправильные IP.
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34299347
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SnowMan2Чтото мне сдается, что recv не берет Header. Сам определял обратный адрес из функции accept (при передаче с каналом) или recfrom (без канала)

Долго мучался с приведенно выше конструкцией, но постоянно получаю разные IP :(
А как вытащить IP из accept?
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34299541
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемые Гуру, дайте хотя бы намек, или алгоритм, как распотрашить пакет :) Что бы можно было бы вытащить из полученного пакета адрес отправителя, адрес получателя и т.д.
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34299601
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ты ж задачу толком не описал, какие тебе намеки ???
TCP, UDP или слушаешь сырой сокет ? из твоих слов совершенно непонятно.
Какой-то обрывок кода :(

Что тебе посоветовать ? Как правильно задавать вопросы ???
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34299641
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan)ты ж задачу толком не описал, какие тебе намеки ???
TCP, UDP или слушаешь сырой сокет ? из твоих слов совершенно непонятно.
Какой-то обрывок кода :(

Что тебе посоветовать ? Как правильно задавать вопросы ???

Пардон... Некоректно сформулировал вопрос...

Задача заключается в следующем. Организуется TCP сокет на прослушивание, ему посылается сообщение, программа работает как ретранслятор, получив сообщение она должна переслать его дальше по ssl, т.е. как узнать от кого пришло данное сообщение, длина... В коде я привел структуру, которую выдернул из одного снифера, почему не привел другой код, по тому что там все как в учебнике, организуется сокет.
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34299647
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blcksock.pas
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 function  TBlockSocket.GetSinIP(Sin: TSockAddrIn):  string ;
 var 
  p: PChar;
 begin 
  p := synsock.inet_ntoa(Sin.sin_addr);
   if  p =  nil   then 
    Result := ''
   else 
    Result := p;
 end ;

TSockAddrIn represents the Internet socket address structure used in Windows socket API calls to represent the full specification of a socket port.

Unit

Winsock

typedef sockaddr_in TSockAddrIn;

Description

TSockAddrIn represents a Windows socket address, including information about the host, port, and protocol.

Код: plaintext
1.
2.
3.
4.
5.
struct sockaddr_in {
        short   sin_family;
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[ 8 ];
};

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34299660
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TCP не имеет доступа к заголовку IP-пакета, посему исходник сниффера фтопку
ты можешь определить кто с тобой установил соединение посредством accept

Но я подозреваю, что это далеко не единственная твоя ошибка. На твоем месте, я прикрепил бы к сообщению код полностью, а после этого спрашивал
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34299689
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
void WaitSocket()
{

// Ïðîöåäóðû èíèöèàëèçàöèè ñîêåòà
	CreateSocket();
	LinkSoketPort();
    LinkWindowScoket();


	int Errors;
	int Errors_sock;
    int cli_disc, clilen, rec;
    struct sockaddr_in cli_addr;
    int flag= 0 ;


    fd_set readfds;
    struct timeval tv;


// Ñîåäèíåíèå ñ SLL

  serv_sock = socket(PF_INET, SOCK_STREAM,  0 );
    
  sa.sin_family = AF_INET;
  sa.sin_port = htons(OUT_PORT);
  sa.sin_addr.s_addr = htonl((((((adr1 <<  8 ) | adr2) <<  8 ) | adr3) <<  8 ) | adr4);
  if (connect(serv_sock, (struct sockaddr *)&sa, sizeof sa) <  0 ) 
  {
      timer = time(NULL);
      tblock = localtime(&timer);
      printf("%02d.%02d.%02d",tblock->tm_mday,tblock->tm_mon+ 1 ,tblock->tm_year+ 1900 );
      printf(" %02d:%02d:%02d",tblock->tm_hour,tblock->tm_min,tblock->tm_sec);
      printf(" - Error : Don`t find server!!!\n\n");

        if((fl=fopen(den,"at"))==NULL)
        {
         fl=fopen(den,"w+");
        }
        fprintf(fl,"%02d.%02d.%02d",tblock->tm_mday,tblock->tm_mon+ 1 ,tblock->tm_year+ 1900 );
        fprintf(fl," %02d:%02d:%02d",tblock->tm_hour,tblock->tm_min,tblock->tm_sec);
        fprintf(fl," - Error : Don`t find server!!!\n\n");
        fclose(fl);
  }
  else
  {
        timer = time(NULL);
        tblock = localtime(&timer);

        if((fl=fopen(den,"at"))==NULL)
        {
         fl=fopen(den,"w+");
        }
        fprintf(fl,"%02d.%02d.%02d",tblock->tm_mday,tblock->tm_mon+ 1 ,tblock->tm_year+ 1900 );
        fprintf(fl," %02d:%02d:%02d",tblock->tm_hour,tblock->tm_min,tblock->tm_sec);
        fprintf(fl," - Find server!!!\n");
        fclose(fl);

        printf("%02d.%02d.%02d",tblock->tm_mday,tblock->tm_mon+ 1 ,tblock->tm_year+ 1900 );
        printf(" %02d:%02d:%02d",tblock->tm_hour,tblock->tm_min,tblock->tm_sec);
        printf(" - Find server!!!\n");


// Ïðîñëóøèâàíèå ñîêåòà
	Errors=listen(hListenSockTCP, MAXCONN);
	if ( Errors == SOCKET_ERROR)
	{
        timer = time(NULL);
        tblock = localtime(&timer);
        itoa(tblock->tm_yday,den, 10 );

        strcat(den,".log");

        if((fl=fopen(den,"at"))==NULL)
        {
         fl=fopen(den,"w+");
        }
        fprintf(fl,"%02d.%02d.%02d",tblock->tm_mday,tblock->tm_mon+ 1 ,tblock->tm_year+ 1900 );
        fprintf(fl," %02d:%02d:%02d",tblock->tm_hour,tblock->tm_min,tblock->tm_sec);
        fprintf(fl," - Listen BAD !!!\n");
        fclose(fl);
        printf("%02d.%02d.%02d",tblock->tm_mday,tblock->tm_mon+ 1 ,tblock->tm_year+ 1900 );
        printf(" %02d:%02d:%02d",tblock->tm_hour,tblock->tm_min,tblock->tm_sec);
		printf("  - Listen BAD !!! \n");
		exit( 1 );
	}
    timer = time(NULL);
    tblock = localtime(&timer);
        itoa(tblock->tm_yday,den, 10 );

        strcat(den,".log");

        if((fl=fopen(den,"at"))==NULL)
        {
         fl=fopen(den,"w+");
        }
        fprintf(fl,"%02d.%02d.%02d",tblock->tm_mday,tblock->tm_mon+ 1 ,tblock->tm_year+ 1900 );
        fprintf(fl," %02d:%02d:%02d",tblock->tm_hour,tblock->tm_min,tblock->tm_sec);
        fprintf(fl," - Wait to connected...\n");
        fclose(fl);

    printf("%02d.%02d.%02d",tblock->tm_mday,tblock->tm_mon+ 1 ,tblock->tm_year+ 1900 );
    printf(" %02d:%02d:%02d",tblock->tm_hour,tblock->tm_min,tblock->tm_sec);
	printf(" - Wait to connected...\n");

    flag_con= 0 ;
    flag_con2= 0 ;

    int sek;
    int time_sek;
    int fl_time;

    timer = time(NULL);
    tblock = localtime(&timer);

    int time_o;
    
    time_o=TIME_OUT/ 1000 ;

    sek=tblock->tm_sec;
    time_sek=sek+time_o;
    
    fl_time= 0 ;

    if (time_sek> 59 )
    {
      time_sek=time_sek- 59 ;
    }

    WSAAsyncSelect (hListenSockTCP,GetConsoleHWND(),WM_ASYNC_CLIENTEVENT,FD_ACCEPT|FD_READ|FD_CLOSE);
    do
    {
        timer = time(NULL);
        tblock = localtime(&timer);
        
        sek=tblock->tm_sec;
                
        if(time_sek==sek)
        {
               time_sek=sek+time_o;
               if (time_sek> 59 )
                {
                     time_sek=time_sek- 59 ;                                      
                }               
                Errors_sock = send(serv_sock, "",  0 ,  1 );
                if(Errors_sock == - 1 )
                {
                   fl_time= 1 ;                       
                }
                else
                {
                   fl_time= 0 ;
                }
        }
        if(fl_time!= 0 )
        {
         if(flag_con== 0 )
         {
                  itoa(tblock->tm_yday,den, 10 );

                  strcat(den,".log");

                  if((fl=fopen(den,"at"))==NULL)
                  {
                    fl=fopen(den,"w+");
                  }
                  fprintf(fl,"%02d.%02d.%02d",tblock->tm_mday,tblock->tm_mon+ 1 ,tblock->tm_year+ 1900 );
                  fprintf(fl," %02d:%02d:%02d",tblock->tm_hour,tblock->tm_min,tblock->tm_sec);
                  fprintf(fl," - Error SERVER Socket...!!!\n");
                  fclose(fl);

                  printf("%02d.%02d.%02d",tblock->tm_mday,tblock->tm_mon+ 1 ,tblock->tm_year+ 1900 );
                  printf(" %02d:%02d:%02d",tblock->tm_hour,tblock->tm_min,tblock->tm_sec);
                  printf(" - Error SERVER Socket...\n");

                  flag_con= 1 ;
         }
         closesocket(hListenSockTCP);

         sleep(TIME_OUT);
         int fl;
         do
         {
         
          serv_sock = socket(PF_INET, SOCK_STREAM,  0 );
         
          sa.sin_family = AF_INET;
          sa.sin_port = htons(OUT_PORT);
          sa.sin_addr.s_addr = htonl((((((adr1 <<  8 ) | adr2) <<  8 ) | adr3) <<  8 ) | adr4);
         
          fl= 0 ;
          if (connect(serv_sock, (struct sockaddr *)&sa, sizeof sa) <  0 ) 
          {
                    timer = time(NULL);
                    tblock = localtime(&timer);

                    if(flag_con2== 0 )
                    {
                      itoa(tblock->tm_yday,den, 10 );

                      strcat(den,".log");

                      if((fl=fopen(den,"at"))==NULL)
                      {
                        fl=fopen(den,"w+");
                      }
                      fprintf(fl,"%02d.%02d.%02d",tblock->tm_mday,tblock->tm_mon+ 1 ,tblock->tm_year+ 1900 );
                      fprintf(fl," %02d:%02d:%02d",tblock->tm_hour,tblock->tm_min,tblock->tm_sec);
                      fprintf(fl," - Error!!! Don`t find server...!!!\n");
                      fclose(fl);
                    
                      printf("%02d.%02d.%02d",tblock->tm_mday,tblock->tm_mon+ 1 ,tblock->tm_year+ 1900 );
                      printf(" %02d:%02d:%02d",tblock->tm_hour,tblock->tm_min,tblock->tm_sec);
                      printf(" - Error!!! Don`t find server...\n");
                      flag_con2= 1 ;
                  }  
                  fl= 1 ;
          }
          else
          {
                  timer = time(NULL);
                  tblock = localtime(&timer);
                  printf("%02d.%02d.%02d",tblock->tm_mday,tblock->tm_mon+ 1 ,tblock->tm_year+ 1900 );
                  printf(" %02d:%02d:%02d",tblock->tm_hour,tblock->tm_min,tblock->tm_sec);
                  printf(" - Find server!!!\n");

                  flag_con= 0 ;
                  flag_con2= 0 ;

                  fl_time= 0 ;

                  time_sek=sek+time_o;
                  if (time_sek> 59 )
                  {
                     time_sek=time_sek- 59 ;                                      
                  }               

                  itoa(tblock->tm_yday,den, 10 );

                  strcat(den,".log");

                  if((fl=fopen(den,"at"))==NULL)
                  {
                    fl=fopen(den,"w+");
                  }
                  fprintf(fl,"%02d.%02d.%02d",tblock->tm_mday,tblock->tm_mon+ 1 ,tblock->tm_year+ 1900 );
                  fprintf(fl," %02d:%02d:%02d",tblock->tm_hour,tblock->tm_min,tblock->tm_sec);
                  fprintf(fl," - Find server!!!\n");
                  fclose(fl);
                  
                  if (flag_buf== 1 )
                  {
                                  send(serv_sock, save_buf, strlen(save_buf),  0 );
                  }
                  
                  CreateSocket();
                  LinkSoketPort();
                  LinkWindowScoket();

                  Errors=listen(hListenSockTCP, MAXCONN);
                  if ( Errors == SOCKET_ERROR)
                  {
                        timer = time(NULL);
                        tblock = localtime(&timer);
                        printf("%02d.%02d.%02d",tblock->tm_mday,tblock->tm_mon+ 1 ,tblock->tm_year+ 1900 );
                        printf(" %02d:%02d:%02d",tblock->tm_hour,tblock->tm_min,tblock->tm_sec);
                  		printf(" - Listen BAD !!! \n");

                        itoa(tblock->tm_yday,den, 10 );
                        
                        strcat(den,".log");

                        if((fl=fopen(den,"at"))==NULL)
                        {
                         fl=fopen(den,"w+");
                        }
                        fprintf(fl,"%02d.%02d.%02d",tblock->tm_mday,tblock->tm_mon+ 1 ,tblock->tm_year+ 1900 );
                        fprintf(fl," %02d:%02d:%02d",tblock->tm_hour,tblock->tm_min,tblock->tm_sec);
                        fprintf(fl," - Listen BAD !!!\n");
                        fclose(fl);
                    	exit( 1 );
                  }
                  timer = time(NULL);
                  tblock = localtime(&timer);

                  itoa(tblock->tm_yday,den, 10 );

                  strcat(den,".log");

                  if((fl=fopen(den,"at"))==NULL)
                  {
                    fl=fopen(den,"w+");
                  }
                  fprintf(fl,"%02d.%02d.%02d",tblock->tm_mday,tblock->tm_mon+ 1 ,tblock->tm_year+ 1900 );
                  fprintf(fl," %02d:%02d:%02d",tblock->tm_hour,tblock->tm_min,tblock->tm_sec);
                  fprintf(fl," - Wait to connected...\n");
                  fclose(fl);

                  printf("%02d.%02d.%02d",tblock->tm_mday,tblock->tm_mon+ 1 ,tblock->tm_year+ 1900 );
                  printf(" %02d:%02d:%02d",tblock->tm_hour,tblock->tm_min,tblock->tm_sec);
                  printf(" - Wait to connected...\n");
                  fl= 1 ;
          }
         }
         while(fl== 0 );
        }
        else
        {
        cli_disc = accept(hListenSockTCP,(struct sockaddr *) &cli_addr, &clilen);
        if(cli_disc != - 1 ) 
        {
           do
           {
                      flag= 0 ;
                      rec = recv(cli_disc, buf, sizeof(buf),  0 );
                      if(rec> 0 ) 
                      {

                                  timer = time(NULL);
                                  tblock = localtime(&timer);
                                  printf("%02d:%02d:%02d",tblock->tm_mday,tblock->tm_mon+ 1 ,tblock->tm_year+ 1900 );
                                  printf(" %02d:%02d:%02d ",tblock->tm_hour,tblock->tm_min,tblock->tm_sec);
                                                            	     
                                  itoa(tblock->tm_yday,den, 10 );

                                  strcat(den,".log");

                                  if((fl=fopen(den,"at"))==NULL)
                                  {
                                   fl=fopen(den,"w+");
                                  }
                                  fprintf(fl,"%02d.%02d.%02d",tblock->tm_mday,tblock->tm_mon+ 1 ,tblock->tm_year+ 1900 );
                                  fprintf(fl," %02d:%02d:%02d",tblock->tm_hour,tblock->tm_min,tblock->tm_sec);
                          	     
//                                  printf("Rec : %d", rec);
                                  IPHeader* hdr = (IPHeader *)buf;

                                  //Íà÷èíàåì ðàçáîð ïàêåòà...
//                                  printf("\tHdr : %d",hdr);
//                                  printf("\tCli_disc : %d",cli_disc);

                                  // Ïðåîáðàçóåì â ïîíÿòíûé âèä àäðåñ îòïðàâèòåëÿ.
                                  printf(" From : ");
                                  pack_adr.s_addr = hdr->iph_src;
                                  printf(inet_ntoa(pack_adr));

                                  fprintf(fl," - From : ");
                                  fprintf(fl,inet_ntoa(pack_adr));

                                  // Ïðåîáðàçóåì â ïîíÿòíûé âèä àäðåñ ïîëó÷àòåëÿ.
                                  printf(" To : ");
                                  pack_adr.s_addr = hdr->iph_dest;
                                  printf(inet_ntoa(pack_adr));

                                  fprintf(fl," To : ");
                                  fprintf(fl,inet_ntoa(pack_adr));

                                  // Âû÷èñëÿåì ðàçìåð ïàêåòà?!?!?!?!?!?!
                                  printf(" Size: ");
//                                  lowbyte = hdr->iph_length>>8;
//                                  hibyte = hdr->iph_length<<8;
//                                  hibyte = hibyte + lowbyte;

                                  pack_size=strlen(buf);
                                  printf("%d",pack_size);
                                  printf(" byte");

                                  fprintf(fl," Size : ");
                                  fprintf(fl,"%d",pack_size);
                                  fprintf(fl," byte");


/*                                  printf("\tPacket : ");

                                  for(i=0; i<rec; i++)
                                  {
                                     printf("%c",buf[i]);
                                  }*/

                                  Errors_sock = send(serv_sock, buf, rec,  0 );

                                  flag_buf= 0 ;
                                  if (Errors_sock< 0 )
                                  {
                                                    flag_buf= 1 ;
                                                    strcpy(save_buf,buf);
                                  }

//                                  printf("Socket sostoyanie : %d",Errors_sock);

                                  printf("\n");
                                  fprintf(fl,"\n");

                                  fclose(fl);

                                  flag= 1 ;
                      }
           }
           while(flag== 0 );
         }
        }   
    }
    while( 1 );

  }
  close(serv_sock);

}

Вот процедура, где организуется прослушивание сокета...
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34299696
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
жость
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34299732
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan)жость

По тому и спрашиваю :( Не работал я никогда с сокетами, а документацию нормально найти не могу, так как заставили писать не на Си++ а на обычном Си, плюс в основном вся инфа заканчивается на том, как организовать прослушивание или отправить сообщение, а как данное сообщение обработать примеров нет...

В теории у каждого сообщения должна быть служебная информация, но как к ней получить доступ не могу понять.
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34299734
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S.: Не ругайтесь сильно, все ведь с чего-то начинали, не все же рождаются гениями :(
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34299789
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В TCP нет служебной информации. Для ТЕБЯ это просто поток байт данных.
Единственное место где сервер узнает кто с ним соединился это accept, подробности можешь посмотреть в MSDN. Я очень сильно удивлюсь если тот УЖОС что ты сюда запостил заработает, но отдаю должное твоему трудолюбию

P.S. И нафига тебе вперлось WSA можешь объяснить ???
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34299802
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень советую найти и почитать это , то что Unix можешь не обращать внимания.
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34299839
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34299899
SnowMan2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример из старых запасов, вроде работает. Сейчас пишу на Builder-e, там несколько иначе и проще.

Пример состоит из двух программ: сервер и клиент, у каждого по 3 файла:

tcp_serv.c:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
#include	<windows.h>
#include	<windowsx.h>
#include	<string.h>
#include	<winsock.h>
#include	"tcp_serv.h"


LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
BOOL				WndProc_OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct);
void				WndProc_OnDestroy(HWND hWnd);
void				WndProc_OnCommand(HWND hWnd, int id, HWND hWndCtrl, UINT codeNotify);
void				WndProc_OnSize(HWND hWnd, UINT state, int cx, int cy);
void				ServerStart(HWND hWnd);
void				ServerStop(HWND hWnd);
void				WndProc_OnWSAAccept(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
void				WndProc_OnWSANetEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

#define	SERV_PORT		 5000 
#define	IDS_STATUSBAR	 802 
#define	WSA_ACCEPT	(WM_USER+ 1 )
#define	WSA_NETEVENT	(WM_USER+ 2 )

HINSTANCE	hInst;
char			szAppName[]  = "TCP/IP Server";
char			szAppTitle[] = "TCP/IP Server";
//HWND		hWndSB;
SOCKET		srv_socket;
int			acc_sin_len;
SOCKADDR_IN	acc_sin;
SOCKADDR_IN	local_sin;

#pragma	argsused
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
							LPSTR lpCmdLine, int nCmdShow)
{
 WNDCLASS		wc;
 HWND		hWnd;
 MSG			msg;

 hInst = hInstance;
 hWnd = FindWindow(szAppName, NULL);
 if (hWnd) return NULL;

 memset(&wc,  0 , sizeof(wc));
 wc.style = CS_HREDRAW | CS_VREDRAW;
 wc.lpfnWndProc = (WNDPROC)WndProc;
 wc.hInstance = hInst;
 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
 wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+ 1 );
 wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
 wc.lpszClassName = szAppName;
 if (!RegisterClass(&wc)) {
		MessageBox(NULL, "Не удалось зарегистрировать класс окна", "", MB_OK);
		return FALSE;
 } // if
 hWnd = CreateWindow(
	szAppName,
	szAppTitle,
	WS_OVERLAPPEDWINDOW,
	CW_USEDEFAULT,
	 0 ,
	CW_USEDEFAULT,
	 0 ,
	NULL,
	NULL,
	hInst,
	NULL);
 if (!hWnd) {
	MessageBox(NULL, "Не удалось создать окно", "", MB_OK);
	return FALSE;
 } // if
 ShowWindow(hWnd, nCmdShow);
 UpdateWindow(hWnd);
 while (GetMessage(&msg, NULL,  0 ,  0 )) {
	TranslateMessage(&msg);
	DispatchMessage(&msg);
 } // while
 return msg.wParam;
} // WndMain

//***************************************************************************

#pragma	argsused
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 switch (msg) {
	case WSA_ACCEPT:
		WndProc_OnWSAAccept(hWnd, msg, wParam, lParam);
		break;
	case WSA_NETEVENT:
		WndProc_OnWSANetEvent(hWnd, msg, wParam, lParam);
		break;
	HANDLE_hWnd, WM_CREATE, WndProc_OnCreate;
	HANDLE_hWnd, WM_DESTROY, WndProc_OnDestroy;
	HANDLE_hWnd, WM_COMMAND, WndProc_OnCommand;
	HANDLE_hWnd, WM_SIZE, WndProc_OnSize;
	default: return DefWindowProc(hWnd, msg, wParam, lParam);
 } // switch
 return NULL;
} // WndProc

//***************************************************************************

#pragma	argsused
BOOL				WndProc_OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct)
{
 int		rc;
 WSADATA	WSAData;
 //char	szTemp[128];

 rc = WSAStartup(MAKEWORD( 1 , 1 ), &WSAData);
 if (rc !=  0 ) {
	MessageBox(hWnd, "Ошибка инициализации WSA", "", MB_OK);
	return FALSE;
 } // if

 return TRUE;
} // WndProc_OnCreate

//***************************************************************************

#pragma	argsused
void				WndProc_OnDestroy(HWND hWnd)
{

 WSACleanup();
 PostQuitMessage( 0 );
 FORWARD_WM_DESTROY(hWnd, DefWindowProc);
} // WndProc_OnDestroy

//***************************************************************************

#pragma	argsused
void				WndProc_OnCommand(HWND hWnd, int id, HWND hWndCtrl, UINT codeNotify)
{
 switch (id) {
	case	IDM_EXIT:
		DestroyWindow(hWnd);
		break;
	case	IDM_START:
		ServerStart(hWnd);
		break;
	case	IDM_STOP:
		ServerStop(hWnd);
		break;
	default:
		MessageBox(hWnd, "Неизвесная команда", "Ошибка", MB_OK);
 } // switch;
 FORWARD_WM_COMMAND(hWnd, id, hWndCtrl, codeNotify, DefWindowProc);
} // WndProc_OnCommand

//***************************************************************************

#pragma	argsused
void				WndProc_OnSize(HWND hWnd, UINT state, int cx, int cy)
{
 //SendMessage(hWndSB, WM_SIZE, cx, cy);
 FORWARD_WM_SIZE(hWnd, state, cx, cy, DefWindowProc);
} // WndProc_OnSize

//***************************************************************************

#pragma	argsused
void				WndProc_OnWSAAccept(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 int	rc;

 if (WSAGETSELECTERROR(lParam) !=  0 ) {
	MessageBox(hWnd, "Ошибка соединения 1", "Ошибка", MB_OK);
	WSAAsyncSelect(srv_socket, hWnd,  0 ,  0 );
	return;
 } // if

 acc_sin_len = sizeof(acc_sin);
 srv_socket = accept(srv_socket, (LPSOCKADDR)&acc_sin, (int FAR *)&acc_sin_len);
 if (srv_socket == INVALID_SOCKET) {
	MessageBox(hWnd, "Ошибка соединения 2", "Ошибка", MB_OK);
	return;
 } // if
 rc = WSAAsyncSelect(srv_socket, hWnd, WSA_NETEVENT, FD_READ|FD_CLOSE);
 if (rc >  0 ) {
	MessageBox(hWnd, "Ошибка WSAAsyncSelect", "Ошибка", MB_OK);
	closesocket(srv_socket);
	return;
 } // if

} // WndProc_OnWSAAccept

//***************************************************************************

#pragma	argsused
void				WndProc_OnWSANetEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 char	szTmp[ 256 ];
 int		rc;

 if (WSAGETSELECTEVENT(lParam) == FD_READ) {
	rc = recv((SOCKET)wParam, szTmp,  256 ,  0 );
	if (rc) {
		szTmp[rc] =  0 ;
		MessageBox(hWnd, szTmp, "Принятые данные", MB_OK);
	} // if
	return;
 } // if
 if (WSAGETSELECTEVENT(lParam) == FD_CLOSE) {
	MessageBox(hWnd, "Связь прервана", "Сервер", MB_OK);
 } // if

} // WndProc_OnWSANetEvent

//***************************************************************************

#pragma	argsused
void				ServerStart(HWND hWnd)
{
 struct sockaddr_in	srv_address;
 int				rc;

 srv_socket = socket(AF_INET, SOCK_STREAM,  0 );
 if (srv_socket == INVALID_SOCKET) {
	MessageBox(hWnd, "Ошибка при открытии сокета", "Ошибка", MB_OK);
	return;
 } // if

 srv_address.sin_family = AF_INET;
 srv_address.sin_addr.s_addr = INADDR_ANY;
 srv_address.sin_port = htons(SERV_PORT);

 if (bind(srv_socket, (LPSOCKADDR)&srv_address, sizeof(srv_address)) == SOCKET_ERROR) {
	MessageBox(hWnd, "Адресная ошибка", "Ошибка", MB_OK);
	closesocket(srv_socket);
	return;
 } // if

 if (listen(srv_socket,  1 ) == SOCKET_ERROR) {
	MessageBox(hWnd, "Ошибка при установке в режим приема", "Ошибка", MB_OK);
	closesocket(srv_socket);
	return;
 } // if

 rc = WSAAsyncSelect(srv_socket, hWnd, WSA_ACCEPT, FD_ACCEPT);
 if (rc >  0 ) {
	MessageBox(hWnd, "Ошибка WSAAsyncSelect", "Ошибка", MB_OK);
	closesocket(srv_socket);
	return;
 } // if

 MessageBox(hWnd, "Сервер запущен", "Информация", MB_OK);

} // ServerStart

//***************************************************************************

#pragma	argsused
void				ServerStop(HWND hWnd)
{
 WSAAsyncSelect(srv_socket, hWnd,  0 ,  0 );
 if (srv_socket != INVALID_SOCKET) {
	closesocket(srv_socket);
 } // if

 MessageBox(hWnd, "Сервер остановлен", "Информация", MB_OK);

} // ServerStop

tcp_serv.h
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#define	IDI_APPICON		 101 
#define	IDI_APPICON_SM		 102 
#define	IDR_MENU1			 103 
#define	IDM_START			 4001 
#define	IDM_EXIT			 4002 
#define	IDM_STOP			 4003 

#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define	_APS_NO_MFC			 1 
#define	_APS_NEXT_RESOURCE_VALUE	 106 
#define	_APS_NEXT_COMMAND_VALUE	 4004 
#define	_APS_NEXT_CONTROL_VALUE	 1000 
#define	_APS_NEXT_SYMED_VALUE	 101 
#endif
#endif

tcp_serv.rc
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
#include	"tcp_serv.h"

#define APSTUDIO_READONLY_SYMBOLS
//#include	"afxres.h"
#undef  APSTUDIO_READONLY_SYMBOLS

IDR_MENU1	MENU	DISCARDABLE
BEGIN
	POPUP	"&File"
	BEGIN
		MENUITEM	"&Start server"	IDM_START
		MENUITEM	"S&top server"      IDM_STOP
		MENUITEM	SEPARATOR
		MENUITEM	"&Exit"			IDM_EXIT
	END
END

tcp_clnt.c
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
#include	<windows.h>
#include	<windowsx.h>
#include	<string.h>
#include	<winsock.h>
#include	"tcp_clnt.h"


LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
BOOL				WndProc_OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct);
void				WndProc_OnDestroy(HWND hWnd);
void				WndProc_OnCommand(HWND hWnd, int id, HWND hWndCtrl, UINT codeNotify);
void				WndProc_OnSize(HWND hWnd, UINT state, int cx, int cy);
void				SetConnection(HWND hWnd);
void				SendMsg(HWND hWnd);
void				WndProc_OnWSAAccept(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
void				WndProc_OnWSANetEvent(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

#define	SERV_PORT		 5000 
#define	IDS_STATUSBAR	 802 

HINSTANCE	hInst;
char			szAppName[]  = "TCP/IP Client";
char			szAppTitle[] = "TCP/IP Client";
SOCKET		srv_socket;
//int		acc_sin_len;
//SOCKADDR_IN	acc_sin;
SOCKADDR_IN	local_sin;
SOCKADDR_IN	dest_sin;

#pragma	argsused
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
							LPSTR lpCmdLine, int nCmdShow)
{
 WNDCLASS		wc;
 HWND		hWnd;
 MSG			msg;

 hInst = hInstance;
 hWnd = FindWindow(szAppName, NULL);
 if (hWnd) return NULL;

 memset(&wc,  0 , sizeof(wc));
 wc.style = CS_HREDRAW | CS_VREDRAW;
 wc.lpfnWndProc = (WNDPROC)WndProc;
 wc.hInstance = hInst;
 wc.hCursor = LoadCursor(NULL, IDC_ARROW);
 wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+ 1 );
 wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
 wc.lpszClassName = szAppName;
 if (!RegisterClass(&wc)) {
		MessageBox(NULL, "Не удалось зарегистрировать класс окна", "", MB_OK);
		return FALSE;
 } // if
 hWnd = CreateWindow(
	szAppName,
	szAppTitle,
	WS_OVERLAPPEDWINDOW,
	CW_USEDEFAULT,
	 0 ,
	CW_USEDEFAULT,
	 0 ,
	NULL,
	NULL,
	hInst,
	NULL);
 if (!hWnd) {
	MessageBox(NULL, "Не удалось создать окно", "", MB_OK);
	return FALSE;
 } // if
 ShowWindow(hWnd, nCmdShow);
 UpdateWindow(hWnd);
 while (GetMessage(&msg, NULL,  0 ,  0 )) {
	TranslateMessage(&msg);
	DispatchMessage(&msg);
 } // while
 return msg.wParam;
} // WndMain

//***************************************************************************

#pragma	argsused
LRESULT WINAPI WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 switch (msg) {
	HANDLE_hWnd, WM_CREATE, WndProc_OnCreate;
	HANDLE_hWnd, WM_DESTROY, WndProc_OnDestroy;
	HANDLE_hWnd, WM_COMMAND, WndProc_OnCommand;
	HANDLE_hWnd, WM_SIZE, WndProc_OnSize;
	default: return DefWindowProc(hWnd, msg, wParam, lParam);
 } // switch
 //return NULL;
} // WndProc

//***************************************************************************

#pragma	argsused
BOOL				WndProc_OnCreate(HWND hWnd, LPCREATESTRUCT lpCreateStruct)
{
 int		rc;
 WSADATA	WSAData;

 rc = WSAStartup(MAKEWORD( 1 , 1 ), &WSAData);
 if (rc !=  0 ) {
	MessageBox(hWnd, "Ошибка инициализации WSA", "", MB_OK);
	return FALSE;
 } // if

 return TRUE;
} // WndProc_OnCreate

//***************************************************************************

#pragma	argsused
void				WndProc_OnDestroy(HWND hWnd)
{

 WSACleanup();
 PostQuitMessage( 0 );
 FORWARD_WM_DESTROY(hWnd, DefWindowProc);
} // WndProc_OnDestroy

//***************************************************************************

#pragma	argsused
void				WndProc_OnCommand(HWND hWnd, int id, HWND hWndCtrl, UINT codeNotify)
{
 switch (id) {
	case	IDM_EXIT:
		DestroyWindow(hWnd);
		break;
	case	IDM_CONNECT:
		SetConnection(hWnd);
		break;
	case	IDM_SEND:
		SendMsg(hWnd);
		break;
	default:
		MessageBox(hWnd, "Неизвесная команда", "Ошибка", MB_OK);
 } // switch;
 FORWARD_WM_COMMAND(hWnd, id, hWndCtrl, codeNotify, DefWindowProc);
} // WndProc_OnCommand

//***************************************************************************

#pragma	argsused
void				WndProc_OnSize(HWND hWnd, UINT state, int cx, int cy)
{
 FORWARD_WM_SIZE(hWnd, state, cx, cy, DefWindowProc);
} // WndProc_OnSize

//***************************************************************************

#pragma	argsused
void				SetConnection(HWND hWnd)
{
 PHOSTENT		phe;
 //struct sockaddr_in	srv_address;
 //int				rc;

 srv_socket = socket(AF_INET, SOCK_STREAM,  0 );
 if (srv_socket == INVALID_SOCKET) {
	MessageBox(hWnd, "Ошибка при открытии сокета", "Ошибка", MB_OK);
	return;
 } // if

 phe = gethostbyname("localhost");
 if (phe == NULL) {
	MessageBox(hWnd, "Ошибка в имени компьютера", "Ошибка", MB_OK);
	closesocket(srv_socket);
	return;
 } // if

 memcpy((char FAR *)&(dest_sin.sin_addr), phe->h_addr, phe->h_length);


 dest_sin.sin_family = AF_INET;
 dest_sin.sin_addr.s_addr = inet_addr("127.0.0.1");
 dest_sin.sin_port = htons(SERV_PORT);
 
 if (connect(srv_socket, (LPSOCKADDR)&dest_sin, sizeof(dest_sin)) <  0 ) {
	MessageBox(hWnd, "Адресная ошибка", "Ошибка", MB_OK);
	closesocket(srv_socket);
	return;
 } // if

 MessageBox(hWnd, "Связь установлена", "", MB_OK);

} // ServerStart

//***************************************************************************

#pragma	argsused
void				SendMsg(HWND hWnd)
{
 char	szBuf[ 80 ];
 lstrcpy(szBuf, "Проверка связи");
 send(srv_socket, szBuf, lstrlen(szBuf),  0 );
} // ServerStop

tcp_clnt.h
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
#define	IDI_APPICON		 101 
#define	IDI_APPICON_SM		 102 
#define	IDR_MENU1			 103 
#define	IDM_START			 4001 
#define	IDM_EXIT			 4002 
#define	IDM_STOP			 4003 
#define	IDM_CONNECT		 4004 
#define	IDM_SEND			 4005 

tcp_clnt.rc
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
#include	"tcp_clnt.h"

#define APSTUDIO_READONLY_SYMBOLS
//#include	"afxres.h"
#undef  APSTUDIO_READONLY_SYMBOLS

IDR_MENU1	MENU	DISCARDABLE
BEGIN
	POPUP	"&File"
	BEGIN
		MENUITEM	"&Connect"		IDM_CONNECT
		MENUITEM	"&Send message"     IDM_SEND
		MENUITEM	SEPARATOR
		MENUITEM	"&Exit"			IDM_EXIT
	END
END
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34299939
SnowMan2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Функция accept имеет следующий прототип:

SOCKET accept (SOCKET sock, struct sockaddr FAR * addr,
int FAR * addrlen);

Через параметр sock необходимо указать дескриптор сокета, который находится в режиме приема для выполнения ожидания.

Параметр addr должен содержать адрес буфера, в который будет записан адрес узла, подключившегося к серверу. Размер этого буфера необходимо указать в переменной типа int, адрес которой передается через параметр addrlen.
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34299970
Lepaj
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan) Я очень сильно удивлюсь если тот УЖОС что ты сюда запостил заработает, но отдаю должное твоему трудолюбию


УЖОС работает... Как говорил это мой первый опыт с сокетами, буду перерабатывать :) не возможно с первого раза создать совершенство, не создав пару монстров... Как я говорил выше, не все рождаются гениями...

Gluk (Kazan)Очень советую найти и почитать это, то что Unix можешь не обращать внимания.

Спасибо за информацию, постараюсь прилежно изучить данную книгу :)

SnowMan2 Пример из старых запасов, вроде работает. Сейчас пишу на Builder-e, там несколько иначе и проще.

Спасибо, но к сожалению я не очень хорошо дружу с Visual C, попытаюсь разобратся...

Gluk (Kazan)P.S. И нафига тебе вперлось WSA можешь объяснить ???

Ответ на сее безобразие прост... В примере, по которому я учился работе с сокетами, данное использование объяснялось тем, что приложение требовалось привязать к конкретному окну виндовс, что бы задавать ему статичный порт...

P.S.: спасибо всем, что потратили время на тот бред, что я написал :)
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34301098
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LepajОтвет на сее безобразие прост... В примере, по которому я учился работе с сокетами, данное использование объяснялось тем, что приложение требовалось привязать к конкретному окну виндовс, что бы задавать ему статичный порт...


Из WSA тебе понядобятся только Startup и Cleanup :)

На еще попсу покороче чем кнышка
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34302224
SnowMan2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторсожалению я не очень хорошо дружу с Visual C
Visual C тут не причем, все компилилось старым Borland-ом 5.01

Gluk (Kazan)Из WSA тебе понядобятся только Startup и Cleanup
Не согласен. ИМХО ассинхронный режим лучше синхронного. Поэтому понадобится WSAAsyncSelect и обработка сообщений. А вот от консольного приложения и функции printf посоветовал бы отказаться, Windows все таки. Также советовал бы на начальном этапе разделить клиент и сервер, так легче разобраться. Затем можно и объединеть.
...
Рейтинг: 0 / 0
Помогите разобратся с IP адресами
    #34302256
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SnowMan2 Gluk (Kazan)Из WSA тебе понядобятся только Startup и Cleanup
Не согласен. ИМХО ассинхронный режим лучше синхронного. Поэтому понадобится WSAAsyncSelect и обработка сообщений. А вот от консольного приложения и функции printf посоветовал бы отказаться, Windows все таки. Также советовал бы на начальном этапе разделить клиент и сервер, так легче разобраться. Затем можно и объединеть.

Posix-ый select в WinSock прекрасно работает. Извращения с оконными сообщениями совсем ни к чему. Что касается консольных приложений - у меня все сервисы такие, так что как раз в printf не вижу никакого криминала. Приложения они ить РАЗНЫЕ бывають (даже под Windows).
...
Рейтинг: 0 / 0
39 сообщений из 39, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Помогите разобратся с IP адресами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]