服务器端怎么同时给N个客户端发数据? 本帖最后由 VisualEleven 于 2011-01-25 17:09:25 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 2,假如现在有端口2000,客户端A和端口2000建立socket=21000,之后客户端B又和端口建立socket=22000;如果这时通过socket=21000发送数据还可以吗? 服务器端维护客户端的socket链表,转发给与其相连的客户端 1、一般来说,一个端口就代表一种服务,不同的服务应该在不同的线程处理。所以没监听一个端口,需要创建一个单独的线程处理数据的收发。2、有客户端连接时,保存客户端的socket,检测各个socket,有数据来接收or直接用socket发送数据。根据lz的描述,一个端口完全满足你的要求啦。 试了用同一ip同一port做服务器,N个客户端来连得情况,确实建立的socket可以独立通讯,可是不明白为什么?我一直以为是,客户端A和端口2000建立socket=21,之后客户端B又和端口2000建立socket=22,那么此时A与服务器建立的链接就被B与服务器建的链接挤掉,只有socket=22有效 你可以开一个端口,建一个SOCKET,用来侦听所有客户端,侦听到后每个客户端建立一个通讯SOCKET形成列表。和客户端通讯的端口可以由服务器自由分配(那个空闲用哪个)。所以说,需制定一个端口并告诉客户端,客户端用来连接(IP+端口) 我想您用的协议应该是tcp吧,您只要开一个端口监听就可以了int l(){ int fromlen=sizeof(np.fromaddr); int errcode; SOCKET m_hSocket,temps; struct sockaddr_in fromaddr; HANDLE hReadHandle; DWORD dThreadId; if(::listen(m_hSocket,5)==SOCKET_ERROR) { ::MessageBox(NULL,"监听出错","监听出错",MB_OK); return 0; } while(1) { temps=accept(pgprs->m_hSocket,(struct sockaddr *)&(fromaddr),&fromlen); if(temps!=INVALID_SOCKET) { hReadHandle=(HANDLE)_beginthreadex(NULL,0,rt,(LPVOID)&np,0,(unsigned int *)&dThreadId); SetThreadPriority(hReadHandle,THREAD_PRIORITY_TIME_CRITICAL); CloseHandle(hReadHandle); } else { errcode=WSAGetLastError(); if(errcode=10004)break; } } return 0;}unsigned int __stdcall rt(LPVOID lpParameter){ SOCKET rs=(PNetPrama)lpParameter; //CRequestSocket *psockobject; UINT lparam=0; volatile int sendresult,length,i,i1,i2; unsigned char buf1[1024], length=::recv(rs,(char *)buf1,1024,0);//MSG_PEEK if(length==SOCKET_ERROR||length==0) { ::closesocket(rs); return 0; } send(rs,...); ::closesocket(rs);} 对不起,创建线程的代码应该是:hReadHandle=(HANDLE)_beginthreadex(NULL,0,rt,(LPVOID)temps,0,(unsigned int *)&dThreadId); MFC奇怪的问题 关于VC的错误 指向源图像的指针是什么意思? 呵呵,麻烦大家帮忙看看这台机器能卖多少钱 有一个比较综合的问题。 CPropertyPage的OnOK()问题 端口与线程 CFindReplaceDialog 经过new,Create之后用不用delete? 调试时运行到pThread->Run()不行了!为什么??? 关于VC 调用Excel的问题! 用SetParent绑架窗口的问题 关于网络编程的两个小问题,求思路?
1、一般来说,一个端口就代表一种服务,不同的服务应该在不同的线程处理。所以没监听一个端口,需要创建一个单独的线程处理数据的收发。
2、有客户端连接时,保存客户端的socket,检测各个socket,有数据来接收or直接用socket发送数据。根据lz的描述,一个端口完全满足你的要求啦。
我一直以为是,客户端A和端口2000建立socket=21,之后客户端B又和端口2000建立socket=22,那么此时A与服务器建立的链接就被B与服务器建的链接挤掉,只有socket=22有效
int l()
{
int fromlen=sizeof(np.fromaddr);
int errcode;
SOCKET m_hSocket,temps;
struct sockaddr_in fromaddr;
HANDLE hReadHandle;
DWORD dThreadId;
if(::listen(m_hSocket,5)==SOCKET_ERROR)
{
::MessageBox(NULL,"监听出错","监听出错",MB_OK);
return 0;
}
while(1)
{
temps=accept(pgprs->m_hSocket,(struct sockaddr *)&(fromaddr),&fromlen);
if(temps!=INVALID_SOCKET)
{
hReadHandle=(HANDLE)_beginthreadex(NULL,0,rt,(LPVOID)&np,0,(unsigned int *)&dThreadId);
SetThreadPriority(hReadHandle,THREAD_PRIORITY_TIME_CRITICAL);
CloseHandle(hReadHandle);
}
else
{
errcode=WSAGetLastError();
if(errcode=10004)break;
}
}
return 0;
}
unsigned int __stdcall rt(LPVOID lpParameter)
{
SOCKET rs=(PNetPrama)lpParameter;
//CRequestSocket *psockobject;
UINT lparam=0;
volatile int sendresult,length,i,i1,i2;
unsigned char buf1[1024],
length=::recv(rs,(char *)buf1,1024,0);//MSG_PEEK
if(length==SOCKET_ERROR||length==0)
{
::closesocket(rs);
return 0;
}
send(rs,...);
::closesocket(rs);
}
hReadHandle=(HANDLE)_beginthreadex(NULL,0,rt,(LPVOID)temps,0,(unsigned int *)&dThreadId);