![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Доброго времени суток!
Спасибо за помощь если таковая будет ![]() Есть программа с реализованной системой передачей данных через сокеты написаная на 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
|
||||
|
||||
|
Скорее всего проблема в кодировке
|
|
#3
|
|||
|
|||
|
А пакеты кодируются при прохождение днс серваков ? Или вы говорите о различных кодировках установленных на серваке и клиенте ? Но ведь числовые данные почти во всех кодировках воспринимаются верно, а там и с ними проблема.
|
|
#4
|
||||
|
||||
|
Цитата:
ДНС сервер нужен для преобразование имен в ип адреса и наобаот Ты запрашиваешь допустим 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
|
|||
|
|||
|
Проблема не в кодировке, а в чем то другом. Я думаю что проблема из-за задержек при пересылке данных. Чего то я не знаю всетаки.
При попытке работы через интернет с человеком из другой сети, ошибки сразу при начале работы, а вот я попробовал на компах из 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 Код:
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 Код:
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 Последний раз редактировалось Therg, 15.05.2008 в 18:56. |