私は、毎回 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 チュートリアルを送ってくれますか? (スプーンで食べる必要はありません)。