高人指路,关于建立多个连接的问题,一定高分相送! 这样一个设计:一个客户端,多个服务器端客户端要和多个服务器分别建立连接并交互数据。问题如下:1。如何与多个服务器建立多个连接。2。数据接收的时候如何确定是由那个服务器发来的数据。谢谢指点,一定高分相送。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 一、为什么要与多个服务器端连接呢?如果是为了保证可靠性, 应该是屏蔽服务端,只对外提供一个接口,而服务端做IP转换等,我不知道你说的目的是什么?二、接收时的socket中可以取到源端啊 如果是tcp套接口那必须对每个服务器都建立一个套接口,每个套接口连接对应的一个服务器,问题1、2就很简单了。如果是udp套接口那只用一个套接口也可以,发送请求数据包,接受时用ReceiveFrom函数,就可以得到服务器的ip地址和端口了。 楼主和我正在做的东西差不多,但这块我也还没能解决。我也想知道如果同时有多个TCP连接请求时,客户端程序应该怎么做才能接收所有的TCP连接请求并接收数据。各位大侠多提建议,我学习:) 大家请关注http://expert.csdn.net/Expert/topic/1843/1843178.xml?temp=.7270929 用一个线程来轮询不同连接的多个SOCKET也是可以的,这样也能分辨数据来源;但是,这样做容易阻塞在某个SOCKET上,如果让每个SOCKET帮定在一个线程上,问题应该比较容易解决 最好用多线程,每个线程包含一个套接口。主线程维护一个子线程指针数组,动态创建子线程。子线程中套接口接收到消息的OnReceive函数只是将消息交给子线程处理,子线程再负责接收数据并将数据(连同服务器信息等等)通过消息通知主线程。主线程根据服务器信息处理即可。所以只需要派生一个套接口类就可:class CYourSocket::CAsyncSocket{ CYourThread *m_pOwner; ... ... OnReceive(...) {... m_pOwner->OnReceive(...);};}最好自己找一个现成的例子跟踪执行一下。 regainworld,能给我一个现成的例子吗?[email protected]多谢! 无需这么麻烦,单线程即可。动态产生新Socket进行连接,同时在自己定义的Socket类中加入一个CString address记录此连接的对方的IP就行了。void CMySocket::OnAccept(int nErrorCode) //CMySocket是自己派生的Socket类{int len=sizeof(sockaddr_in);sockaddr_in *addr=new sockaddr_in;CMySocket *Connect=new CMySocket;Accept(*Connect,(sockaddr *)addr,&len);//用新生成的Socket连接,不影响侦听Socketaddress=inet_ntoa(addr->sin_addr);//得到对方的IP} 楼上说得是服务器端,监听端口接收连接的时候都得这么做,不过接收到后就可以选择开不开新线程了。不过标示数据来源的意思是对得。客户端你要主动连接服务器,所以你必须给线程传入服务器ip。class CYourThread::CWinThread{ ... OnReceive(...) {}; //普通的成员函数,可以叫任何名字 CYourSocket m_sock; CString m_strServerIp; //服务器ip HWND m_hOwner; //主窗口句柄,用来发送消息 BOOL Init(CString strServerIp, HWND hOwner); //初始化成员变量 }struct ReceiveDataInfo{ int nReceived; CString strServerIp;};... CYourThread::OnReceive(...){ //接收数据 ReceiveDataInfo rdi; char buf[MAX_SIZE]; rdi.nReceived=m_sock.Receive(buf, MAX_SIZE); //向主窗口发送接收到服务器数据 rdi.strServerIp=m_strServerIp; ::SendMessage(m_hOwner, WM_XXX, buf, (LPARAM)&rdi);}现成例子我也没有,你问问别人吧:) 楼主,找到例子给我发一个好吗 ?我也在做这个方面,卡了~[email protected]谢了 建立一个服务器结构体struct server{CString IP;CString HostName;CMySocket * ClientSock;}serv[255];//具体多少个服务器随你定要连接时将客户端的Socket指针传到对印的server结构中去SOCKADDR_IN addr;int host;CMySocket *CSock=new CMySocket;if(CSock->Connect(ServerIP,ServerPort)!=SOCKET_ERROR){ addr.Sin_addr=inet_addr(ServerIP); host=addr.sin_addr.S_un.S_un_b.s_b4;//用服务器IP地址的最后一个字节作为serv数组的编号(如果服务器IP地址最后一字节有重复则不可使用此法,但这种方法非常适合局域网,查找速度快) serv[host].ClientSock=CSock;}以后你就可以根据服务器的IP地址找到它在serv表中的位置,然后调用其中的ClientSock,进行传输操作 现在我也实现了,方法和ifromheaven(天堂鸟) 的基本类似,只是我用的是API。 这么简单的逻辑怎么行不通,是不是ADO代码问题? 如何将__int64转换成16进制数放入字符数组中 关于结构体内隐含指针的问题,请众位高手指教,多谢! 怎么学习VC? 关于不修改系统语言设定在.net中正确显示其他编码格式的文字问题 这两种sql语句有什么区别!(请高人看一下) 请各位师兄帮我推荐几本操作系统和编译原理方面的教材,多谢!!!推荐者有分 如何将bmp序列转换为AVI文件? 问个很菜的问题:C#_C++_Visual C++_都是什么,有什么区别啊? 16色位图的存储格式知多少??图像编程的人帮帮忙!! 请教关于位图显示的问题(在线等待) 100分,两个小题目
二、接收时的socket中可以取到源端啊
如果是udp套接口那只用一个套接口也可以,发送请求数据包,接受时用ReceiveFrom
函数,就可以得到服务器的ip地址和端口了。
我也想知道如果同时有多个TCP连接请求时,客户端程序应该怎么做才能接收所有的TCP连接请求并接收数据。
各位大侠多提建议,我学习:)
但是,这样做容易阻塞在某个SOCKET上,如果让每个SOCKET帮定在一个线程上,
问题应该比较容易解决
子线程中套接口接收到消息的OnReceive函数只是将消息交给子线程处理,子线程再负责接收数据并将数据(连同服务器信息等等)通过消息通知主线程。
主线程根据服务器信息处理即可。所以只需要派生一个套接口类就可:
class CYourSocket::CAsyncSocket
{
CYourThread *m_pOwner;
...
... OnReceive(...) {... m_pOwner->OnReceive(...);};
}最好自己找一个现成的例子跟踪执行一下。
[email protected]
多谢!
动态产生新Socket进行连接,同时在自己定义的Socket类中加入一个CString address记录此连接的对方的IP就行了。
void CMySocket::OnAccept(int nErrorCode) //CMySocket是自己派生的Socket类
{
int len=sizeof(sockaddr_in);
sockaddr_in *addr=new sockaddr_in;
CMySocket *Connect=new CMySocket;
Accept(*Connect,(sockaddr *)addr,&len);//用新生成的Socket连接,不影响侦听Socket
address=inet_ntoa(addr->sin_addr);//得到对方的IP
}
class CYourThread::CWinThread
{
... OnReceive(...) {}; //普通的成员函数,可以叫任何名字
CYourSocket m_sock; CString m_strServerIp; //服务器ip
HWND m_hOwner; //主窗口句柄,用来发送消息
BOOL Init(CString strServerIp, HWND hOwner); //初始化成员变量
}struct ReceiveDataInfo
{
int nReceived;
CString strServerIp;
};... CYourThread::OnReceive(...)
{
//接收数据
ReceiveDataInfo rdi;
char buf[MAX_SIZE];
rdi.nReceived=m_sock.Receive(buf, MAX_SIZE); //向主窗口发送接收到服务器数据
rdi.strServerIp=m_strServerIp;
::SendMessage(m_hOwner, WM_XXX, buf, (LPARAM)&rdi);
}现成例子我也没有,你问问别人吧:)
我也在做这个方面,卡了~
[email protected]
谢了
struct server{
CString IP;
CString HostName;
CMySocket * ClientSock;
}serv[255];//具体多少个服务器随你定
要连接时将客户端的Socket指针传到对印的server结构中去
SOCKADDR_IN addr;
int host;
CMySocket *CSock=new CMySocket;
if(CSock->Connect(ServerIP,ServerPort)!=SOCKET_ERROR)
{
addr.Sin_addr=inet_addr(ServerIP);
host=addr.sin_addr.S_un.S_un_b.s_b4;//用服务器IP地址的最后一个字节作为serv数组的编号(如果服务器IP地址最后一字节有重复则不可使用此法,但这种方法非常适合局域网,查找速度快)
serv[host].ClientSock=CSock;
}
以后你就可以根据服务器的IP地址找到它在serv表中的位置,然后调用其中的ClientSock,进行传输操作