![]() |
|
|
Регистрация | << Правила форума >> | 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------------------------------------- При конекте клиент посылает серверу сообщение с ником, в ответ сервер присылает сообщение с выданым номером клиенту. Ну а потом начинается различный обмен данными из которых пока используется только текстовые сообщения. |