关于winsock服务端接收数据很频繁时出现的有关问题
关于winsock服务端接收数据很频繁时出现的问题。
我用的是阻塞的模式
首先我监听起来
//初始化winsock
socket...
//监听
然后用线程类 TThread创建一个Accept的 线程 线程里面whil循环,作为接受客户端的连接
当接受到客户端进来连接的时候 再创建一个线程(CreateThread)来recv客户端的数据
现在遇到的问题是 有N个客户端,并且客户端非常频繁的,向服务端发送数据的时候 服务端有时候会
漏掉一些数据 接收不到 是不是代码有问题?
我肯定客户端的发送操作是正确的。
//======Accept 线程==============================
TAcceptThread = Class(TThread)
TAcceptThread.Create(sock_Main);
//==============================Accept 线程==============================
constructor TAcceptThread.Create(ListenSock: Cardinal);
begin
F_ListenSock := ListenSock;
inherited Create(False);
end;
procedure TAcceptThread.Execute;
var
chBuffer : array[0..9000] of AnsiChar ; //2K 缓冲区
dwThreadID : DWORD;
PMyPara:PMyParam;
MyPara:MyParam;
begin
while True do
begin
//等待客户端来连接
//OutputDebugString('等待客户端来连接');
F_RecvLogStr := '';
F_cAddrlen := SizeOf(F_sockAddrClient);
ZeroMemory(@F_sockAddrClient, F_cAddrlen);
F_AcceptSock := accept(F_ListenSock, PSockAddr(@F_sockAddrClient), @F_cAddrlen);
if INVALID_SOCKET = F_AcceptSock then
begin
F_RecvLogStr := 'accept error!';
F_RecvLogStr := F_RecvLogStr + ' Error Code: ' + IntToStr(GetLastError) + FormatDateTime('yyyy-mm-dd hh:mm:ss:zzz',now);
Sleep(500);;
Continue;
end;
//客户端连接进入
//保存IP地址
F_ClienIPAddr := string(inet_ntoa(F_sockAddrClient.sin_addr));
F_ClientSockStr := IntToStr(F_AcceptSock);
F_RecvLogStr := F_RecvLogStr + '-----接收到一个连接-----' + #13#10 + F_ClienIPAddr + ' ' + FormatDateTime('yyyy-mm-dd hh:mm:ss:zzz',now) + #13#10;
//显示日志
Form1.mmo1.Lines.Add(F_RecvLogStr);
new(PMyPara);
PMyPara.MySock := F_AcceptSock;
CloseHandle(CreateThread(nil, 0, @MyRecvThread, PMyPara, 0, dwThreadID));
end;
end;
function MyRecvThread(lParam :PMyParam):DWORD;
var
chBuffer : array[0..9000] of AnsiChar ; //2K 缓冲 足够矣
cRecvBuffer : string;
cRecvLogStr : string;
cOrderStr : string;
//Buff: String[100];
addrIP : sockaddr_in;
nLen : Integer;
F_IP : string;
begin
//接收数据过程
ZeroMemory(@chBuffer[0], 9000);
//GetMem(chBuffer[1],2047);
try
if recv(lParam.MySock, chBuffer, 9000, 0) > 0 then
我用的是阻塞的模式
首先我监听起来
//初始化winsock
socket...
//监听
然后用线程类 TThread创建一个Accept的 线程 线程里面whil循环,作为接受客户端的连接
当接受到客户端进来连接的时候 再创建一个线程(CreateThread)来recv客户端的数据
现在遇到的问题是 有N个客户端,并且客户端非常频繁的,向服务端发送数据的时候 服务端有时候会
漏掉一些数据 接收不到 是不是代码有问题?
我肯定客户端的发送操作是正确的。
//======Accept 线程==============================
TAcceptThread = Class(TThread)
TAcceptThread.Create(sock_Main);
//==============================Accept 线程==============================
constructor TAcceptThread.Create(ListenSock: Cardinal);
begin
F_ListenSock := ListenSock;
inherited Create(False);
end;
procedure TAcceptThread.Execute;
var
chBuffer : array[0..9000] of AnsiChar ; //2K 缓冲区
dwThreadID : DWORD;
PMyPara:PMyParam;
MyPara:MyParam;
begin
while True do
begin
//等待客户端来连接
//OutputDebugString('等待客户端来连接');
F_RecvLogStr := '';
F_cAddrlen := SizeOf(F_sockAddrClient);
ZeroMemory(@F_sockAddrClient, F_cAddrlen);
F_AcceptSock := accept(F_ListenSock, PSockAddr(@F_sockAddrClient), @F_cAddrlen);
if INVALID_SOCKET = F_AcceptSock then
begin
F_RecvLogStr := 'accept error!';
F_RecvLogStr := F_RecvLogStr + ' Error Code: ' + IntToStr(GetLastError) + FormatDateTime('yyyy-mm-dd hh:mm:ss:zzz',now);
Sleep(500);;
Continue;
end;
//客户端连接进入
//保存IP地址
F_ClienIPAddr := string(inet_ntoa(F_sockAddrClient.sin_addr));
F_ClientSockStr := IntToStr(F_AcceptSock);
F_RecvLogStr := F_RecvLogStr + '-----接收到一个连接-----' + #13#10 + F_ClienIPAddr + ' ' + FormatDateTime('yyyy-mm-dd hh:mm:ss:zzz',now) + #13#10;
//显示日志
Form1.mmo1.Lines.Add(F_RecvLogStr);
new(PMyPara);
PMyPara.MySock := F_AcceptSock;
CloseHandle(CreateThread(nil, 0, @MyRecvThread, PMyPara, 0, dwThreadID));
end;
end;
function MyRecvThread(lParam :PMyParam):DWORD;
var
chBuffer : array[0..9000] of AnsiChar ; //2K 缓冲 足够矣
cRecvBuffer : string;
cRecvLogStr : string;
cOrderStr : string;
//Buff: String[100];
addrIP : sockaddr_in;
nLen : Integer;
F_IP : string;
begin
//接收数据过程
ZeroMemory(@chBuffer[0], 9000);
//GetMem(chBuffer[1],2047);
try
if recv(lParam.MySock, chBuffer, 9000, 0) > 0 then