Собсно сабж Внедряю длл в процесс. По циклу запускаю например 5 потоков и в каждую (нить) передаю парметры (номер порта)... И вижу странную активность: 1) законнект. и сразу "вылетает" 2) Меняю другой порт,конекчусь - сразу эррор и exitrpocess проги... От чего можт "так быть"??? (можт толко 1 порт может держать процесс %) зы: фаер выкл. код верный, (робота с потоками по примеру с мсдн)... Жду Ваших советов... Спасибо.
Ну хотя с одним потоком все отлично работает Код (Text): ... type TValues = record Port: word; end; PValues = ^TValues; ... procedure SockHandler; var cmd:string; begin while True do begin recv(Sock,Buf,1024,0); Cmd:=Copy(Buf,0,1); if Cmd = '1' then MessageBeep(0); end; end; procedure CreateSock(dwPort:word); var Sin : TSockAddrIn; begin WSAStartUP($0101, WSA); Close := False; Sock := socket(2,1,0); Sin.sin_addr.S_addr := inet_addr(PChar(IPCon)); Sin.sin_family := 2; Sin.sin_port := htons(dwPort); repeat If (Winsock.Connect(Sock, Sin, SizeOf(Sin)) = 0) Then Begin connect(Sock, Sin, SizeOf(Sin)); CreateThread(nil , 0, @SockHandler, nil, 0, TID); MessageBox(0,'connect!','info',0); End; Sleep(20000); until (Close); WSACleanUP(); end; function MyThreadFunc(lpParam:pointer):dword;stdcall; var pData:PValues; begin Result:=0; pData:=PValues(lpParam); CreateSock(pData.Port); end; procedure OEP(EntryPoint: dword); begin if EntryPoint <> ($1) then Exit; pDataArray[1]:=PValues(HeapAlloc(GetProcessHeap,0,sizeof(TValues))); pDataArray[2]:=PValues(HeapAlloc(GetProcessHeap,0,sizeof(TValues))); pDataArray[1].Port:=1678; pDataArray[2].Port:=1679; CreateThread(nil,0,@MyThreadFunc,pDataArray[1],0,dwThreadIdArray[1]); CreateThread(nil,0,@MyThreadFunc,pDataArray[2],0,dwThreadIdArray[2]); end; begin DLLProc := Addr(OEP); OEP($1); end.
Код (Text): If (Winsock.Connect(Sock, Sin, SizeOf(Sin)) = 0) Then Begin connect(Sock, Sin, SizeOf(Sin)); а зачем дважды коннектиться? Код (Text): procedure SockHandler; var cmd:string; begin while True do begin recv(Sock,Buf,1024,0); Cmd:=Copy(Buf,0,1); if Cmd = '1' then MessageBeep(0); end; end; ... CreateThread(nil , 0, @SockHandler, nil, 0, TID); насколько я понял - это функция ветви, но у нее должен быть 1 параметр и тип вызова stdcall и это должна быть функция, как и MyThreadFunc. Плюс. Где же для нее описан buf. Много потоков работают с одной глобальной переменной - это чревато! Это не принципмально, но версию WSA можно указать более старшую ($0202). Опять таки в функции CreateSock используются глобальные переменные... (Где описана WSA). Вроде все, хотя код я еще почитаю. Уж что-то мне еще не нравится...
2 max7C4 Ошибки исправил, все равно таже ситуация первыйх два раза коннект удачный потом опять эррор и вылет...