原始出處 、作者資訊和本宣告。否則將追究法律責任。
用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...