Форум программистов, компьютерный форум, киберфорум
Delphi: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 43
1

сервер не хочет работать

27.12.2012, 21:21. Показов 923. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
посмотрите пожалуйста код. вроде компилируется но .exe с ошибкой и не хочет запускаться. это сервер чата. он ищет сокеты, готовые для работы, поочередно принимает от них сообщения и рассылает всем клиентам.
Delphi
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
unit Server;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, WinSock, Menus, ExtCtrls;
 
type
  TForm1 = class(TForm)
    btn1: TBitBtn;
    edt1: TEdit;
    btn2: TBitBtn;
    txt1: TStaticText;
    mm1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    edt2: TEdit;
    lbl1: TLabel;
    tmr1: TTimer;
    btn3: TBitBtn;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure N2Click(Sender: TObject);
   procedure tmr1Timer(Sender: TObject);
    procedure btn3Click(Sender: TObject);
  private
    { Private declarations }
    function RDTSC: UInt64; register;
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  log: TextFile; //файл для ведения лога работы
  Sockets:array of TSocket; //массив соккетов
  Addrs: array of TSockAddr; //массив адресов сокетов
  Timeout: timeval; //врямя ожидания действий со стороны клиентов
  server_port: Integer; //номер слушающего порта
 
implementation
 
{$R *.dfm}
 
  ///Работа сервера
procedure TForm1.btn1Click(Sender: TObject);
var
    Addr:TSockAddr;
    Len,I,J:Integer;
    FDSet:TFDSet;
    str,buf1,buf2: string;
    Time, time1:Tdatetime;
    buf: Extended;
begin
    setlength(str, 1024);
    i:= 0;
       // 1. Формирование множества сокетов
    FD_Zero(FDSet);
    for I:=0 to High(Sockets) do
     FD_Set(Sockets[I],FDSet);
       // 3. Чтение запросов клиентов тех сокетов, которые готовы к этому
    I:=1;
    while I<=High(Sockets) do
     begin
      if FD_IsSet(Sockets[I],FDSet) then
       if Recv(Sockets[I],str[1],1024,0)<=0 then
        begin
         // Связь разорвана, надо закрыть сокет
         // и удалить его из массива
         CloseSocket(Sockets[I]);
         for J:=I to High(Sockets)-1 do
           begin
             Sockets[j]:=Sockets[j+1];
             Addrs[j]:= Addrs[j+1];
           end;
         Dec(I);
         SetLength(Sockets,Length(Sockets)-1);
         SetLength(Addrs,Length(Addrs)-1);
        end
       else
        begin
           //Адрес клиента
                  buf1:= inet_ntoa(Addrs[i].sin_addr);
                  buf2:= inttostr(ntohs(Addrs[i].sin_port));
                // buf2:= 'IP-адрес клиента: '+buf1+': '+buf2;
                buf2:= ' '+buf1+': '+buf2;
                  write(log,buf2);
                  //Время получения запроса
                  buf1:= timetostr(time);
                  buf2:= '                  ' + buf1;
                  write(log, buf2);
                 //Запрос
                 buf2:= '                             '+str;
                  write(log, buf2);
 
          while I<=High(Sockets) do
            begin
              send(Sockets[I], str[1], Length(buf1), 0);
              Inc(i);
            end;
          // Получены данные от клиента, надо ответить
            end;
          end;
 
      Inc(I);
 
    // 4. Проверка подключения нового клиента
    if FD_IsSet(Sockets[0],FDSet) then
     begin
      // Подключился новый клиент
      SetLength(Sockets,Length(Sockets)+1);
      SetLength(Addrs,Length(Addrs)+1);
      Len:=SizeOf(TSockAddr);
      Sockets[High(Sockets)]:=Accept(Sockets[0],@Addr,@Len);
      Addrs[High(Sockets)]:= Addr; //адрес нового клиента
      if Sockets[High(Sockets)] = INVALID_SOCKET then
        begin
          showmessage('Ошибка при ожидании подключения клиента');
          SetLength(Sockets,Length(Sockets)-1);
          SetLength(Addrs,Length(Addrs)-1);
        end
      else
           //Проверка переполнения множества сокетов
        if Length(Sockets)>64 then
          begin
            CloseSocket(Sockets[High(Sockets)]); //Отказываем лишнему сокету
            SetLength(Sockets,Length(Sockets)-1);
            SetLength(Addrs,Length(Addrs)-1);
          end;
     end;
end;
 
procedure TForm1.tmr1Timer(Sender: TObject);
begin
   Application.ProcessMessages;
   btn1.Click;
end;
 
  ///Выход
procedure TForm1.btn2Click(Sender: TObject);
var i: word;
begin
  tmr1.Enabled:= False;
  //Закрываем все имеющиеся соккеты
  for i:= 0 to High(Sockets) do
    begin
      shutdown(Sockets[i],SD_Both);
      CloseSocket(Sockets[i]);
    end;
    WSACleanup;  //закрываем библиотеку
  closefile(log);
  Application.Terminate;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var
  WSAData:TWSAData;
  Addr:TSockAddr;
begin
  tmr1.Enabled:= False;
    AssignFile(log,'log.txt');
    Rewrite(log); // открытие файла для записи
    write(log, '   IP-адрес клиента:     ');
    write(log, 'Время получения запроса:     ');
     write(log, 'Запрос:              ');
    write(log, 'Ответ:               ');
 
  if WSAStartup($101, WSAData) <> 0 then
      begin
        Showmessage('Ошибка при инициализации библиотеки WinSock');
        Application.Terminate;
      end;
 
  SetLength(Sockets,1);
  SetLength(Addrs,1);
  Sockets[0]:=Socket(AF_Inet,Sock_Stream,0);
  if Sockets[0] = INVALID_SOCKET then
    begin
      showmessage('Невозможно создать слушающий сокет: ');
      Exit;
    end;
  Addr.sin_family:=AF_Inet;
  server_port:= strtoint(edt1.text);
  if server_port <= 1024 then
     begin
       Showmessage('Номер порта должен лежать в диапазоне 1025-65535');
       Exit;
     end;
  Addr.sin_port:= HToNS(server_port);
  Addr.sin_addr.S_addr:= InAddr_Any;
  FillChar(Addr.Sin_Zero,SizeOf(Addr.Sin_Zero),0);
   if bind(Sockets[0], Addr, SizeOf(TSockAddr)) = SOCKET_ERROR then
     begin
      showmessage('Невозможно привязать слушающий сокет к адресу' );
      Exit;
     end;
  if listen(Sockets[0], SOMAXCONN) = SOCKET_ERROR then
   begin
      showmessage('Невозможно установить сокет в режим прослушивания');
      Exit;
   end;
end;
 
 
 ///Функция определения количества тактов процессора
function TForm1.RDTSC: UInt64;register;
asm
   rdtsc
end;
   ///Файл->выход
procedure TForm1.N2Click(Sender: TObject);
begin
  btn2.Click;
end;
 
    ///Запуск
procedure TForm1.btn3Click(Sender: TObject);
var
  Addr:TSockAddr;
begin
  if strtoint(edt1.text) <> server_port then //если изменён порт
     begin
       CloseSocket(Sockets[0]);
       Sockets[0]:=Socket(AF_Inet,Sock_Stream,0);
       if Sockets[0] = INVALID_SOCKET then
          begin
            showmessage('Невозможно создать слушающий сокет: ');
            Exit;
          end;
       Addr.sin_family:=AF_Inet;
       server_port:= strtoint(edt1.text);
       if server_port <= 1024 then
         begin
           Showmessage('Номер порта должен лежать в диапазоне 1025-65535');
           Exit;
         end;
       Addr.sin_port:= HToNS(server_port);
       Addr.sin_addr.S_addr:= InAddr_Any;
       FillChar(Addr.Sin_Zero,SizeOf(Addr.Sin_Zero),0);
       if bind(Sockets[0], Addr, SizeOf(TSockAddr)) = SOCKET_ERROR then
         begin
           showmessage('Невозможно привязать слушающий сокет к адресу' );
           Exit;
         end;
       if listen(Sockets[0], SOMAXCONN) = SOCKET_ERROR then
         begin
           showmessage('Невозможно установить сокет в режим прослушивания');
           Exit;
         end;
     end;
  tmr1.Enabled:= True;
end;
 
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.12.2012, 21:21
Ответы с готовыми решениями:

Сервер - ну никак не хочет работать:(
Доброго времени суток, уважаемые форумчане:) Устроился я на новую работу в небольшую компанию,...

Сервер HP не хочет работать с новой оперативой
Всем привет!!!! Есть железо: Сервер HP Proliant ML150G6 E5520 (2.26GH-8MB)Quad Core (2 max)/...

Интернет не хочет работать,все хорошо подключается а браузер открывать не хочет первую страницу отображает
ребят такой вопрос,установил винду 8,все норм только интернет не хочет работать,все хорошо...

Как может сервер-сайд код работать или не работать на конкретном компе?
Всем привет! Вот такая проблема. Есть сайт, все работает ок, но - один из компов имеющий Win98 и...

19
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
27.12.2012, 21:48 2
Есть мнение что ты сдул где-то этот код.
0
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 43
27.12.2012, 21:55  [ТС] 3
Цитата Сообщение от mss Посмотреть сообщение
Есть мнение что ты сдул где-то этот код.
Есть мнение, что я не спрашивал твое мнение о том, где я его взял. Для справки: частично код взят из статьи про работу с сокетами в делфи, частично у мегаумного одногруппника ( за что ему большое спасибо ) и переделан под свои нужды.

Если есть что сказать по делу - говори (буду благодарен и признателен). В противном случае не трать время на то, чтобы высказать свои догадки о происхождении кода тому, кто ими не интересуется.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
27.12.2012, 22:08 4
Цитата Сообщение от serejka6666 Посмотреть сообщение
и переделан
Нагло врешь.
Если бы действительно переделывал, то свободно ориентировался бы в происходящем и не задавал бы этот дурацкий вопрос.
0
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 43
27.12.2012, 22:14  [ТС] 5
Цитата Сообщение от mss Посмотреть сообщение
Нагло врешь.
Если бы действительно переделывал, то свободно ориентировался бы в происходящем и не задавал бы этот дурацкий вопрос.
переделан!!!!!!! не вру. он отправлял изначально время и поправку на время.
тут я пытаюсь полученное на сервер от клиента сообщение отправить всем подключенным клиентам. да и смысл врать? я на делфе писал-то всего пару раз программы =\ ты можешь помочь? или же ты можешь только мозги мне трахать?) какой ты в этом видишь смысл?
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
27.12.2012, 22:20 6
Цитата Сообщение от serejka6666 Посмотреть сообщение
переделан!!!!!!! не вру
Тогда и вопроса не должно было быть - разработка на уровне winsock api подразумевает полное понимание происходящего.
0
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 43
27.12.2012, 22:30  [ТС] 7
Цитата Сообщение от mss Посмотреть сообщение
Тогда и вопроса не должно было быть - разработка на уровне winsock api подразумевает полное понимание происходящего.
вопрос есть и он остается в силе. в чем тут проблема? хотя бы участок кода =\

а теперь раз ты настолько умный подумай и сделай вывод о том, почему я написал сюда. доходит, что я видимо что-либо не допонимаю или не понимаю вообще?

и раз уж ты написал и делаешь умный вид, помоги уж будь добр.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
27.12.2012, 22:39 8
Цитата Сообщение от serejka6666 Посмотреть сообщение
я видимо что-либо не допонимаю или не понимаю вообще
Второе не подлежит никакому сомнению, что и дает основание полагать что код ты сдул.
В противном случае ты соизволил бы хотя бы процитировать текст сообщения об исключении.

Цитата Сообщение от serejka6666 Посмотреть сообщение
раз ты настолько умный подумай и сделай вывод
На "слабо" бери своего "одногруппника".
0
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 43
27.12.2012, 22:45  [ТС] 9
Цитата Сообщение от mss Посмотреть сообщение
Второе не подлежит никакому сомнению, что и дает основание полагать что код ты сдул.
В противном случае ты соизволил бы хотя бы процитировать текст сообщения об исключении.



На "слабо" бери своего "одногруппника".
о каком исключении? я на слабо не беру. я прошу помощи, а ты меня пытаешься учить непонятно чему. чего ты от меня добиваешься? раз я сказал, что частично взял, значит я взял,но и переделывал тоже. я знаю цену своим словам и неважно где они сказаны: на улице или же на каком бы то ни было форуме.

Добавлено через 58 секунд
то, из чего переделывал.
Delphi
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
unit Server;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, WinSock, Menus, ExtCtrls;
 
type
  TForm1 = class(TForm)
    btn1: TBitBtn;
    edt1: TEdit;
    btn2: TBitBtn;
    txt1: TStaticText;
    mm1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    edt2: TEdit;
    lbl1: TLabel;
    tmr1: TTimer;
    btn3: TBitBtn;
    procedure btn1Click(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure tmr1Timer(Sender: TObject);
    procedure btn3Click(Sender: TObject);
  private
    { Private declarations }
    function RDTSC: UInt64; register;
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  log: TextFile; //файл для ведения лога работы
  Sockets:array of TSocket; //массив соккетов
  Addrs: array of TSockAddr; //массив адресов сокетов
  Timeout: timeval; //врямя ожидания действий со стороны клиентов
  server_port: Integer; //номер слушающего порта
 
implementation
 
{$R *.dfm}
 
  ///Работа сервера
procedure TForm1.btn1Click(Sender: TObject);
const
   f_of_proc = 21000; //тактовая частота процессора в мкс
var
    Addr:TSockAddr;
    Len,I,J:Integer;
    chet,a,b: UInt64;
    FDSet:TFDSet;
    str,buf1,buf2: string;
    Time, time1:Tdatetime;
    buf: Extended;
begin
    setlength(str, 4);
    i:= 0;
       // 1. Формирование множества сокетов
    FD_Zero(FDSet);
    for I:=0 to High(Sockets) do
     FD_Set(Sockets[I],FDSet);
    // 2. Проверка готовности сокетов
    if edt2.Text = 'oo' then   //Бесконечное время ожидания
      Select(0,@FDSet,nil,nil,nil)
    else
    begin
      try
        j:= StrToInt(edt2.Text);
      except
         j:= 0;
         ShowMessage('Время должно быть целым положительным числом!');
      end;
      if  j > 0 then
        Timeout.tv_sec:= StrToInt(edt2.Text);
      if  Select(0,@FDSet,nil,nil,@timeout) = 0 then
        begin
           tmr1.Enabled:= False;
           Exit;
        end;
    end;
    // 3. Чтение запросов клиентов тех сокетов, которые готовы к этому
    I:=1;
    while I<=High(Sockets) do
     begin
      if FD_IsSet(Sockets[I],FDSet) then
       if Recv(Sockets[I],str[1],4,0)<=0 then
        begin
         // Связь разорвана, надо закрыть сокет
         // и удалить его из массива
         CloseSocket(Sockets[I]);
         for J:=I to High(Sockets)-1 do
           begin
             Sockets[j]:=Sockets[j+1];
             Addrs[j]:= Addrs[j+1];
           end;
         Dec(I);
         SetLength(Sockets,Length(Sockets)-1);
         SetLength(Addrs,Length(Addrs)-1);
        end
       else
        begin
          Time:=SysUtils.Time;
          a:= RDTSC;
         // Получены данные от клиента, надо ответить
         if str <> 'Time' then
           begin
             showmessage('Неверный запрос!');
           end
         else
         begin
           buf1:= 'Prov';   //Отправка клиенту комнды на определение задержки
           if send(Sockets[I], buf1[1], Length(buf1), 0) < 0 then
             begin
               showmessage('Ошибка при отправке данных клиенту');
                        // Связь разорвана, надо закрыть сокет
                   // и удалить его из массива
                CloseSocket(Sockets[I]);
                for j:=i to High(Sockets)-1 do
                  begin
                    Sockets[j]:=Sockets[j+1];
                    Addrs[j]:= Addrs[j+1];
                  end;
                 Dec(I);
                SetLength(Sockets,Length(Sockets)-1);
                SetLength(Addrs,Length(Addrs)-1);
                buf2:= 'Запрос не выполнен!';
                writeln(log, buf2);
 
             end
           else
             begin
               setlength(buf2, 4);  //принимаем команду 'Prov'
             if Recv(Sockets[I],buf2[1],length(buf2),0)<=0 then
               begin
                 // Связь разорвана, надо закрыть сокет
                  // и удалить его из массива
                 CloseSocket(Sockets[I]);
                 for j:=i to High(Sockets)-1 do
                   begin
                    Sockets[j]:=Sockets[j+1];
                    Addrs[j]:= Addrs[j+1];
                   end;
                 Dec(I);
                 SetLength(Sockets,Length(Sockets)-1) ;
                 SetLength(Addrs,Length(Addrs)-1);
                 buf2:= 'Запрос не выполнен!';
                 writeln(log, buf2);
               end
               else
              begin
                b:= RDTSC;
                chet:= b-a;
                 buf:= chet / 2;  //задержка в тиках
                 buf:= buf/f_of_proc; //задержка в мкс
                 buf:= Round(buf*10000)/10000;
                 //Адрес клиента
                  buf1:= inet_ntoa(Addrs[i].sin_addr);
                  buf2:= inttostr(ntohs(Addrs[i].sin_port));
                // buf2:= 'IP-адрес клиента: '+buf1+': '+buf2;
                buf2:= ' '+buf1+': '+buf2;
                  write(log,buf2);
                  //Время получения запроса
                  buf1:= timetostr(time);
                  buf2:= '                  ' + buf1;
                  write(log, buf2);
                 //Запрос
                 buf2:= '                             '+str;
                  write(log, buf2);
                  //Ответ
                  buf2:= FloatToStr(buf);
                 time:=SysUtils.Time;
                 buf1:= timetostr(time)+' + '+buf2+' мкс';
                if send(Sockets[I], buf1[1], Length(buf1), 0) < 0 then
                   begin
                    showmessage('Ошибка при отправке данных клиенту');
                         // Связь разорвана, надо закрыть сокет
                      // и удалить его из массива
                     CloseSocket(Sockets[I]);
                     for J:=I to High(Sockets)-1 do
                       begin
                         Sockets[j]:=Sockets[j+1];
                         Addrs[j]:= Addrs[j+1];
                       end;
                      Dec(I);
                      SetLength(Sockets,Length(Sockets)-1);
                      SetLength(Addrs,Length(Addrs)-1);
                      buf2:= '      Запрос не выполнен!';
                      write(log, buf2);
                   end
                else
                 begin
                   buf2:= '      '+buf1;
                   write(log, buf2);
                 end;
                          //Время отправления
                buf1:= timetostr(time);
                buf2:= '                   ' + buf1;
                writeln(log, buf2);
              end;
            end;
          end;
        end;
      Inc(I);
     end;
    // 4. Проверка подключения нового клиента
    if FD_IsSet(Sockets[0],FDSet) then
     begin
      // Подключился новый клиент
      SetLength(Sockets,Length(Sockets)+1);
      SetLength(Addrs,Length(Addrs)+1);
      Len:=SizeOf(TSockAddr);
      Sockets[High(Sockets)]:=Accept(Sockets[0],@Addr,@Len);
      Addrs[High(Sockets)]:= Addr; //адрес нового клиента
      if Sockets[High(Sockets)] = INVALID_SOCKET then
        begin
          showmessage('Ошибка при ожидании подключения клиента');
          SetLength(Sockets,Length(Sockets)-1);
          SetLength(Addrs,Length(Addrs)-1);
        end
      else
           //Проверка переполнения множества сокетов
        if Length(Sockets)>64 then
          begin
            CloseSocket(Sockets[High(Sockets)]); //Отказываем лишнему сокету
            SetLength(Sockets,Length(Sockets)-1);
            SetLength(Addrs,Length(Addrs)-1);
          end;
     end;
end;
 
  ///Выход
procedure TForm1.btn2Click(Sender: TObject);
var i: word;
begin
  tmr1.Enabled:= False;
  //Закрываем все имеющиеся соккеты
  for i:= 0 to High(Sockets) do
    begin
      shutdown(Sockets[i],SD_Both);
      CloseSocket(Sockets[i]);
    end;
    WSACleanup;  //закрываем библиотеку
  closefile(log);
  Application.Terminate;
end;
 
procedure TForm1.FormCreate(Sender: TObject);
var
  WSAData:TWSAData;
  Addr:TSockAddr;
begin
  tmr1.Enabled:= False;
    AssignFile(log,'log.txt');
    Rewrite(log); // открытие файла для записи
    write(log, '   IP:     ');
    write(log, 'Время получения запроса:     ');
     write(log, 'Запрос:              ');
    write(log, 'Ответ:               ');
    writeln(log, 'Время отправления ответа:   ');
    writeln();
 
    // Инициализация библиотеки сокетов
    if WSAStartup($101, WSAData) <> 0 then
      begin
        Showmessage('Ошибка при инициализации WinSock');
        Application.Terminate;
      end;
    Timeout.tv_sec:= 60;  //время ожидания сервером совершения отпраки запросов
                          //клиентов
  SetLength(Sockets,1);
  SetLength(Addrs,1);
  Sockets[0]:=Socket(AF_Inet,Sock_Stream,0);
  if Sockets[0] = INVALID_SOCKET then
    begin
      showmessage('Невозможно создать слушающий сокет: ');
      Exit;
    end;
  Addr.sin_family:=AF_Inet;
  server_port:= strtoint(edt1.text);
  if server_port <= 1024 then
     begin
       Showmessage('Номер порта в диапазоне [1025..65535]');
       Exit;
     end;
  Addr.sin_port:= HToNS(server_port);
  Addr.sin_addr.S_addr:= InAddr_Any;
  FillChar(Addr.Sin_Zero,SizeOf(Addr.Sin_Zero),0);
   if bind(Sockets[0], Addr, SizeOf(TSockAddr)) = SOCKET_ERROR then
     begin
      showmessage('Невозможно привязать слушающий сокет к адресу' );
      Exit;
     end;
  if listen(Sockets[0], SOMAXCONN) = SOCKET_ERROR then
   begin
      showmessage('Невозможно установить сокет в режим прослушивания');
      Exit;
   end;
end;
 
 ///Функция определения количества тактов процессора
function TForm1.RDTSC: UInt64;register;
asm
   rdtsc
end;
   ///Файл->выход
procedure TForm1.N2Click(Sender: TObject);
begin
  btn2.Click;
end;
 
procedure TForm1.tmr1Timer(Sender: TObject);
begin
   Application.ProcessMessages;
   btn1.Click;
end;
    ///Запуск
procedure TForm1.btn3Click(Sender: TObject);
var
  Addr:TSockAddr;
begin
  if strtoint(edt1.text) <> server_port then //если изменён порт
     begin
       CloseSocket(Sockets[0]);
       Sockets[0]:=Socket(AF_Inet,Sock_Stream,0);
       if Sockets[0] = INVALID_SOCKET then
          begin
            showmessage('Невозможно создать слушающий сокет: ');
            Exit;
          end;
       Addr.sin_family:=AF_Inet;
       server_port:= strtoint(edt1.text);
       if server_port <= 1024 then
         begin
           Showmessage('Номер порта должен лежать в диапазоне 1025-65535');
           Exit;
         end;
       Addr.sin_port:= HToNS(server_port);
       Addr.sin_addr.S_addr:= InAddr_Any;
       FillChar(Addr.Sin_Zero,SizeOf(Addr.Sin_Zero),0);
       if bind(Sockets[0], Addr, SizeOf(TSockAddr)) = SOCKET_ERROR then
         begin
           showmessage('Невозможно привязать слушающий сокет к адресу' );
           Exit;
         end;
       if listen(Sockets[0], SOMAXCONN) = SOCKET_ERROR then
         begin
           showmessage('Невозможно установить сокет в режим прослушивания');
           Exit;
         end;
     end;
  tmr1.Enabled:= True;
end;
 
end.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
27.12.2012, 22:59 10
Цитата Сообщение от serejka6666 Посмотреть сообщение
о каком исключении?
Ты у меня это спрашиваешь ?!
Это ты должен подробно и вменяемо описать что значит ".exe с ошибкой и не хочет")

Цитата Сообщение от serejka6666 Посмотреть сообщение
то, из чего переделывал
Это следовало сразу в топку отправить, а не переделывать.
0
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 43
27.12.2012, 23:02  [ТС] 11
Цитата Сообщение от mss Посмотреть сообщение
Ты у меня это спрашиваешь ?!
Это ты должен подробно и вменяемо описать что значит ".exe с ошибкой и не хочет")


Это следовало сразу в топку отправить, а не переделывать.
он просто не запускается и все. а смысл? это рабочее. а то, что я из этого сделал не работает =\ из исходника было убрано вычисление времени на поправку. добавлен цикл (строки 98-103):
Delphi
1
2
3
4
5
          while I<=High(Sockets) do
            begin
              send(Sockets[I], str[1], Length(buf1), 0);
              Inc(i);
            end;
который предположительно рассылает всем сокетам сообщение которое содержится в переменной типа string str
в целом все.
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
27.12.2012, 23:12 12
Цитата Сообщение от serejka6666 Посмотреть сообщение
он просто не запускается и все
Поставь брейкпойнт на самую первую строчку
Код
begin
в dpr-тексте, запусти программу на выполнение под управлением встроенного отладчика и убедись что твое утверждение не соответсвует действительности.
0
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 43
27.12.2012, 23:13  [ТС] 13
серв - то,что не работает
сервер - исходник. работает. проверялся на 2х компьюетарах) все корректно передает.
Вложения
Тип файла: 7z серв.7z (283.8 Кб, 1 просмотров)
Тип файла: rar Сервер.rar (363.3 Кб, 1 просмотров)
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
27.12.2012, 23:16 14
Цитата Сообщение от serejka6666 Посмотреть сообщение
сообщение которое содержится в переменной типа string str
Так а какого же тогда
Цитата Сообщение от serejka6666 Посмотреть сообщение
Length(buf1)
?!

Добавлено через 2 минуты
Цитата Сообщение от serejka6666 Посмотреть сообщение
все корректно передает
Разнеси клиента и сервера по разным углам Интернета и убедись что это вообще не работает.
1
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 43
27.12.2012, 23:23  [ТС] 15
Цитата Сообщение от mss Посмотреть сообщение
Так а какого же тогда


?!

Добавлено через 2 минуты


Разнеси клиента и сервера по разным углам Интернета и убедись что это вообще не работает.
тут же только сервер. проверяли на разных компах в пределах комп класса. запускали сервер потом клиента подключали и выполняли запрос. все скидывало...
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
27.12.2012, 23:34 16
Ты мне что хочешь доказать-то ?
Учишься-то ты, а не я. Это тебя должен волновать вопрос, почему этот код не будет работать в условиях Интернет.
0
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 43
27.12.2012, 23:37  [ТС] 17
Цитата Сообщение от mss Посмотреть сообщение
Ты мне что хочешь доказать-то ?
Учишься-то ты, а не я. Это тебя должен волновать вопрос, почему этот код не будет работать в условиях Интернет.
нужно чтобы он работал в условиях сети (комп класса). да не учу я никого)) я же говорю второй раз пишу программу в жизни)) ты же кот ученый. объяснииии пожалуйста... или же скажи в какую сторону смотреть
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
27.12.2012, 23:46 18
Цитата Сообщение от serejka6666 Посмотреть сообщение
скажи в какую сторону смотреть
Мой вопрос в #14 ты проигнорировал.
Какой смысл тебе что-то говорить, если ты даже не вникаешь ?
0
0 / 0 / 0
Регистрация: 11.12.2012
Сообщений: 43
28.12.2012, 00:16  [ТС] 19
Цитата Сообщение от mss Посмотреть сообщение
Мой вопрос в #14 ты проигнорировал.
Какой смысл тебе что-то говорить, если ты даже не вникаешь ?
да-да там ошибка. я исправил) вместо buf там будет str
0
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
28.12.2012, 09:25 20
Теперь делай #12
0
28.12.2012, 09:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.12.2012, 09:25
Помогаю со студенческими работами здесь

Не хочет работать ...
1. Установил ПХП. 2. Проверяю домен ruseller.loc Выскакивает При открытии файла выдает сам код...

Не хочет работать AND
Приветствую) Есть код: $query_last5 = &quot;SELECT * FROM mail WHERE (to_id = 1 AND read = 0) ORDER BY...

Не хочет работать QT
Недавно начал изучать С++ и поставил QT creator 4.3.1(Community). Сначало было все норм, писал...

Не хочет работать
#include&lt;time.h&gt; #include&lt;stdlib.h&gt; using namespace std; int main() { setlocale(0, &quot;&quot;); int...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru