Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
3 / 3 / 0
Регистрация: 17.11.2009
Сообщений: 210

Библиотека реализующая команду PING

05.01.2010, 12:16. Показов 1900. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет Всем
Есть вопрос. Пишу я на фоксе, который сам по себе является однопоточным.
Для решения одной задачи имеется библиотека написанная на Си реализующая
команду PING.
Имеется попытка разделить задачу на две -
При запуске указывается параметр
programm.exe 1, либо programm.exe 2.
При одновременной работе двух этих программ - происходит потеря пакетов
и в первой и второй прорамме.
Попытка перекомпилировать эту библиотеку с другим именем никчему не привела.
Потери остались.
Возникает вопрос: В чём проблема?
Может что-то неправильно с определением сокетов?
Код библиотеки привожу ниже
Александр
C++
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
#pragma pack(4)
 
#define WIN32_LEAN_AND_MEAN
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <pro_ext.h>
#include <ws2tcpip.h>
 
#define ICMP_ECHO 8
#define ICMP_ECHOREPLY 0
#define ICMP_MIN 8  // Пакет icmp не менее 8 байт (Заголовок)
#define IP_RECORD_ROUTE  0x7
 
/* The IP header */
typedef struct iphdr {
 unsigned int h_len:4;          // Длина заголовка
 unsigned int version:4;        // Версия IP
 unsigned char tos;             // Тип службы
 unsigned short total_len;      // Полный размер пакета
 unsigned short ident;          // Уникальный идентификатор
 unsigned short frag_and_flags; // Флаги
 unsigned char  ttl;      //  :(char*)ICMP_ECHO;
 unsigned char proto;           // Протокол (TCP, UDP etc)
 unsigned short checksum;       // Контрольная сума IP
 
 unsigned int sourceIP;
 unsigned int destIP;
 
}IpHeader;
 
//
// Структура заголовка ICMP
//
typedef struct _ihdr {
  BYTE i_type;
  BYTE i_code; /* Тип субкода */
  USHORT i_cksum;
  USHORT i_id;
  USHORT i_seq;
  /* Это не стандартный заголовок, но резервируется место для времени */
  ULONG timestamp;
}IcmpHeader;
 
//
// Расширенный заголовок IP применяется с параметром сокета IP_OPTIONS
//
typedef struct _ipoptionhdr
{
    unsigned char        code;        // Option type
    unsigned char        len;         // Length of option hdr
    unsigned char        ptr;         // Offset into options
    unsigned long        addr[9];     // List of IP addrs
} IpOptionHeader;
 
#define STATUS_FAILED 0xFFFF
#define DEF_PACKET_SIZE 32  // Стандартный размер пакета
#define MAX_PACKET 1024   // Максимальный размер ICMP пакета
#define MAX_IP_HDR_SIZE 60  // Максимальный размер заголовка IP
        // с параметрами
 
#define xmalloc(s) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(s))
#define xfree(p)   HeapFree (GetProcessHeap(),0,(p))
 
void fill_icmp_data(char *, int);
USHORT checksum(USHORT *, int);
void decode_resp(char *,int ,struct sockaddr_in *);
 
char pszMachineName[255];
 
void NullTerminate(Value FAR *cVal)
{
 
 _HUnLock(cVal->ev_handle);
 
 if (!_SetHandSize(cVal->ev_handle, cVal->ev_length + 1))
   {
      _Error(182); // Not enough memory
   }
   ((char FAR *) _HandToPtr(cVal->ev_handle))[cVal->ev_length] = ''
}
 
// Ping function
FAR Ping(ParamBlk FAR *parm)
{
 
  WSADATA wsaData;
  SOCKET sockRaw = INVALID_SOCKET;
  struct sockaddr_in dest,from;
  struct hostent * hp = NULL;
  int bread,datasize;
  int fromlen = sizeof(from);
  int timeout = 500;
  int timeoutrc = timeout;
  int timeoutso = timeout; // 28.11.2002
  int timttl = 2;     // 28.11.2002
//  int nsleep = 500; // 1000  27.10.2003
 
  char *dest_ip;
  char *icmp_data = NULL;
  char *recvbuf = NULL;
  unsigned int addr=0;
  USHORT seq_no = 0;
  datasize = DEF_PACKET_SIZE;  // 8.12.2002
 
 // 1 параметр
 
  _HLock ( parm->p[0].val.ev_handle );
  NullTer   vbuf,MAX_PACKET,0,(struct sockaddr*)&from,
     &fromlen);
 
 if (bread == SOCKET_ERROR){
   if (WSAGetLastError() == WSAETIMEDOUT) {
  _RetInt(-2,10); /* Time Out */
//  continue;
  closesocket( sockRaw );
  xfree(icmp_data);
  xfree(recvbuf);
  WSACleanup( );
  return 0 ;
   }
  _RetInt(-7,10);
 
  closesocket( sockRaw );
  xfree(icmp_data);
  xfree(recvbuf);
  WSACleanup( );
  return 0 ;
 }
 
 decode_resp(recvbuf,bread,&from);
 
 closesocket( sockRaw );
 xfree(icmp_data);
 xfree(recvbuf);
 WSACleanup( );
 return 0;
 
// Sleep(1000);//  27.11.2002
// Sleep(nsleep);
 
  }
 
  closesocket( sockRaw );
  HeapFree(GetProcessHeap(), 0, recvbuf);
  HeapFree(GetProcessHeap(), 0, icmp_data);
  WSACleanup( );
  return 0;
 
}
 
/*
 Ответом является IP пакет. Нужно декодировать IP заголовок
 для нахождения даных ICMP
*/
 
void decode_resp(char *buf, int bytes,struct sockaddr_in *from) {
 
 IpHeader *iphdr = NULL;
 IcmpHeader *icmphdr = NULL;
 unsigned short iphdrlen;
 
 iphdr = (IpHeader *)buf;
 iphdrlen = iphdr->h_len * 4 ; // number of 32-bit words *4 = bytes
 
 /* 224.12.2002 */
 if (bytes  < iphdrlen + ICMP_MIN) {
//  printf('Too few bytes from %s
',inet_ntoa(from->sin_addr));
  _RetInt(-400000000-(GetTickCount()-icmphdr->timestamp),10);
 
 }
 /* */
 
 icmphdr = (IcmpHeader*)(buf + iphdrlen);
 if (icmphdr->i_type != ICMP_ECHOREPLY) {
  /* Отклик не получен */
  _RetInt(-3,10);  /* No echo */
  return ;
 }
 if (icmphdr->i_id != (USHORT)GetCurrentProcessId()) {
  /* Это не наш отклик */
  _RetInt(-3,10); /* Nothing */
  return ;
 }
 
 _RetInt(GetTickCount()-icmphdr->timestamp, 10 ); /* Ok */
 return ;
 
}
 
// функция вычисления 16-битной комплиментарной
// контрольной сумы для указанного буфера с заголовком
 
USHORT checksum(USHORT *buffer, int size) {
 
  unsigned long cksum=0;
 
  while(size >1) {
 cksum+=*buffer++;
 size -=sizeof(USHORT);
  }
 
  if(size ) {
 cksum += *(UCHAR*)buffer;
  }
 
  cksum = (cksum >> 16) + (cksum & 0xffff);
  cksum += (cksum >>16);
  return (USHORT)(~cksum);
}
 
//
// Функция fill_icmp_data для заполнения полей запроса
//
 
void fill_icmp_data(char * icmp_data, int datasize){
 
  IcmpHeader *icmp_hdr = NULL;
  char *datapart = NULL;
 
  icmp_hdr = (IcmpHeader*)icmp_data;
  icmp_hdr->i_type = ICMP_ECHO; // Эхо запрос ICMP
  icmp_hdr->i_code = 0;
  icmp_hdr->i_id = (USHORT)GetCurrentProcessId();
  icmp_hdr->i_cksum = 0;
  icmp_hdr->i_seq = 0;
 
  datapart = icmp_data + sizeof(IcmpHeader);
  //
  // Поместите данные в буфер
  //
  memset(datapart,'E', datasize - sizeof(IcmpHeader));
 
}
 
 
FoxInfo myFoxInfo[] =
{
 {'PING', (FPFI) Ping, 3, 'C,I,I'},
// {'PING', (FPFI) Ping, 1, 'C'},
};
 
FoxTable _FoxTable =
{
    (FoxTable FAR *)0, sizeof(myFoxInfo) / sizeof(FoxInfo), myFoxInfo
};
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.01.2010, 12:16
Ответы с готовыми решениями:

Библиотека реализующая функции калькулятора
Добрый день! Так звучит задание: Необходимо написать библиотеку реализующую функции калькулятора(add, usb, mul, div). На выходе хотелось...

Существует ли библиотека, реализующая поиск решений аналогичный EXCEL
Подскажите, пожалуйста, существует ли библиотека, реализующая поиск решений аналогичный EXCEL в с#? Может, можно как-то напрямую...

Как выполнить команду Ping в Windows 7?
подскажите, как пинговать в W7? в XP я знаю, а в 7 не разберусь (((

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.01.2010, 12:16
Помогаю со студенческими работами здесь

Как задать команду ping [IP] в Visual Studio 2010?
Помогите! Как задать команду ping в Visual Studio 2010 с++? мне нужно что бы я сам вводил IP. #include&lt;iostream&gt; using...

Небольшое исследование по скорости работы интернета через команду ping -t 8.8.8.8
Здравствуйте. Я хочу стабилизировать свой интернет через wi-fi. Первая часть. Несколько лет у меня самопроизвольно периодически...

Есть ping по IP, нет ping по имени
Здравствуйте. Имею AD, DNS, DHCP, терминальная ферма, тонкие клиенты (всё введено в домен) Контроллер домена - ad.mydomen.local...

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

Программа, реализующая стек
Нужно сделать программу, реализующую стек в виде динамической структуры данных. Информационной частью элемента стека является символ. В...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru