Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2011, 22:54   #1
virtuhay266
Пользователь
 
Регистрация: 28.05.2009
Сообщений: 57
По умолчанию передача сообщений через serversocket и clientsocket

Всем привет!
Такая задача: клиент отправляет кое какую системную инфу, сервер пересылает ее всем остальным клиентам.
Программа вызывает функцию GetIPAddress, которая определяет локальный IP. Прикол в том, что при работе под дебаггером все работает хорошо - сообщения отправляются быстро и IP всегда определяется. Если просто запустить exe'шник клиента, то первое сообщение отправляется нормально, а последующие отправляются долго и IP определяется ИНОГДА. Похоже функция GetComputerName работает через раз. Из-за чего она может не срабатывать? Я в недоумении.
Заранее спасибо.
P.S. Прикрепляю архив с проектами.
Вложения
Тип файла: rar 11111.rar (650.1 Кб, 9 просмотров)
virtuhay266 вне форума Ответить с цитированием
Старый 14.12.2011, 22:54   #2
virtuhay266
Пользователь
 
Регистрация: 28.05.2009
Сообщений: 57
По умолчанию

Собсна
Сервер:
Код:
unit Unit1; 
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ScktComp; 
type
  TVer = record
    St:byte;
    Ml:byte;
  end;
  TSnd = record
    IP:string[15];
    DT:tdatetime;
    CurTime:longint;
    Ver:TVer;
  end;
  TForm1 = class(TForm)
    ServerSocket1: TServerSocket;
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Edit1: TEdit;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure ServerSocket1ClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end; 
var
  Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
  ServerSocket1.Port:= strtoint(edit1.Text);
  ServerSocket1.Active:= True;
  button1.Enabled:=false;
  button2.Enabled:=true;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
  ServerSocket1.Active := False;
  ServerSocket1.Close;
  button1.Enabled:=true;
  button2.Enabled:=false;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ServerSocket1.Active := False;
  ServerSocket1.Close;
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  i:integer;
  b:tbytes;
  sn:tsnd;
  p:^tsnd;
begin
  p:=addr(sn);
  Socket.ReceiveBuf(p^,SizeOf(tsnd));
  p:=addr(sn);
  memo1.Lines.Add('Хэндл сокета отправителя: '+InTtoStr(Socket.SocketHandle));
  memo1.Lines.Add('IP адрес: '+sn.IP);
  memo1.Lines.Add('Дата и время отправления: '+timetostr(sn.DT)+'; '+datetostr(sn.DT));
  memo1.Lines.Add('Время с последней перезагрузки машины(мс): '+inttostr(sn.CurTime));
  memo1.Lines.Add('Версия ядра: '+inttostr(sn.Ver.St)+'.'+inttostr(sn.Ver.Ml));
  For i := 0 to ServerSocket1.Socket.ActiveConnections - 1 do
     if ServerSocket1.Socket.Connections[i].SocketHandle <> Socket.SocketHandle
     then ServerSocket1.Socket.Connections[i].Sendbuf(p^,SizeOf(tsnd));
end;
end.
Клиент:
Код:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ScktComp, StdCtrls, winsock;
type
  TVer = record
    St:byte;
    Ml:byte;
  end;
  TSnd = record
    IP:string[15];
    DT:tdatetime;
    CurTime:longint;
    Ver:TVer;
  end;
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    ClientSocket1: TClientSocket;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
  private
    { Private declarations }
  public
    { Public declarations }
  end; 
var
  Form1: TForm1;
implementation
{$R *.dfm}
function GetIPAddress: ansistring;
const WSVer = $101;
var
  wsaData: TWSAData;
  P: PHostEnt;
  name:array[0..30] of widechar;
  i:cardinal;
  s:ansistring;
  q:pansichar;
begin
  GetComputerName(@name,i);
  setlength(s,i+1);
  Result := '';
  s:=WideCharToString(@name);
  q:=addr(s[1]);
  if WSAStartup(WSVer, wsaData) = 0 then begin
   begin
      P := GetHostByName(q);
      if P <> nil then Result := iNet_ntoa(PInAddr(p^.h_addr_list^)^);
    end;
    WSACleanup;
  end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  ClientSocket1.Address := Edit1.Text;
  ClientSocket1.Port := StrToInt(Edit2.text);
  if not ClientSocket1.Active
    then ClientSocket1.Active := True;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
  sn:TSnd;
  p:^tsnd;
begin
  sn.IP:=GetIPAddress;
  sn.DT:=now;
  sn.CurTime:=getcurrenttime;
  word((@sn.Ver.St)^):=GetVersion;
  p:=addr(sn);
  ClientSocket1.Socket.Sendbuf(p^,SizeOf(tsnd));
end;
procedure TForm1.ClientSocket1Read(Sender: TObject; Socket: TCustomWinSocket);
var
  sn:tsnd;
  p:pointer;
begin
  p:=addr(sn);
  ClientSocket1.Socket.ReceiveBuf(p^,SizeOf(tsnd));
  memo1.Lines.Add('IP адрес: '+sn.IP);
  memo1.Lines.Add('Дата и время отправления: '+timetostr(sn.DT)+'; '+datetostr(sn.DT));
  memo1.Lines.Add('Время с последней перезагрузки машины(мс): '+inttostr(sn.CurTime));
  memo1.Lines.Add('Версия ядра: '+inttostr(sn.Ver.St)+'.'+inttostr(sn.Ver.Ml));
end;
end.
virtuhay266 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ServerSocket и ClientSocket передача буфера Тутонхамон Работа с сетью в Delphi 5 15.04.2011 13:34
Передача данных StringGrid через ServerSocket - ClientSocket Polotenchik Общие вопросы Delphi 4 18.03.2010 01:42
Реализация бана через ServerSocket и ClientSocket Sensizu Общие вопросы Delphi 0 04.01.2010 13:42
[TcpClient, TcpServer] или [ServerSocket, ClientSocket] работа через прокси DOLBY Работа с сетью в Delphi 2 17.09.2009 05:46
ClientSocket,ServerSocket передача данных Torvald Работа с сетью в Delphi 3 07.09.2009 03:59