我做一个客户/服务器程序,用的是CSocket类,我从一些书上看到一般的做法是在服务器端先建立一个监听的类,然后进行监听,收到客户端的Connect后,新生成个CSocket的子类进行接收。我的程序是这样,多个客户端向server发送数据,服务器收到数据后进行处理在存入数据库。现在遇到的问题是客户端发送的数据又多又快,服务器收到数据后来不及处理,造成数据丢失。虽然可以用sleep一下,但这只适用与一个客户端。请问有什么方法可以解决这一问题?
调试欢乐多
2 请问,是TCP 吗?
接收的函数如下:
void CMainFrame::ReceiveData(CClientSocket *pClientSocket)
{
char pData[10000],tempData[1000];
int ByteCount;
int EndFlag=0; strcpy(pData,"");
do
{
strcpy(tempData,"");
ByteCount=pClientSocket->Receive(tempData,1000);
if(ByteCount>1000||ByteCount<=0)
{
MessageBox("接收网络信息错误!","网络信息",MB_OK);
return;
}
else if(ByteCount<1000&&ByteCount>0)
{
EndFlag=1;
}
tempData[ByteCount]='\0';
strcpy(pData,tempData);
}while(EndFlag==0);
DealWithData((unsigned char*)pData);//在这个函数中处理数据
}我对多线程不太了解,请问如果将DealWithData这个函数变成线程,参数(即接收到的数据)如何传递?
{
char pData[10000],tempData[1000];
int ByteCount;
int EndFlag=0; strcpy(pData,"");
do
{
strcpy(tempData,"");
ByteCount=pClientSocket->Receive(tempData,1000);
if(ByteCount>1000||ByteCount<=0)
{
MessageBox("接收网络信息错误!","网络信息",MB_OK);
return;
}
else if(ByteCount<1000&&ByteCount>0)
{
EndFlag=1;
}
tempData[ByteCount]='\0';
strcpy(pData,tempData);
}while(EndFlag==0);
//DealWithData((unsigned char*)pData);//在这个函数中处理据
//{{每接受一个 socket 开一个 select 线程
DWORD dwThreadId;
HANDLE hThread; hThread = CreateThread(
NULL, // no security attributes
0, // use defaultstack size
HandleThread, // 线程函数名
(LPVOID)((unsigned char*)pData, //参数
0, // use default creation flags
&dwThreadId); // returns the
//threadidentifier
//检验返回值
ASSERT(hThread != NULL) ;
//}}每接受一个 ,开一个 handle 线程}DWORD WINAPI HandleThread(LPVOID pParam)
{
if(pParam == NULL)
{
return ;
}
(unsigned char*) pData = (unsigned char*)pParam;
DealWithData((unsigned char*)pData);//在这个函数中处理数据
}
大体上可以这样,也许还需要同步。
回zengpan_panpan,我是指服务器都收到了,但来不及处理。因为我在客户端上试了,如果加入Sleep(50),数据就存全了。
有 select 模型等(在《windows 网络编程技术》中有详细描述)模型。我对select模型有一点点认识。
(我写的局域网的聊天室在 csdn 的软件中,是原码,多线程,select模型,vc++ MFC)
如果你需要,可以去下来看看。在 server 端:
每个 client 对应一个线程。
这样处理应该不会再有问题,效率也会提高的。
比如客户端发送完了后等待接受端接受完后发个确认过来再继续发会好些.
服务端:
RECV SEND
客户端:
SEND RECV
help me!
为什么象HongHuer建议的那样接到一个数据就开一个线程会出现这样的问题:DealWithData()函数处理的数据是重复的?