Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.05.2008, 22:39
Therg Therg вне форума
Прохожий
 
Регистрация: 14.05.2008
Сообщения: 3
Репутация: 10
По умолчанию Передача данных через TServerSocket

Доброго времени суток!
Спасибо за помощь если таковая будет
Есть программа с реализованной системой передачей данных через сокеты написаная на Delphi 7, используется передача буфером без блокирования. Программа отлично работает на localhost с различным количеством подключений, но при попытке работы через интернет(сервер с внешним ip) данные пересылаемые между сервером и клиентами искажаются и приходит не то, что посылалось.
Вопрос:
Из-за чего это может происходить и как это можно лечить.
http://blade.comtv.ru/WormWar.rar
Исходник написан полностью на ооп разобраться в нем не сложно, но думаю всеравно это делать никто не будет так что привожу фрагменты программы
Код:
procedure TForm1.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
var
  ClientMsg: TClientMsg;
  Data: TData;
  St: String;
begin
 // while Socket.ReceiveLength <> 0 do
  //begin
    if Client.AcceptMessage(Socket,ClientMsg,Data) then
      exit;
    case ClientMsg.MessageType of
      SetNumber:
      begin
        St := DataToStr(Data);
        Client.Number := StrToInt(St);
        Options.Close;
      end;
      MsgText:
      begin
        St := DataToStr(Data);
        Form1.Memo1.Lines.Add(St);
      end;
    end;
  //end;
end;

procedure TForm1.ServerSocketClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var
  ServerMsg: TServerMsg;
  ServerSocket: TServerWinSocket;
  Data: TData;
  St: String;
  Tmp: Integer;
begin
//  while Socket.ReceiveLength <> 0 do
//  begin
    ServerSocket := Form1.ServerSocket.Socket;
    Server.AcceptMessage(Socket,ServerMsg,Data);
    case ServerMsg.MessageType of
      Connect:
      begin
        St := DataToStr(Data);
        Form1.Memo1.Lines.Add(St+' has Connected ');
        Server.Users.OnConnect(St);
        Tmp := Length(Server.Users.Name)-1;
        Server.SendMessage(ServerSocket,SetNumber,IntToStr(Tmp),Tmp-1);
        Server.SendMessage(ServerSocket,MsgText,'[SERVER]: Welcom!',Tmp-1);
      end;
      MsgText:
      begin
        St := Server.Users.Name[ServerMsg.Number] + ': ' + DataToStr(Data);
        Server.SendMessage(ServerSocket,MsgText,St,-1);
        Form1.Memo1.Lines.Add(St);
      end;
      Leave:
      begin
  //     for I := length(Users) - 2 downto ServerBuf.Number do
  //       Users[i] := Users[I+1];
  //     SetLength(Users,Length(Users)-1);
  //     ServerSendMessage(Form1.ServerSocket.Socket,Users[ServerBuf.Number]+' has left the game');
      end;
    end;
 // end;
end;

//-------------------------TClient.SendMessage----------------------------------
procedure TClient.SendMessage(Socket:TCustomWinSocket;Msg: TMessageType;Data: String);
var
  ServerMsg: TServerMsg;
  Buf: TBuf;
begin
  StrToBuf(Data,Buf);

  ServerMsg.MessageType := Msg;
  ServerMsg.Number := Number;
  ServerMsg.Size := Length(Data);

  Socket.SendBuf(ServerMsg,SizeOf(ServerMsg));
  Socket.SendBuf(Buf,Length(Data));
end;
//-------------------------TClient.SendMessage----------------------------------
//-------------------------TClient.AcceptMessage--------------------------------
function TClient.AcceptMessage(var Socket: TCustomWinSocket;
                                var ClientMsg: TClientMsg;var Data: TData): Boolean;
var
  Size,I: Integer;
  StaticBuf: TBuf;
begin
  Result := false;
  Socket.ReceiveBuf(ClientMsg,SizeOf(ClientMsg));
  Size := ClientMsg.Size;
  if Size > 100 then
  begin
    Result := true;
    MessageDlg('Wrong Package receaved from host Data! Terminate data receave!',
                  mtError,[mbOk],0);
    exit;
  end;
  if Size <> 0 then
    Socket.ReceiveBuf(StaticBuf,Size);
  SetLength(Data,Size);
  for I := 0 to Size - 1 do
    Data[i] := StaticBuf[i]
end;
//-------------------------TClient.AcceptMessage--------------------------------

//-------------------------TServer.SendMessage----------------------------------
procedure TServer.SendMessage(Socket:TServerWinSocket;Msg: TMessageType;Data: String;UserNumber: Integer);
var
  ClientMsg: TClientMsg;
  I: Integer;
  Buf : TBuf;
begin
  ClientMsg.MessageType := Msg;
  ClientMsg.Size := Length(Data);

  StrToBuf(Data,Buf);

  if UserNumber = -1 then            // To All Users
    for I := 0 to Socket.ActiveConnections - 1 do
    begin
      Socket.Connections[i].SendBuf(ClientMsg,SizeOf(ClientMsg));
      Socket.Connections[i].SendBuf(Buf,ClientMsg.Size);
    end
  else
  begin
    Socket.Connections[UserNumber].SendBuf(ClientMsg,SizeOf(ClientMsg));
    Socket.Connections[UserNumber].SendBuf(Buf,ClientMsg.Size);
  end;
end;
//-------------------------TServer.SendMessage----------------------------------
//-------------------------TServer.AcceptMessage--------------------------------
procedure TServer.AcceptMessage(var Socket: TCustomWinSocket;
                                var ServerMsg: TServerMsg;var Data: TData);
var
  Size,I: Integer;
  StaticBuf: TBuf;
begin
  Socket.ReceiveBuf(ServerMsg,SizeOf(ServerMsg));
  Size := ServerMsg.Size;
  if Size > 100 then
  begin
    MessageDlg('Wrong Package receaved from Client Data! Terminate data receave!',
                  mtError,[mbOk],0);
    exit;
  end;
  if Size <> 0 then
    Socket.ReceiveBuf(StaticBuf,Size);
  SetLength(Data,Size);
  for I := 0 to Size - 1 do
    Data[i] := StaticBuf[i];
end;
//-------------------------TServer.AcceptMessage--------------------------------
//-------------------------TUsers.OnConnect-------------------------------------
procedure TUsers.OnConnect(PlayerName: String);
var
  Len: Integer;
begin
  Len := Length(Name);
  SetLength(Name,Len + 1);
  Name[Len] := PlayerName;
end;
//-------------------------TUsers.OnConnect-------------------------------------
Ну еще следует упомянуть структуру обменна данных:
При конекте клиент посылает серверу сообщение с ником, в ответ сервер присылает сообщение с выданым номером клиенту. Ну а потом начинается различный обмен данными из которых пока используется только текстовые сообщения.
Ответить с цитированием
  #2  
Старый 15.05.2008, 08:17
Аватар для PESTS
PESTS PESTS вне форума
Новичок
 
Регистрация: 04.05.2008
Сообщения: 54
Репутация: 11
По умолчанию

Скорее всего проблема в кодировке
Ответить с цитированием
  #3  
Старый 15.05.2008, 09:24
Therg Therg вне форума
Прохожий
 
Регистрация: 14.05.2008
Сообщения: 3
Репутация: 10
По умолчанию

А пакеты кодируются при прохождение днс серваков ? Или вы говорите о различных кодировках установленных на серваке и клиенте ? Но ведь числовые данные почти во всех кодировках воспринимаются верно, а там и с ними проблема.
Ответить с цитированием
  #4  
Старый 15.05.2008, 09:58
Аватар для PESTS
PESTS PESTS вне форума
Новичок
 
Регистрация: 04.05.2008
Сообщения: 54
Репутация: 11
По умолчанию

Цитата:
А пакеты кодируются при прохождение днс серваков ?
)
ДНС сервер нужен для преобразование имен в ип адреса и наобаот
Ты запрашиваешь допустим www.ya.ru и ДНС сервак тебе возрощает 213.180.204.8
там у них типо таблица
ya.ru - 213.180.204.8
google.com - 189.56.34.19
mail.ru - 231.230.67.9
--------------
Цитата:
серваке и клиенте
может быть,хотя......
--------------
Цитата:
Но ведь числовые данные почти во всех кодировках воспринимаются верно,
Приведи пример!(напиши суда что отправил и что получил
Ответить с цитированием
  #5  
Старый 15.05.2008, 18:38
Therg Therg вне форума
Прохожий
 
Регистрация: 14.05.2008
Сообщения: 3
Репутация: 10
По умолчанию

Проблема не в кодировке, а в чем то другом. Я думаю что проблема из-за задержек при пересылке данных. Чего то я не знаю всетаки.
При попытке работы через интернет с человеком из другой сети, ошибки сразу при начале работы, а вот я попробовал на компах из 1 локалки но с разными ип, уже лучше соединение устанавливается и от сервера к клиенту сообщения уже нормально доходят, но от клиента серверу приходит не то, что должно.
Я знаю, что в tcp/ip если пакет не дошел он посылается еще раз, может и тут мне приходят повторно части моих пакетов ?

Вот логи, которые мне удалось получить.
(Команды это перечислимый тип, когда приходит не определенное значение пишет Incorrect. После команды идет размер буфера, а потом сам буфер)
На localhost:
client
Код:
18:36:32: Client Started
18:36:32: Connecting...
18:36:32: Send Msg:
Connect
1
5
18:36:32: SendBuf:
66
108
97
100
101
18:36:32: Receave Message:
SetNumber
1
18:36:32: Receaved Buf:
49
18:36:32: Receave Message:
MsgText
17
18:36:32: Receaved Buf:
91
83
69
82
86
69
82
93
58
32
87
101
108
99
111
109
33
18:36:38: Receave Message:
MsgText
15
18:36:38: Receaved Buf:
91
72
111
115
116
93
84
104
101
114
103
58
97
115
100
18:36:47: Send Msg:
MsgText
1
5
18:36:47: SendBuf:
104
101
108
108
111
18:36:47: Receave Message:
MsgText
12
18:36:47: Receaved Buf:
66
108
97
100
101
58
32
104
101
108
108
111
server
Код:
18:36:26: Server Started
18:36:32: Receave Message from Client:
Connect
1
5
18:36:32: Receaved Buf:
66
108
97
100
101
18:36:32: Send Message:
SetNumber
1
18:36:32: SendBuf:
49
18:36:32: Send Message:
MsgText
17
18:36:32: SendBuf:
91
83
69
82
86
69
82
93
58
32
87
101
108
99
111
109
33
18:36:38: Send Message:
MsgText
15
18:36:38: SendBuf:
91
72
111
115
116
93
84
104
101
114
103
58
97
115
100
18:36:47: Receave Message from Client:
MsgText
1
5
18:36:47: Receaved Buf:
104
101
108
108
111
18:36:47: Send Message:
MsgText
12
18:36:47: SendBuf:
66
108
97
100
101
58
32
104
101
108
108
111

Тут можно видеть, что данные очень точно передаются.
Вот лог с двух компьютеров из одной локалки.
client
Код:
18:25:31: Client Started
18:25:31: Connecting...
18:25:31: Send Msg:
Connect
1
6
18:25:31: SendBuf:
80
108
97
121
101
114
18:25:31: Receave Message:
SetNumber
1
18:25:31: Receaved Buf:
49
18:25:32: Receave Message:
MsgText
17
18:25:32: Receaved Buf:
91
83
69
82
86
69
82
93
58
32
87
101
108
99
111
109
33
18:25:43: Send Msg:
MsgText
1
2
18:25:43: SendBuf:
229
237
18:25:43: Receave Message:
MsgText
10
18:25:43: Receaved Buf:
0
127
102
4
64
68
58
32
0
127
18:25:48: Send Msg:
MsgText
1
4
18:25:48: SendBuf:
115
100
102
103
18:25:48: Receave Message:
MsgText
12
18:25:48: Receaved Buf:
0
127
102
4
64
68
58
32
0
127
102
4
18:26:10: Receave Message:
MsgText
15
18:26:10: Receaved Buf:
91
72
111
115
116
93
84
104
101
114
103
58
103
104
106
18:26:53: Send Msg:
MsgText
1
4
18:26:53: SendBuf:
115
100
102
103
18:26:53: Receave Message:
MsgText
12
18:26:53: Receaved Buf:
0
127
102
4
64
68
58
32
0
127
102
4
server
Код:
18:23:07: Server Started
18:25:09: Receave Message from Client:
Connect
1
6
18:25:09: Receaved Buf:
0
127
102
4
64
68
18:25:09: Send Message:
SetNumber
1
18:25:09: SendBuf:
49
18:25:09: Send Message:
MsgText
17
18:25:09: SendBuf:
91
83
69
82
86
69
82
93
58
32
87
101
108
99
111
109
33
18:25:09: Receave Message from Client:
Incorect
29285
1244624
18:25:20: Receave Message from Client:
MsgText
1
2
18:25:20: Receaved Buf:
0
127
18:25:20: Send Message:
MsgText
10
18:25:20: SendBuf:
0
127
102
4
64
68
58
32
0
127
18:25:20: Receave Message from Client:
Incorect
1
2
18:25:20: Receaved Buf:
0
127
18:25:25: Receave Message from Client:
MsgText
1
4
18:25:25: Receaved Buf:
0
127
102
4
18:25:25: Send Message:
MsgText
12
18:25:25: SendBuf:
0
127
102
4
64
68
58
32
0
127
102
4
18:25:25: Receave Message from Client:
Incorect
1
4
18:25:25: Receaved Buf:
0
127
102
4
18:25:48: Send Message:
MsgText
15
18:25:48: SendBuf:
91
72
111
115
116
93
84
104
101
114
103
58
103
104
106
18:26:30: Receave Message from Client:
MsgText
1
4
18:26:30: Receaved Buf:
0
127
102
4
18:26:30: Send Message:
MsgText
12
18:26:30: SendBuf:
0
127
102
4
64
68
58
32
0
127
102
4
18:26:30: Receave Message from Client:
Incorect
1
1244624
По логам видно, что от сервака к клиенту все доходит идиально верно, а вот от клиента к серверу в корне не верно, не считая только начального пакета Connect

Последний раз редактировалось Therg, 15.05.2008 в 18:56.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:49.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025