通过Winsock发送字符串失败

问题描述 投票:0回答:1

我想将一些文本从客户端发送到服务器,但是接收器只是挂起,什么也没有通过。

客户

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

winsock lazarus
1个回答
0
投票

问题很棘手。我建议跟踪传输的字节码。然后您可以实现绕过包装器

© www.soinside.com 2019 - 2024. All rights reserved.