采用 完成例程方式 函数名:WorkerRoutine
当程序接收到一个UDP信息的时候 程序就出错了. 请问哪里的原因unit uUDP;interfaceuses
Windows, Classes, SysUtils, WinSock2;const
BUFFER_SIZE = 4096;
RECV_TIME_OUT = 550;
LISTEN_PORT = 8088;type
TOverlapThread = class(TThread)
private
FBuf: TWSABUF;
FBuffer: array[0..BUFFER_SIZE] of Char;
public
m_socket: TSocket;
m_overlap: WSAOVERLAPPED;
protected
procedure Execute; override;
protected
procedure PostRecvMessage;
protected
function InitSock: BOOL;
procedure FreeResource;
end;var
OverlapThread: TOverlapThread;procedure WorkerRoutine( dwError :Dword;
cbTransferred: DWORD; lpOverlapped: LPWSAOVERLAPPED; dwFlags: Dword
); stdcall;implementationuses Unit1;{ TOverlapThread }procedure TOverlapThread.Execute;
begin
try
if not InitSock() then Exit; PostRecvMessage; while (not Terminated) do
begin
if SleepEx(RECV_TIME_OUT, True) = WAIT_IO_COMPLETION then //
begin
;
end else
begin
continue;
end;
end; FreeResource; except
end;
end;procedure WorkerRoutine( dwError :Dword;
cbTransferred: DWORD; lpOverlapped: LPWSAOVERLAPPED; dwFlags: Dword
); stdcall;
//var
// lpBuf: array[0..BUFFER_SIZE] of Char;
begin
try
// if (dwError <> 0) or (cbTransferred = 0) then
// begin
// TOverlapThread(lpOverlapped^.hEvent).PostRecvMessage;
// Exit;
// end;// CopyMemory(@lpBuf, TOverlapThread(lpOverlapped^.hEvent).FBuf.buf, BUFFER_SIZE);
// unit1.Form1.mmo1.Lines.Add(StrPas(lpBuf));// TOverlapThread(lpOverlapped^.hEvent).PostRecvMessage;
except
end;
end;procedure TOverlapThread.FreeResource;
begin
closesocket(m_socket);
WSACleanup;
end;function TOverlapThread.InitSock: BOOL;
var
addr: TSockAddr;
wsaData: TWSADATA;
dwVersionRequested: DWORD;
begin
Result := False;
try
dwVersionRequested := MAKEWORD(2, 2);
WSAStartup(dwVersionRequested, wsaData); m_socket := WSASocket(AF_INET, SOCK_DGRAM, 0, nil, 0, WSA_FLAG_OVERLAPPED);
addr.sin_family := AF_INET;
addr.sin_port := htons(LISTEN_PORT);
addr.sin_addr.S_addr := INADDR_ANY;
bind(m_socket, @addr, sizeof(SOCKADDR)); Result := True;
except
end;end;procedure TOverlapThread.PostRecvMessage;
var
addr: TSockAddrIn;
addrlen: Integer;
dwTemp, dwFlag: DWORD;
begin
try
addrlen := sizeof(addr); FBuf.len := BUFFER_SIZE;
FBuf.buf := @FBuffer; dwFlag := 0;
FillChar(m_overlap, sizeof(WSAOVERLAPPED), 0);
m_overlap.hEvent := DWORD(self); WSARecvFrom(m_socket,
@FBuf,
1,
@dwTemp,
@dwFlag,
@addr,
@addrlen,
@m_overlap,
WorkerRoutine);
except
end;
end;initialization
OverlapThread := TOverlapThread.Create(True);
OverlapThread.FreeOnTerminate := True;
OverlapThread.Resume;finalizationend.
当程序接收到一个UDP信息的时候 程序就出错了. 请问哪里的原因unit uUDP;interfaceuses
Windows, Classes, SysUtils, WinSock2;const
BUFFER_SIZE = 4096;
RECV_TIME_OUT = 550;
LISTEN_PORT = 8088;type
TOverlapThread = class(TThread)
private
FBuf: TWSABUF;
FBuffer: array[0..BUFFER_SIZE] of Char;
public
m_socket: TSocket;
m_overlap: WSAOVERLAPPED;
protected
procedure Execute; override;
protected
procedure PostRecvMessage;
protected
function InitSock: BOOL;
procedure FreeResource;
end;var
OverlapThread: TOverlapThread;procedure WorkerRoutine( dwError :Dword;
cbTransferred: DWORD; lpOverlapped: LPWSAOVERLAPPED; dwFlags: Dword
); stdcall;implementationuses Unit1;{ TOverlapThread }procedure TOverlapThread.Execute;
begin
try
if not InitSock() then Exit; PostRecvMessage; while (not Terminated) do
begin
if SleepEx(RECV_TIME_OUT, True) = WAIT_IO_COMPLETION then //
begin
;
end else
begin
continue;
end;
end; FreeResource; except
end;
end;procedure WorkerRoutine( dwError :Dword;
cbTransferred: DWORD; lpOverlapped: LPWSAOVERLAPPED; dwFlags: Dword
); stdcall;
//var
// lpBuf: array[0..BUFFER_SIZE] of Char;
begin
try
// if (dwError <> 0) or (cbTransferred = 0) then
// begin
// TOverlapThread(lpOverlapped^.hEvent).PostRecvMessage;
// Exit;
// end;// CopyMemory(@lpBuf, TOverlapThread(lpOverlapped^.hEvent).FBuf.buf, BUFFER_SIZE);
// unit1.Form1.mmo1.Lines.Add(StrPas(lpBuf));// TOverlapThread(lpOverlapped^.hEvent).PostRecvMessage;
except
end;
end;procedure TOverlapThread.FreeResource;
begin
closesocket(m_socket);
WSACleanup;
end;function TOverlapThread.InitSock: BOOL;
var
addr: TSockAddr;
wsaData: TWSADATA;
dwVersionRequested: DWORD;
begin
Result := False;
try
dwVersionRequested := MAKEWORD(2, 2);
WSAStartup(dwVersionRequested, wsaData); m_socket := WSASocket(AF_INET, SOCK_DGRAM, 0, nil, 0, WSA_FLAG_OVERLAPPED);
addr.sin_family := AF_INET;
addr.sin_port := htons(LISTEN_PORT);
addr.sin_addr.S_addr := INADDR_ANY;
bind(m_socket, @addr, sizeof(SOCKADDR)); Result := True;
except
end;end;procedure TOverlapThread.PostRecvMessage;
var
addr: TSockAddrIn;
addrlen: Integer;
dwTemp, dwFlag: DWORD;
begin
try
addrlen := sizeof(addr); FBuf.len := BUFFER_SIZE;
FBuf.buf := @FBuffer; dwFlag := 0;
FillChar(m_overlap, sizeof(WSAOVERLAPPED), 0);
m_overlap.hEvent := DWORD(self); WSARecvFrom(m_socket,
@FBuf,
1,
@dwTemp,
@dwFlag,
@addr,
@addrlen,
@m_overlap,
WorkerRoutine);
except
end;
end;initialization
OverlapThread := TOverlapThread.Create(True);
OverlapThread.FreeOnTerminate := True;
OverlapThread.Resume;finalizationend.
解决方案 »
- 大家用delphi 都用什么数据访问技术
- uses放在interface后面或放在implementation后面,有什么区别吗?
- 如何在AMAZON买书?
- ole问题
- Frame的的问题!
- 为何下面的程序执行的时候,edit1\edit2的现实没有任何变化
- Delphi7中为啥没有FastNet组件了?!
- 怎样截获系统出错信息?速救!!!100分等你!
- 紧急求救:quickrep中列数太多,preview只能看到A4页面宽度的内容,即使更改ORIENTATION为LANDSCAPE也不行。注:我的计算机上没有安装打印机。
- 使用delphi画图的疑难,请帮忙!
- 关于动态网页上数据库链接的问题
- 直接在Dbgrideh修改了数据后自动提交如何做,求指教~
好好看看这边书,它应该对您价值很大.