Не удается отправить строку через Winsock - PullRequest
0 голосов
/ 22 июня 2019

Я хочу отправить текст с Клиента на сервер, но получатель просто зависает и ничего не происходит.

Клиент

program client;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes , SysUtils, Windows, Winsock
  { you can add units after this };

procedure GetInformation();
var
  _wsdata: WSAData;
  result:Integer;
  serverSocket, S: TSocket;
  _addrIn, _addr: sockaddr_in;
  addrSize: Integer;
  tid: Cardinal;
  SendBuf:Array[0..31] of AnsiChar;
  data : Integer;
begin
  //result := false;
  if WSAStartup(MakeWord(2, 2), _wsdata) <> 0 then
    Exit;
  serverSocket := socket(AF_INET, SOCK_STREAM, 0);
  if serverSocket = INVALID_SOCKET then
    Exit;
  _addrIn.sin_family := AF_INET;
  _addrIn.sin_addr.S_addr := INADDR_ANY;
  _addrIn.sin_port := htons(8080);

  if bind(serverSocket, _addrIn, SizeOf(_addrIn)) = SOCKET_ERROR then
    Exit;

  if listen(serverSocket, SOMAXCONN) = SOCKET_ERROR then
    Exit;

  addrSize := SizeOf(_addrIn);
  getsockname(serverSocket, _addrIn, addrSize);

  Writeln(Format('Listening on port %d' + #13#10, [ntohs(_addrIn.sin_port)]));

  while True do
  begin
    S := accept(serverSocket, @_addr, @addrSize);
    data := recv(s,SendBuf,Length(SendBuf),0);
    Writeln('Data Received: ',data);
  end;

  // result := True;
end;

begin
  GetInformation();
  ReadLn;
end.

Теперь отправитель, который должен отправлять данные, работает нормально, это просто получатель. Похоже, это

Сервер

program server;

{$mode delphi}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes , Windows , Winsock , SysUtils
  { you can add units after this };

procedure SendFullnameTest();
var
  MyData:WSADATA;
  result:Integer;
  s:TSocket;
  SendBuf:Array[0..31] of AnsiChar;
  clientservice:sockaddr_in;
  BytesSent:Integer;
begin
  try
    result:= WSAStartup(MAKEWORD (2,2), MyData);
    if result = NO_ERROR then
    begin
      s := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
      if s <> INVALID_SOCKET then
      begin
        clientservice.sin_family := AF_INET;
        clientservice.sin_addr.s_addr := inet_addr('127.0.0.1');
        clientservice.sin_port := htons(8080);
        if connect(s,clientservice,sizeof(clientservice)) <> SOCKET_ERROR then
        begin
          sendbuf := 'I am a Sent message';
          bytesSent := send(s,sendbuf,Length(sendbuf),0);
          writeln('Bytes send: ',bytesSent);
        end else
          writeln('Failed to connect');;
      end else
        writeln('Error at Socket: ',WSAGetLastError);;
    end else
      writeln('Error at WSAStartup');
  finally
    Writeln(SysErrorMessage(GetLastError));
    WSACleanUp;
    Readln;
  end;
end;

begin
  SendFullnameTest();
  ReadLn;
end.

Раздражает то, что он просто не показывает, отправляет ли он, и не показывает, получил ли он.

Я просто получаю это как конечную точку

FinalImage

...