CAsyncSocket 一服务器对多客户端

pizicai105 2005-08-19 02:31:19
想实现一服务器对多客户端的连接

请问怎么写?能具体点吗!最好是有源程序参考,谢谢
...全文
648 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
gohappy_1999 2005-09-19
  • 打赏
  • 举报
回复
mark
sungengyu 2005-09-05
  • 打赏
  • 举报
回复
惭愧
pizicai105 2005-08-26
  • 打赏
  • 举报
回复
怎样在OnReceive接收到消息时获得发送方的Sock
pizicai105 2005-08-25
  • 打赏
  • 举报
回复
怎样在OnReceive接收到消息时获得发送方的Sock

pizicai105 2005-08-25
  • 打赏
  • 举报
回复
你说的在 “OnReceive中触发一个处理函数,里面会用多个OnSend”,我不知道行不行。


这里的一个处理函数是这样的,它先处理客户端发送过来的字符串,字符串有很多种可能,每种可能都将产生不一样的onsend给客户端,



sungengyu(快乐机器)
CRequestSocket::OnReceive() 中得到客户端的地址:

CString addr ;
UINT port ;
GetPeerName(addr,port) ;


OnAccept()中
SOCKADDR_IN ClientAddr;
int addr_length = sizeof(ClientAddr);
CSocket::Accept (*pSocket,(SOCKADDR*)&ClientAddr,&addr_length);
lpIp = inet_ntoa(ClientAddr.sin_addr);//********Client IP
nPort = ClientAddr.sin_port; //*****************Client Port


两者得到的端口号怎么会不一样??奇怪!!!!!!
sungengyu 2005-08-24
  • 打赏
  • 举报
回复
CRequestSocket 中的 m_buffer , m_iBufferLen 中存放的是返回的数据。这个数据应该在 OnReceive中被设置。这个过程不能用太长时间,否则可能影响到其他客户端的连接。

我也是刚学网络编程,大家共同进步。

sungengyu 2005-08-24
  • 打赏
  • 举报
回复
CRequestSocket 也需要覆盖基类的部分虚函数
CListenSocket::OnAccept 返回后,下一个被调用的是 CRequestSocket::OnReceive
在 CRequestSocket::OnReceive 中设定 AsyncSelect(FD_WRITE|FD_CLOSE) ;
CRequestSocket::OnSend 就会被调用

// 从
void CRequestSocket::OnReceive(int nErrorCode)
{
const int BUFFER_SIZE = 4096 ;

char *buffer = new char [BUFFER_SIZE] ;

int len = 0 ;

while(1)
{
len = Receive(buffer,BUFFER_SIZE) ;

// 这里要判断 len 的值,一次接受不完需要多次接受
// 具体细节请看MSDN

break ;
}

if(len<=0)
ShutDown() ;
else
{
theResponse.GetResponse(buffer,len,m_buffer,m_iBufferLen) ;
AsyncSelect(FD_WRITE|FD_CLOSE) ; // 这是为了触发 OnSend
}

delete []buffer ; buffer=0 ;
}

// OnSend 在 OnReceive 中被触发
// 代码很简单
void CRequestSocket::OnSend(int nErrorCode)
{
Send(m_buffer,m_iBufferLen) ; // m_buffer , m_iBufferLen 是 CRequestSocket
// 的成员函数,并在OnReceive中被设置
ShutDown() ;
Close() ;
// 如果需要的话,可以释放自己 delete this ;
}
sungengyu 2005-08-24
  • 打赏
  • 举报
回复
从 CAsyncSocket 派生一个 CListenSocket(监听),一个CRequestSocket(响应)


CListenSocket :

// 外部调用
theListenSocket.Create(80 , SOCK_STREAM, FD_ACCEPT) ;
theListenSocket.Listen() ;

// 重写 OnAccept
void CListenSocket::OnAccept(int nErrorCode)
{
CRequestSocket *pRequest = new CRequestSocket ;
if( !pRequest)
return ;

if ( Accept( *pRequest ) )
{
pRequest->AsyncSelect( FD_READ|FD_CLOSE);
}

// CAsyncSocket::OnAccept(nErrorCode);
}
Wolfe 2005-08-24
  • 打赏
  • 举报
回复
我还是习惯用原始socket
服务端接收每个客户端连接的时候都会返回一个socket,你可以用这个socket来识别各个客户端,每监听到一个就存储一个。
sungengyu 2005-08-24
  • 打赏
  • 举报
回复

CRequestSocket::OnReceive() 中得到客户端的地址:

CString addr ;
UINT port ;
GetPeerName(addr,port) ;

你说的在 “OnReceive中触发一个处理函数,里面会用多个OnSend”,我不知道行不行。

希望你能把你的试验结果告诉大家,谢谢。




pizicai105 2005-08-24
  • 打赏
  • 举报
回复
我想知道在OnReceive接收到消息的同时能否得到其IP地址和端口,怎么做才能得到?
pizicai105 2005-08-24
  • 打赏
  • 举报
回复
sungengyu(快乐机器)

你的代码的确能实现一对多,但是,你的OnSend只能在OnReceive中触发,

我现在要的程序是OnReceive触发一个处理函数,然后在里面会用多个OnSend

我想知道在OnReceive接收到消息的同时能否得到其IP地址和端口,怎么做才能得到?

如果能得到的话,我在OnAccept时将其IP地址和端口放入CPtrList中,以后的话再将队列中的拿出来跟OnReceive中得到的相比较,就可以得出客户端的位置了!

你们说这样对吗?
zyyoung 2005-08-23
  • 打赏
  • 举报
回复
www.vckbase.com
masterz 2005-08-23
  • 打赏
  • 举报
回复
http://www.fruitfruit.com/vc/network/asyncsocket_test.cpp.txt
这里是1对1的连接,你可以在这个基础上修改。
Zhymax 2005-08-23
  • 打赏
  • 举报
回复
可以每一个客户端建一个线程,用一个链表管理这些连接的客户端
pizicai105 2005-08-23
  • 打赏
  • 举报
回复
具体点说吧,

就是服务器也能识别客户端,并且能向客户端发送消息

发消息的函数是send,可是我现在问题是:客户端很多个,服务器怎么判断要发给哪个客户端,

有人用CPtrList队列做,但是好像不太行,有人用线程做,怎么做?请指教!
xxrl 2005-08-22
  • 打赏
  • 举报
回复
www.vckbase.com 楼上多了一个字母
nuaawenlin 2005-08-19
  • 打赏
  • 举报
回复
www.vckabase.com
pizicai105 2005-08-19
  • 打赏
  • 举报
回复
老实说我下了很多源码,
都写得太乱或太复杂,我看得不太懂
最好有点简单一点的
李马 2005-08-19
  • 打赏
  • 举报
回复
http://www.codeproject.com/internet/winsockintro03.asp
加载更多回复(1)

18,357

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧