Winsock完成端口模型-Delphi代码
2008-04-09 04:21:41来源:互联网 阅读 ()
原文出处 《Windows网络编程技术》第8章 完成端口模型
由于原书附的是C代码,我把其翻译成Delphi代码。
其中winsock2.pas在delphi中不带,要另外下载http://jungla.dit.upm.es/~bti/files/winsock2.pas
program CompletionIO;
{$APPTYPE CONSOLE}
uses
SysUtils,
WinSock2 in ''''WinSock2.pas'''',
Mains in ''''Mains.pas'''';
begin
main();
end.
// Module Name: iocmplt.cpp
//
// Description:
//
// This sample illustrates how to develop a simple echo server Winsock
// application using the completeion port I/O model. This
// sample is implemented as a console-style application and simply prints
// messages when connections are established and removed from the server.
// The application listens for TCP connections on port 5150 and accepts them
// as they arrive. When this application receives data from a client, it
// simply echos (this is why we call it an echo server) the data back in
// it''''s original form until the client closes the connection.
//
// 2005-2-5
// cpp convert to delphi pas by johnson
//
unit Mains;
interface
uses Windows, WinSock2, WinSock, Sysutils;
const
PORT = 5150;
DATA_BUFSIZE = 8192;
type
LPVOID = Pointer;
LPPER_IO_OPERATION_DATA = ^ PER_IO_OPERATION_DATA ;
PER_IO_OPERATION_DATA = packed record
Overlapped: OVERLAPPED;
DataBuf: TWSABUF;
Buffer: array [0..DATA_BUFSIZE] of CHAR;
BytesSEND: DWORD;
BytesRECV: DWORD;
end;
LPPER_HANDLE_DATA = ^ PER_HANDLE_DATA;
PER_HANDLE_DATA = packed record
Socket: TSocket;
end;
procedure main;
implementation
function ServerWorkerThread(CompletionPortID: LPVOID): DWORD; stdcall; forward;
procedure printf(Fmt: string; num: Integer);
begin
WriteLn(Format(Fmt, [num]));
end;
procedure main;
var
InternetAddr: SOCKADDR_IN;
Listen: TSOCKET;
Accept: TSOCKET;
CompletionPort: THANDLE ;
SystemInfo: SYSTEM_INFO ;
PerHandleData: LPPER_HANDLE_DATA ;
PerIoData: LPPER_IO_OPERATION_DATA ;
i: Integer;
RecvBytes: DWORD;
Flags: DWORD;
ThreadID: DWORD ;
wsaData: TWSADATA ;
Ret: DWORD ;
ThreadHandle: THANDLE;
begin
Ret := WSAStartup($0202, wsaData);
if (Ret <> 0) then
begin
printf(''''WSAStartup failed with error %d'''', Ret);
Exit;
end;
// Setup an I/O completion port.
CompletionPort := CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 0);
if (CompletionPort = 0) then
begin
printf( ''''CreateIoCompletionPort failed with error: %d'''', GetLastError());
Exit;
end;
// Determine how many processors are on the system.
GetSystemInfo(SystemInfo);
// Create worker threads based on the number of processors available on the
// system. Create two worker threads for each processor.
for i:= 0 to SystemInfo.dwNumberOfProcessors * 2 - 1 do
begin
// Create a server worker thread and pass the completion port to the thread.
ThreadHandle := CreateThread(nil, 0, @ServerWorkerThread, Pointer(CompletionPort),
0, ThreadID);
if (ThreadHandle = 0) then
begin
printf(''''CreateThread() failed with error %d'''', GetLastError());
Exit;
end;
// Close the thread handle
CloseHandle(ThreadHandle);
end;
// Create a listening socket
Listen := WSASocket(AF_INET, SOCK_STREAM, 0, nil, 0, WSA_FLAG_OVERLAPPED);
if (Listen = INVALID_SOCKET) then
begin
printf(''''WSASocket() failed with error %d'''', WSAGetLastError());
exit;
end;
InternetAddr.sin_family := AF_INET;
InternetAddr.sin_addr.s_addr := htonl(INADDR_ANY);
InternetAddr.sin_port := htons(PORT);
if (bind(Listen, InternetAddr, sizeof(InternetAddr)) = SOCKET_ERROR) then
begin
printf(''''bind() failed with error %d'''', WSAGetLastError());
exit;
end;
// Prepare socket for listening
if (Winsock.listen(Listen, 5) = SOCKET_ERROR) then
begin
printf(''''listen() failed with error %d'''', WSAGetLastError());
exit;
end
else
begin
printf(''''Server listen on port = %d ...'''', PORT);
end;
// Accept connections and assign to the completion port.
while(TRUE) do
begin
Accept := WSAAccept(Listen, nil, nil, nil, 0);
if (Accept = SOCKET_ERROR) then
begin
printf(''''WSAAccept() failed with error %d'''', WSAGetLastError());
exit;
end;
// Create a socket information structure to associate with the socket
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash