1

私は、毎回 mediafire にアップロードする必要なく、友人と私がファイルを共有するための単純な winsock ファイル転送に取り組んできました。ファイルを破損せずに送信しないでください。現在、送受信のための私のソリューションは次のとおりです。

procedure SenBuf(var buf;count:dword);
var
  a, c: pointer;
  cousend, tmp, left: dword;
begin
  a := @buf;
  cousend := 0;
  left := count;
  repeat
    c := ptr(dword(a) + cousend);
    tmp := Send(hSocket, c^, left, 0);
    inc(cousend, tmp);
    dec(left, tmp);
  until cousend = count;
end;

procedure RecvBuf(var buf;count:dword);
var
  a, c: pointer;
  cousend, tmp, left: dword;
begin
  a := @buf;
  cousend := 0;
  left := count;
  repeat
    c := ptr(dword(a) + cousend);
    tmp := Recv(hSocket, c^, left, 0);
    inc(cousend, tmp);
    dec(left, tmp);
  until cousend = count;
end; 

しかし、私は tcp 接続を使用していますが、送受信されるバイトを確認して再送信する必要があるのはなぜですか? (ローカルホストで完全に機能するため、理由はパケットのドロップであることはわかっています)。

接続をリッスンする方法:

 hServer := Socket(AF_INET,SOCK_STREAM,6);
 sAddr.sin_family      := AF_INET;
 sAddr.sin_port        := htons(wPort);
 sAddr.sin_addr.S_addr := INADDR_ANY;
 Bind(hServer, sAddr, SizeOf(sAddr));
 winsock.Listen(hServer,3);
 while not(Self.Terminated) do begin
   iSize:=SizeOf(cAddr);
   hClient:=Accept(hServer,@cAddr,@iSize);
   if (hClient <> INVALID_SOCKET) then begin
     sleep(50);
     Client := TClient.Create(True);
     Clients.Add(Client);
     with Client do begin
       hHost := inet_ntoa(cAddr.sin_addr);
       Resume();
     end;
 /// incomplete code?

サーバー - クライアント:

    procedure TClient.Execute;
    var
      mode: integer;
      bytBuf: Array[0..255] of Char;
      iRecv: Integer;
    begin
      inherited;
      mode := 0;
      ZeroMemory(@bytbuf, 256);
      ioctlsocket(hSocket, FionBio, mode);
      repeat
        iRecv := Recv(hSocket, bytBuf, 256, 0);
        if (iRecv <= 0) and (iRecv <> EWOULDBLOCK) then 
          break;
        if not(bytbuf[0]=#0) then
          Process(bytBuf);
        ZeroMemory(@bytbuf,256);
      until 1=2;

クライアント - クライアント:

procedure Start;
var
  mode: integer;
begin
  repeat
    mode := 0;//blocking mode.
    hSocket := Socket(AF_INET, SOCK_STREAM, 6);
    ioctlsocket(hSocket, FionBio, mode);
    Addr.sin_family := AF_INET;
    Addr.sin_port := htons(hport);
    Addr.sin_addr.S_addr := INET_ADDR(pchar(GetIPFromHost(cHost)));
    if (winsock.Connect(hSocket,Addr, SizeOf(Addr)) = 0) then begin
      SenStr('+');
      WaitForServAndProcess;
    end;
  Sleep(20000);
  lping:=GetTickCount;
  until 1 = 2;
end;

誰かが親切に私の間違いを教えてくれますか?それとも本当に素晴らしい winsock チュートリアルを送ってくれますか? (スプーンで食べる必要はありません)。

4

1 に答える 1