大家讨论一下SOCKET通信的多客户端处理,讲讲自己是怎样实现的 same 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 服务器端代码: //创建socket sock=socket(AF_INET,SOCK_STREAM,0); //绑定 if (bind(sock,(sockaddr*)&serv,addlen)) { m_edit.SetWindowText("绑定错误"); }else { //m_list.InsertItem(count++,inet_ntoa(serv.sin_addr)); m_edit.SetWindowText("服务器创建成功"); //开始侦听 listen(sock,5); //调用线程 AfxBeginThread(thread,0);线程函数如下:UINT thread(LPVOID p){ char buff[100]; CSize size; size.cx=0; size.cy=30; int s=1,msgcount,loop=1,flag=0; CCSocketDlg *dlg=(CCSocketDlg*)AfxGetApp()->GetMainWnd(); //获得客户端数量 msgcount=dlg->getcount(); if (msgcount==-1)//如果客户端数量达到上限则msgcount=-1 loop=0; if(loop) { s=1; dlg->msgsock[msgcount]=accept(dlg->sock,(sockaddr*)&(dlg->serv),&(dlg->addlen));//msgsock[msgcount] 一个SOCKET的数组,存放与每个客户端相连的SOCKET if (dlg->msgsock[msgcount]==INVALID_SOCKET) { dlg->m_edit.SetWindowText("Error accept"); } else { //启动线程 AfxBeginThread(thread,0); dlg->SetForegroundWindow(); dlg->m_list.InsertItem(dlg->count++,"连接成功"); dlg->m_list.InsertItem(dlg->count++,inet_ntoa(dlg->serv.sin_addr)); dlg->m_list.Scroll(size); dlg->m_button.EnableWindow(TRUE); while(s!=SOCKET_ERROR) { //循环接收数据 s=recv(dlg->msgsock[msgcount],buff,100,0); dlg->SetForegroundWindow(); if (s!=SOCKET_ERROR) { dlg->m_list.InsertItem(dlg->count++,buff); dlg->m_list.Scroll(size); dlg->sendtoall(dlg->msgsock[msgcount],buff); } } send(dlg->msgsock[msgcount],"Disconnected",100,0); dlg->m_list.InsertItem(dlg->count++,"Disconnected"); dlg->m_list.Scroll(size); dlg->msgsock[msgcount]=NULL; for (int i=0;i<50;i++) if (dlg->msgsock[i]!=NULL) flag=1; if (flag!=1) dlg->m_button.EnableWindow(FALSE); closesocket(dlg->msgsock[msgcount]); } } //终止线程 AfxEndThread(0); return 0;} 用SOCKET数组,这样行吗?我以前做异步的时候用过数组,但是这种方法真能经的起考验吗? 用多线程不就行了吗!!每次有一个新的连接就其一个新的线程,然后用setect 的来判断通信中的流量,道一定的时间就可以关闭他 不就行了 建议阅读<<windows 网络编程>> 用阻塞模式,开一个线程不断在ACCEPT,来一个新的客户就新开一个线程,在线程里收发数据。 获取焦点的问题 给指定IP段弹出浏览器插件,如何实现?插件用什么做? 100分求助,为什么打印预览菜单会变灰色? 如何初始化一个Image对象并赋值 DLL导入导出的问题 请教,为什么我给double型数据附值有时得到的结果不精确? sds MATLAB转vc 在工作组方式下能实施DCOM吗? 有关链表的问题 ------------dash()兄请进来拿分----------- 紧急!!!! 在线等待!!请高手相助!!!ADO数据库+多线程
sock=socket(AF_INET,SOCK_STREAM,0);
//绑定
if (bind(sock,(sockaddr*)&serv,addlen))
{
m_edit.SetWindowText("绑定错误");
}else
{
//m_list.InsertItem(count++,inet_ntoa(serv.sin_addr));
m_edit.SetWindowText("服务器创建成功");
//开始侦听
listen(sock,5);
//调用线程
AfxBeginThread(thread,0);线程函数如下:
UINT thread(LPVOID p)
{
char buff[100];
CSize size;
size.cx=0;
size.cy=30;
int s=1,msgcount,loop=1,flag=0;
CCSocketDlg *dlg=(CCSocketDlg*)AfxGetApp()->GetMainWnd();
//获得客户端数量
msgcount=dlg->getcount();
if (msgcount==-1)//如果客户端数量达到上限则msgcount=-1
loop=0;
if(loop)
{
s=1;
dlg->msgsock[msgcount]=accept(dlg->sock,(sockaddr*)&(dlg->serv),&(dlg->addlen));//msgsock[msgcount] 一个SOCKET的数组,存放与每个客户端相连的SOCKET
if (dlg->msgsock[msgcount]==INVALID_SOCKET)
{
dlg->m_edit.SetWindowText("Error accept");
}
else
{
//启动线程
AfxBeginThread(thread,0);
dlg->SetForegroundWindow();
dlg->m_list.InsertItem(dlg->count++,"连接成功");
dlg->m_list.InsertItem(dlg->count++,inet_ntoa(dlg->serv.sin_addr));
dlg->m_list.Scroll(size);
dlg->m_button.EnableWindow(TRUE);
while(s!=SOCKET_ERROR)
{
//循环接收数据
s=recv(dlg->msgsock[msgcount],buff,100,0);
dlg->SetForegroundWindow();
if (s!=SOCKET_ERROR)
{
dlg->m_list.InsertItem(dlg->count++,buff);
dlg->m_list.Scroll(size);
dlg->sendtoall(dlg->msgsock[msgcount],buff);
}
} send(dlg->msgsock[msgcount],"Disconnected",100,0);
dlg->m_list.InsertItem(dlg->count++,"Disconnected");
dlg->m_list.Scroll(size);
dlg->msgsock[msgcount]=NULL;
for (int i=0;i<50;i++)
if (dlg->msgsock[i]!=NULL)
flag=1;
if (flag!=1)
dlg->m_button.EnableWindow(FALSE);
closesocket(dlg->msgsock[msgcount]);
}
}
//终止线程
AfxEndThread(0);
return 0;
}
我以前做异步的时候用过数组,但是这种方法真能经的起考验吗?