Есть клиент:
| Код | program ProjectClient;
uses SysUtils,WinSock,Windows;
var D:WSAData; S:TSocket; A:TSockAddr; send_bytes:Integer; str: PChar;
begin if WSAStartup(MakeWord(2,2),D)<>0 then begin writeln('error..'); exit; end; s := socket(AF_INET,SOCK_STREAM,0); if (s = 0) then begin WSACleanup(); exit; end;
A.sin_family := AF_INET; A.sin_port := htons(3333); A.sin_addr.s_addr := inet_addr('127.0.0.1');
if(connect(s,A,sizeof(A)) <> SOCKET_ERROR) then begin Str := 'Hello'; send_bytes:= send(s,Str,Length(Str),0); end;
closesocket(s); WSACleanup;
end.
|
посылающий серверу строчку "Hello"... в send_bytes всегда 5, т.е. нормально... есть сервер:
| Код | program ProjectServer;
uses SysUtils,WinSock,Windows;
var D:WSAData; S,SClient:TSocket; A,ClientAddr:TSockAddr; client_addr_size:Integer; thID: DWord;
procedure WorkWithClient(client_socket: array of Pointer); stdcall; var socket: TSocket; bytes_recv: integer; buff: array [0..50] of char; Str: String; begin socket:= TSocket(client_socket[0]); bytes_recv := 0; FillChar(buff,sizeof(buff),#0); while (bytes_recv <> SOCKET_ERROR) do begin bytes_recv := recv(socket,buff,sizeof(buff),0); //в buff всегда белиберда получается if (bytes_recv > 0) then begin Str := String(buff); writeln(Str); end; end; closesocket(socket); end;
begin if WSAStartup(MakeWord(2,2),D)<>0 then begin writeln('error..'); exit; end; s := socket(AF_INET,SOCK_STREAM,0); if (s = 0) then begin WSACleanup(); exit; end;
A.sin_family := AF_INET; A.sin_port := htons(3333); A.sin_addr.s_addr := htonl(INADDR_ANY);
if (bind(s,a,sizeof(a)) <> 0) then begin closesocket(s); // закрываем сокет! WSACleanup(); exit; end;
if (listen(s, $100) <> 0) then begin closesocket(s); WSACleanup(); exit end;
client_addr_size := sizeof(ClientAddr);
while(true) do begin SClient := accept(s, @ClientAddr, @client_addr_size); CreateThread(nil,0,@WorkWithClient,@SClient,0,thID); Sleep(500); end;
end.
|
вот, в переменной buff всегда получается ерунда, мусор какой то... а надо бы "Hello" чтобы принялось... пробывал следующие варианты, кроме описанного выше:
| Код | buff: PChar; bytes_recv := recv(socket,buff,sizeof(buff),0);
|
| Код | buff: ^PChar; bytes_recv := recv(socket,buff,sizeof(buff),0);
|
| Код | buff: array of Char; setlength(buff,10); bytes_recv := recv(socket,buff,sizeof(buff),0);
|
во всех случаях ерунда получается в буфере, что я не так делаю? |