Socket实现C/S跨网段查询的问题

soul24k 2016-01-08 09:57:43
最近在实现一个客户端同局域网内跨网段查询服务器的项目:
假设A段为:172.24.19.x
B段为:192.168.1.x
但也可能是在其他网段
现我想通过客户端查询服务器的方式来跨网段搜索服务器设备
目前以下代码可以实现同网段的搜索,且不同网段,客户户发送广播,服务端也能接收到信息和IP地址,但是此时无法实现服务端反送信息给到客户端,请问大家这个有没有什么好的办法实现?
Client:

int StartSocket(LPVOID pParam)
{
SOCKET sock; //定义嵌套字
sockaddr_in addrto;
WSADATA wsdata;
//bool bsocket;
char smsg[100] = { "socket" };//UDP广播标识
int err = WSAStartup(0x0202, &wsdata);//启动SOCKET库,版本为2.0,也可以按下面的方法进行启动
if (0 != err)
{
return -1;
}
sock = WSASocketW(AF_INET, SOCK_DGRAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
addrto.sin_family = AF_INET;
addrto.sin_addr.s_addr = INADDR_BROADCAST;
addrto.sin_port = htons(9000);
bool opt = TRUE;

//设置该套接字为广播类型,
setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (char FAR *)&opt, sizeof(opt));
int nlen = sizeof(addrto);
char buf[100] = { 0 };

//从广播地址发送消息
int ret = sendto(sock, smsg, strlen(smsg) + 1, 0, (sockaddr*)&addrto, nlen);
if (ret == SOCKET_ERROR)
{
HWND hWnd = NULL;
GetParent(hWnd);
MessageBox(hWnd, _T("erro"), _T("erro"), MB_OK);
}
ret = recvfrom(sock, buf, sizeof(buf), 0, (sockaddr*)&addrto, &nlen);
...//buf内容的处理
return 0;
}


Server:
int StarSocket()
{
SOCKET sock;
sockaddr_in from,a;
WSADATA wsdata;
bool optval;
//启动SOCKET库,版本为2.0
WSAStartup(0x0202,&wsdata);
optval=true;
//然后赋值给两个地址,一个用来绑定套接字,一个用来从网络上的广播地址接收消息;
a.sin_family=AF_INET;
a.sin_addr.s_addr=INADDR_ANY;
a.sin_port=htons(9000);
from.sin_family=AF_INET;
from.sin_addr.s_addr=INADDR_BROADCAST;
from.sin_port=htons(5050);

int fromlength=sizeof(SOCKADDR);
//用UDP初始化套接字
sock = WSASocketW(AF_INET, SOCK_DGRAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
// 设置该套接字为广播类型,
setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(char FAR *)&optval,sizeof(optval));
// 把该套接字绑定在一个具体的地址上
bind(sock,(sockaddr *)&a,sizeof(sockaddr_in));
char buf[256] = {"Hello Client"};
while(1)
{
//从广播地址接收消息,注意用来绑定的地址和接收消息的地址是不一样的
recvfrom(sock,buf,256,0,(sockaddr*)&from,(int FAR *)&fromlength);
ULONG b = from.sin_addr.s_addr;
CString str;
str.Format(_T("%d.%d.%d.%d"), b & 0xff, (b >> 8) & 0xff, (b >> 16) & 0xff, b >> 24);//取IP地址
CString str_rev;
str_rev =buf;
str_rev += "\r\n";
str_rev += str;
::SetDlgItemText(AfxGetApp()->m_pMainWnd->m_hWnd, IDC_EDIT1, str_rev);
sendto( sock, buf, strlen(buf) + 1, 0, (struct sockaddr FAR *)&from, fromlength );
ZeroMemory(buf,256);
}
return 0;
}


...全文
126 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
soul24k 2016-01-11
  • 打赏
  • 举报
回复
没人关注,结贴算了
soul24k 2016-01-08
  • 打赏
  • 举报
回复
顶一下,让哪位大侠指点指点,头都想破了

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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