pIoBuff := FIOBufferManager.GetIOData;
if pIoBuff <> nil then
begin
if (WSARecvFrom(FSocket,@pIoBuff^.DataBuf,1,@pIoBuff^.Bytes,
@ulFlags,PSockAddr(@pIoBuff^.RemoteAddr),@pIoBuff^.RemoteAddrLen,POverlapped(pIoBuff),nil) <> SOCKET_ERROR)
or (WSAGetLastError() = ERROR_IO_PENDING) then
begin
FWorkerEvents[I] := CreateEvent(nil,True,False,nil);
New(PWP);
PWP^.UDP := Self;
PWP^.WorkerEventIndex := i;
FWorkerThreads[i] := TWorkerThread.Create(PWP,0);
end
else
begin
OutputDebugString(PChar(IntToStr(WSAGetLastError)));
FIOBufferManager.RecoverIOData(pIoBuff);
end;
end;
Result := True;
end;constructor TIOBufferManager.Create(Count: Integer);
var
i:Integer;
pIoBuf:PIOBuffer;
begin
FUsedList := TDouList.Create;
FFreeList := TDouList.Create;
InitializeCriticalSection(FLock);
for i := 1 to Count do
begin
New(pIoBuf);
FillChar(pIoBuf^.Overlapped,SizeOf(pIoBuf^.Overlapped),0);
pIoBuf^.DataBuf.buf := @pIoBuf^.Buffer;
pIoBuf^.DataBuf.len := BUFFER_SIZE;
pIoBuf^.RemoteAddrLen := SizeOf(TSockAddr);
pIoBuf^.Point := FFreeList.AddEnd(pIoBuf);
pIoBuf^.Bytes := BUFFER_SIZE;
end;
end;function TIOBufferManager.GetIOData: PIOBuffer;
var
point:PNode;
begin
EnterCriticalSection(FLock);
point := FFreeList.PopHead;
if point <> nil then
begin
Result := PIOBuffer(point^.pData);
FUsedList.AddPosition(point);
end
else
begin
New(Result);
FillChar(Result^.Overlapped,SizeOf(Result^.Overlapped),0);
Result^.DataBuf.buf := @Result^.Buffer;
Result^.DataBuf.len := BUFFER_SIZE;
Result^.RemoteAddrLen := SizeOf(Result^.RemoteAddr);
Result^.Bytes := BUFFER_SIZE;
Result^.Point := FUsedList.AddEnd(Result);
end;
LeaveCriticalSection(FLock);
end;
if pIoBuff <> nil then
begin
if (WSARecvFrom(FSocket,@pIoBuff^.DataBuf,1,@pIoBuff^.Bytes,
@ulFlags,PSockAddr(@pIoBuff^.RemoteAddr),@pIoBuff^.RemoteAddrLen,POverlapped(pIoBuff),nil) <> SOCKET_ERROR)
or (WSAGetLastError() = ERROR_IO_PENDING) then
begin
FWorkerEvents[I] := CreateEvent(nil,True,False,nil);
New(PWP);
PWP^.UDP := Self;
PWP^.WorkerEventIndex := i;
FWorkerThreads[i] := TWorkerThread.Create(PWP,0);
end
else
begin
OutputDebugString(PChar(IntToStr(WSAGetLastError)));
FIOBufferManager.RecoverIOData(pIoBuff);
end;
end;
Result := True;
end;constructor TIOBufferManager.Create(Count: Integer);
var
i:Integer;
pIoBuf:PIOBuffer;
begin
FUsedList := TDouList.Create;
FFreeList := TDouList.Create;
InitializeCriticalSection(FLock);
for i := 1 to Count do
begin
New(pIoBuf);
FillChar(pIoBuf^.Overlapped,SizeOf(pIoBuf^.Overlapped),0);
pIoBuf^.DataBuf.buf := @pIoBuf^.Buffer;
pIoBuf^.DataBuf.len := BUFFER_SIZE;
pIoBuf^.RemoteAddrLen := SizeOf(TSockAddr);
pIoBuf^.Point := FFreeList.AddEnd(pIoBuf);
pIoBuf^.Bytes := BUFFER_SIZE;
end;
end;function TIOBufferManager.GetIOData: PIOBuffer;
var
point:PNode;
begin
EnterCriticalSection(FLock);
point := FFreeList.PopHead;
if point <> nil then
begin
Result := PIOBuffer(point^.pData);
FUsedList.AddPosition(point);
end
else
begin
New(Result);
FillChar(Result^.Overlapped,SizeOf(Result^.Overlapped),0);
Result^.DataBuf.buf := @Result^.Buffer;
Result^.DataBuf.len := BUFFER_SIZE;
Result^.RemoteAddrLen := SizeOf(Result^.RemoteAddr);
Result^.Bytes := BUFFER_SIZE;
Result^.Point := FUsedList.AddEnd(Result);
end;
LeaveCriticalSection(FLock);
end;
解决方案 »
- 如何列出所有符合条件的项目?
- indy控件问题
- dbgrideh 的一个小问题,超难很有用(自动计算) 我想这个问题很有用?对大家也有很帮助
- 如何用qreport的qrgroup對日期按月份分組?(急,在線等).
- 谁有Ehlib 有FOR DELPHI 2005的吗?
- 还是dbgrid得问题!小问题
- 请问谁有KOL(Key Object Library)?
- delphi中需要那些控件完成下列功能?
- 求教:条码打印
- 有否用Delphi写ASP组件的代码及ASP调用此组件的代码?若没有,能否细谈!有,能否发一份!
- 请教:主菜单条右边空白的地方有什么办法可以写上字?
- idhttp.post(url,param)参数问题
10014 Bad address. The system detected an invalid pointer address in attempting to use a pointer argument of a call. This error occurs if an application passes an invalid pointer value, or if the length of the buffer is too small. For instance, if the length of an argument, which is a sockaddr structure, is smaller than the sizeof(sockaddr).