Доброго времени!
Поставил цель побороться с WinSock. Но столкнулся с проблемой с потоками. Не получается в поток передать параметры. Подскажите что не так. Может из-за того что класс и память получается разная?
Это лишь кусочек кода.
Код:
unit socket_u;
interface
uses windows,winsock,messages;
type TParamThread=record
hServSocket:integer;
end;
PParamThread=^TParamThread;
type TServerSock=class
private
wsData : WSADATA;
SocketAdrr : sockaddr_in;
ServType : TServType;
function CreateSocket:integer; //шаг 2 создание сокета
function SetServSocket:integer; // шаг 3 настройка сокета
function SyncServ:integer;
function SockConnect: integer; //соединение
function SockAccept(accept_cocket:TSocket; addr: PSOCKADDR; addrlen: PInteger ): TSocket;
public
ServSocket : integer;
errCreate : boolean;
constructor create; //шаг 1 инициализация сокета
destructor destroy;
function ServerConnect:boolean;
function GetNameHost:String;
function GetIPAdress(name:PAnsiChar):string;
procedure NetMsg(var M:TMessage); message WM_MESS;
function ServerRecv(accept_cocket:TSocket; buf:PAnsiChar;len,flags:integer):integer; // recv получение данных
function ServerSend(accept_cocket:TSocket; buf:PAnsiChar;len,flags:integer):integer; // send отправка данных
procedure ServerCreateThread;
function SockWait(s:pointer):DWORD;
end;
var vServType:TServType;
vClientType:TClientType;
Param:PParamThread;
implementation
procedure TServerSock.ServerCreateThread;
var //thread:array[1..100] of cardinal;
hThread:THandle;
ThreadID:DWORD;
p:pointer;
begin
hThread:=BeginThread(nil, 0, Addr(TServerSock.SockWait), param, 0, threadID);
end;
function TServerSock.SockWait(s:pointer):DWORD;
var csocket:TSocket;
cs:integer;
buf:array[1..100]of pansichar;
i:integer;
p:TParamThread;
begin
p:=PParamThread(s)^;
Finalize(PParamThread(S)^);
// FreeMem(S);
while True do
begin
sleep(1);
//csocket:=SockAccept(ServSocket,Pointer(@SocketAdrr),Pointer(@SocketAdrr));
i:=sizeof(SocketAdrr);
csocket:=accept(Result,Pointer(@SocketAdrr),pointer(i));
if csocket<>-1 then
begin
serverrecv(csocket,buf[1],sizeof(buf),0);
messagebox(0,PWideChar(buf[1]),PCHAR('Recv'),mb_ok);
end;
if csocket<> INVALID_SOCKET then
begin
closesocket(csocket); // закрываем сокет
end;
end;
end;
Т.е. hThread:=BeginThread(nil, 0, Addr(TServerSock.SockWait), param, 0, threadID); Тут param получает значение номер сокета, а в функции function TServerSock.SockWait(s
ointer)
WORD;
s получается пустой. точнее какой то мусор наверное. тут p:=PParamThread(s)^; очень большое значение.
Что не так, уже сутки думаю....
Спасибо