Никогда не работал с ними на уровне ниже ИНДИ, поэтому сходу столкнулся с препятствием. При получении данных из сокета выходит ошибка Socket is not connected на функции fprecv в серверной части.
Вот как выглядит ядро сервера:
- Код: Выделить всё
var RecieveSocket:integer; RemoteIP:TInetSockAddr;Mem:Pointer;
_in,_out:File of byte; sizeBuf,SHLen:integer; _inText,_outText:text;s:ansistring;
begin
Error:='';
ServHandle.sin_addr.s_addr:=INADDR_ANY;
ServHandle.sin_family:=AF_INET;
ServHandle.sin_port:=htons(Port);
SocketHandle:=fpsocket(AF_INET,SOCK_STREAM,0);
if SocketHandle=-1 then begin Error:='fpsocket: Ошибка создания сокета'+' '+SysErrorMessageUTF8(GetLastOSError);
if Assigned(OnError) then OnError(Self); exit;end;
if fpbind(SocketHandle,@ServHandle,sizeof(ServHandle))=-1 then begin Error:='fpbind: Ошибка связывания сокета'+' '+SysErrorMessageUTF8(GetLastOSError);
if Assigned(OnError) then OnError(Self); exit; end;
if fplisten(SocketHandle,1)=-1 then begin Error:='fplisten: Ошибка прослушивания порта'+' '+SysErrorMessageUTF8(GetLastOSError);
if Assigned(OnError) then OnError(Self); exit;end;
StopFlag:=false;
Stream:=TMemoryStream.Create;
Stream.SetSize(255);
SHLen:=SizeOf(ServHandle);
while not StopFlag do begin
if fpaccept(SocketHandle,@ServHandle,@SHLen)<>-1 then begin
if fprecv(SocketHandle,@s[1],5,0)<>-1 then begin
if Assigned(OnRecieve) then OnRecieve(self);
end else begin
Error:='Server fprecv: '+IntToStr(socketerror)+' '+SysErrorMessageUTF8(GetLastOSError);
if Assigned(OnError) then OnError(self);
end;
end else begin
Error:='Server fpaccept: '+SysErrorMessageUTF8(GetLastOSError);
if Assigned(OnError) then OnError(self);
end;
end;
Stream.Clear;Stream.Free;Stream:=nil;
fpshutdown(SocketHandle,0);
CloseSocket(SocketHandle);
end;
fpaccept отрабатывает хорошо если с клиента передаю данные, но дальше fprecv(SocketHandle,@s[1],5,0) дает ошибку.
Вот код клиента:
- Код: Выделить всё
ServHandle.sin_addr.s_addr:=HostToNet((127 shl 24) or 1);
ServHandle.port:=htons(Port);
ServHandle.sin_family:=AF_INET;
SocketHandle:=fpsocket(AF_INET,SOCK_STREAM,0);
if SocketHandle<0 then begin Error:='client fpsocket: Ошибка создания сокета'+' '+SysErrorMessageUTF8(GetLastOSError);
if Assigned(OnError) then OnError(self); exit;end;
...
if fpconnect(SocketHandle,@ServHandle,sizeof(ServHandle))=-1 then begin
Error:='client fpConnect: Ошибка коннекта'+' '+SysErrorMessageUTF8(GetLastOSError); if Assigned(OnError) then OnError(self); exit; end;
if fpsend(SocketHandle,Memory,Size,0)=-1 then begin
Error:='client fpSend: Ошибка передачи данных'+' '+SysErrorMessageUTF8(GetLastOSError); if Assigned(OnError) then OnError(self); end;
Что я не учитываю?
P.S. FPC 2.6.0