DELPHI中完成埠 IOCP 的簡單分析(1)

2021-06-15 22:11:47 字數 2718 閱讀 4059

原始出處 、作者資訊和本宣告。否則將追究法律責任。

用delphi開發網路**已經有一段時間了!

我發現在網上用vc來實現完成埠(iocp)的**很多,但是使用delphi來實現的就比較少了。對iocp講的清楚的就更少了。在這裡我把自己編寫delphi下的iocp寫出來,希望對剛學完成埠的朋友有個幫助。

首先我們來了解一些在使用iocp的時候需要使用的一些結構!

(1):單io資料結構

(2):「單句柄資料結構」

lpper_handle_data = ^ per_handle_data;

per_handle_data = packed record

socket: tsocket;

end;

下來我從編寫乙個完成埠的為例說明。

if wsastartup($202, wsdata) <> 0 then

begin

wsacleanup();

end;

載入socket。我使用的是2.2版為了後面方便加入心跳。

completionport:=createiocompletionport(invalid_handle_value,0,0,0);

建立乙個完成埠。

getsysteminfo(localsi);

for i:=0 to localsi.dwnumberofprocessors * 2 -1 do

begin

hthread := createthread(nil, 0, @serverworkerthread, pointer(completionport),0, threadid);

if (hthread = 0) then

begin

exit;

end;

closehandle(hthread);

end;

根據cpu的數量建立cpu*2數量的工作者執行緒。

if listensc=socket_error then

begin

closesocket(listensc);

wsacleanup();

end;

sto.sin_family:=af_inet;

sto.sin_port:=htons(5500);

sto.sin_addr.s_addr:=htonl(inaddr_any);

if bind(listensc,sto,sizeof(sto))=socket_error then

begin

closesocket(listensc);

end;

listen(listensc,20);

建立乙個套接字,將此套接字和乙個埠繫結並監聽此埠。

while (true) do

begin

acceptsc:= wsaaccept(listensc, nil, nil, nil, 0);

當客戶端有連線請求的時候,wsaaccept函式會新建立乙個套接字acceptsc。這個套接字就是和客戶端通訊的時候使用的套接字。

if (acceptsc= socket_error) then

begin

closesocket(listensc);

exit;

end;

判斷acceptsc套接字建立是否成功,如果不成功則退出。

perhandledata := lpper_handle_data (globalalloc(gptr, sizeof(per_handle_data)));

if (perhandledata = nil) then

begin

exit;

end;

perhandledata.socket := acceptsc;

建立乙個「單句柄資料結構」將acceptsc套接字繫結。

if (createiocompletionport(acceptsc, completionport, dword(perhandledata), 0) = 0) then

begin

exit;

end;

將套接字、完成埠和「單句柄資料結構」三者繫結在一起。

periodata := lpper_io_operation_data(globalalloc(gptr, sizeof(per_io_operation_data)));

if (periodata = nil) then

begin

exit;

end;

periodata.bytessend := 0;

periodata.bytesrecv := 0;

periodata.databuf.len := 1024;

periodata.databuf.buf := @periodata.buffer;

flags := 0;

建立乙個「單io資料結構」其中將periodata.bytessend 和periodata.bytesrecv 均設定成0。說明此「單io資料結構」是用來接受的。

begin

if (wsagetlasterror() <> error_io_pending) then

begin

exit;

endend;

用此「單io資料結構」來接受acceptsc套接字的資料。

end;

建立iocp的工作已經完成,下一次我將寫iocp的工作者執行緒的處理方法,謝謝!

DELPHI中完成埠 IOCP 的簡單分析(1)

用delphi開發網路 已經有一段時間了!我發現在網上用vc來實現完成埠 iocp 的 很多,但是使用delphi來實現的就比較少了。對iocp講的清楚的就更少了。在這裡我把自己編寫delphi下的iocp寫出來,希望對剛學完成埠的朋友有個幫助。首先我們來了解一些在使用iocp的時候需要使用的一些結...

DELPHI中完成埠 IOCP 的簡單分析(1)

用delphi開發網路 已經有一段時間了!我發現在網上用vc來實現完成埠 iocp 的 很多,但是使用delphi來實現的就比較少了。對iocp講的清楚的就更少了。在這裡我把自己編寫delphi下的iocp寫出來,希望對剛學完成埠的朋友有個幫助。首先我們來了解一些在使用iocp的時候需要使用的一些結...

DELPHI中完成埠 IOCP 的簡單分析(4)

在我以前寫的文章中,一直說的是如何接收資料。但是對於如何傳送資料卻一點也沒有提到。因為從 量上來說接收的 要比傳送多很多。今天我就來寫一下如何使用iocp傳送資料。function tnetcontrol.sendspecifydata const socket tsocket data array...