社区
通信技术
帖子详情
飞秋跨网段通信
北飞
2009-07-28 09:05:00
关于飞秋的跨网段通信的问题,昨天试了下如果两台计算机都在路由器后面的话,就是说这两台电脑都是通过路由器上公网,而每个路由器下面又有好多台计算机,我从“加其他网段好友”这个功能里加了相应的路由器的IP就可以加这个下面的在线好友了,它怎么能加为好友,又怎么能知道信息该发给谁呢,这是怎么实现的呢,哪位大哥能给解释下它的原理呢,非常感谢?
...全文
5442
6
打赏
收藏
飞秋跨网段通信
关于飞秋的跨网段通信的问题,昨天试了下如果两台计算机都在路由器后面的话,就是说这两台电脑都是通过路由器上公网,而每个路由器下面又有好多台计算机,我从“加其他网段好友”这个功能里加了相应的路由器的IP就可以加这个下面的在线好友了,它怎么能加为好友,又怎么能知道信息该发给谁呢,这是怎么实现的呢,哪位大哥能给解释下它的原理呢,非常感谢?
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
天天程序员
2012-09-28
打赏
举报
回复
跨网段通信还需要交换机的支持,需要配置一下,一般默认情况下(以cisco 3650为例),交换机的组播转发是关闭。此种情况下你的程序编出花样来也无法跨网段通信。
龍月
2009-07-28
打赏
举报
回复
局域网通讯的难题,跨网段通讯方法
多播
局域网的资源丰富,使用Windows共享机制可以很方便的访问大家的共享文件。但你能搜索到和你不同网段的资源么。不行。那么使用其他的软件(非跨网段专用通讯软件)能相互通讯么?不能。
这是为什么呢?因为局域网中也使用TCP/IP协议,而TCP/IP协议中常用的基础协议TCP和UDP都使用子网掩码这个东东。所以如果你们的子网不是相互包含,那么你们通讯时所发送的数据包将被无情的丢弃。
那我用广播通讯不行么? 当然行啦,不过广播通信会增加其他非参与者的负荷。如果使用多播,嘿嘿。一切OK!
多播通讯编程难么? 我原来也以为很难,呵呵,现在我可不那么认为了,
下面是多播通讯类的代码。
//Multicast.c
#pragma once
// auth: YYcYY
// date: 2006-8-12
// copyright: All free
//定义收到数据时通知父窗口的消息编号:WM_MUC_RECEIVE_DATA
#define WM_MUC_RECEIVE_DATA (WM_USER + 1097)
#define MAX_MUC_PACKET_SIZE 1460
#define SEND_BUFF_COUNT 4
#define RECEIVE_BUFF_COUNT 32
#define MU_PORT 5201
#define MU_GROUP_IP "224.0.0.8"
const int PACKET_HEAD_SIZE = 20;
#define MSG_TYPE_ALLUSER 1
#define MSG_TYPE_ACK 2
#define MSG_TYPE_ONLINE 3
#define MSG_TYPE_PROXY_REQUEST 4 //特殊用途#define MSG_TYPE_ONEUSER 5
struct SPACKET
{
char used;
char nType;
long long time;
int nUnused;
char data[MAX_MUC_PACKET_SIZE-20];
};
// CMulticast 命令目标
class CMulticast : public CAsyncSocket
{
private:
CWnd * m_pParent;
SOCKADDR_IN m_GroupAddr;
ip_mreq m_mrMReq;
int m_nTTL;
CString m_sLocalIP;
public:
CMulticast(CWnd * pParent, CString & localIP);
virtual ~CMulticast();
virtual void OnReceive(int nErrorCode);
BOOL InitSock(void);
void DeleteThis();
int SendData(int nIndex, int len);
SPACKET SendBuff[SEND_BUFF_COUNT];
SPACKET ReveiveBuff[RECEIVE_BUFF_COUNT];
SPACKET AckBuff;
};
// Multicast.cpp : 实现文件
//
#include "stdafx.h"
#include "Multicast.h"
#include ".\multicast.h"
// CMulticast
CMulticast::CMulticast(CWnd * pParent, CString & localIP)
{
m_pParent = pParent;
m_sLocalIP = localIP; //如果不设置请使用空字符串
m_nTTL = 3; //允许经过的路由个数
// 初试化个个成员变量
memset(&m_mrMReq, 0, sizeof(m_mrMReq));
memset(&m_GroupAddr, 0, sizeof(m_GroupAddr));
memset(ReveiveBuff, 0, sizeof(SPACKET)* RECEIVE_BUFF_COUNT);
memset(SendBuff, 0, sizeof(SPACKET)* SEND_BUFF_COUNT);
// 使用函数初始化 否则容易产生内存错误
InitSock();
}
CMulticast::~CMulticast()
{
// 使用函数析构 否则容易产生内存错误
DeleteThis();
}
void CMulticast::DeleteThis()
{
// 离开多播组
setsockopt (m_hSocket, IPPROTO_IP, IP_DROP_MEMBERSHIP, (char FAR *)&m_mrMReq, sizeof(m_mrMReq));
}
// CMulticast 成员函数
void CMulticast::OnReceive(int nErrorCode)
{
// TODO: 在此添加专用代码和/或调用基类
int i=0,len=0;
UINT nPort = 0;
CString * pStr = new CString; // 由使用者使用完后释放。
for (i=0;i<RECEIVE_BUFF_COUNT;i++)
{
if (ReveiveBuff[i].used == 0)
{
break;
}
}
len = ReceiveFrom(&ReveiveBuff[i], MAX_MUC_PACKET_SIZE, *pStr, nPort);
if (len > 0)
{ //通知父窗口,消息第一个参数 i 为接收到的消息在缓冲区的索引值
::PostMessage(m_pParent->GetSafeHwnd(), WM_MUC_RECEIVE_DATA, (WPARAM)i, (LPARAM)pStr);
}
CAsyncSocket::OnReceive(nErrorCode);
}
BOOL CMulticast::InitSock(void)
{ //创建 Socket 并绑定地址为 m_sLocalIP
if(!Create(MU_PORT, SOCK_DGRAM, FD_READ,m_sLocalIP))
return FALSE;
BOOL bMultipleApps = TRUE; /* 允许复用端口*/
SetSockOpt(SO_REUSEADDR, (void*)&bMultipleApps, sizeof(BOOL), SOL_SOCKET);
/* 填写 m_GroupAddr 的字段值 */
memset(&m_GroupAddr, 0, sizeof(m_GroupAddr));
m_GroupAddr.sin_family = AF_INET;
m_GroupAddr.sin_addr.s_addr = inet_addr(MU_GROUP_IP);
m_GroupAddr.sin_port = htons((USHORT)MU_PORT);
/* 加入多播组 */
m_mrMReq.imr_multiaddr.s_addr = inet_addr(MU_GROUP_IP); /* 多播组地址 */
m_mrMReq.imr_interface.s_addr = inet_addr(m_sLocalIP); /* 要使用的本地地址,需要与 绑定的地址相同*/
if(setsockopt(m_hSocket, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char FAR *)&m_mrMReq, sizeof(m_mrMReq)) < 0)
return FALSE;
/* 设置 TTL 值,与跨越的路由设备个数相关,一般不要设置太大 1-127 */
if(SetSockOpt(IP_MULTICAST_TTL, &m_nTTL, sizeof(int), IPPROTO_IP) == 0)
return FALSE; /* 设置 TTL 发生错误 */
return TRUE;
}
int CMulticast::SendData(int nIndex, int len)
{
if (nIndex == -1)
{ // 发送确认数据
return SendTo(&AckBuff, len, MU_PORT, MU_GROUP_IP);
}
if (nIndex >= SEND_BUFF_COUNT || nIndex < 0)
{
return 0;
}
return SendTo(&SendBuff[nIndex], len, MU_PORT, MU_GROUP_IP);
}
使用这个多播类,就想使用一般的UDP套接字一样。
发送数据 默认使用 索引为0的缓冲区
SPACKET * pak = &m_pMuSock->SendBuff[0];
int len = str.GetLength();
pak->used = 1;
pak->nType = MSG_TYPE_ONEUSER;
pak->nUnused = 0;
pak->time= CTime::GetCurrentTime().GetTime();
strncpy(pak->data, str, len);
pak->data[len] = 0;
pak->nUnused = inet_addr(*pStr);
m_pMuSock->SendData(i, len + PACKET_HEAD_SIZE +1);
接收数据 在 DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 中添加
LRESULT CTestDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: 在此添加专用代码和/或调用基类
SPACKET * pak;
CString * psIP;
switch(message)
{
case WM_MUC_RECEIVE_DATA:
pak = &m_pMuSock->ReveiveBuff[wParam];
psIP = (CString *)lParam;
case WM_MUC_RECEIVE_DATA:
pak = &m_pMuSock->ReveiveBuff[wParam];
psIP = (CString *)lParam;
if (pak->nType == MSG_TYPE_ALLUSER)
{
//处理消息
}
delete psIP;
pak->used = 0;
break;
}
龍月
2009-07-28
打赏
举报
回复
麻烦您百度一下:组播跨网段
可以搜出很多。。。
组播和广播都可以跨网段
北飞
2009-07-28
打赏
举报
回复
ly_longyue 大哥能再说详细点吗?谢谢
龍月
2009-07-28
打赏
举报
回复
使用多播实际上是使用知名地址和知名端口的通讯,所以这还可以在IP冲突严重的局域网中使用。因为一个组播组确定了唯一的一个MAC地址,所以无须ARP协议解析MAC地址。呵呵!
北飞
2009-07-28
打赏
举报
回复
那飞秋那种跨网段甚至可以说是穿越局域网的通信用的是您说的这种方式么?
macOS局域网
通信
解决方案:企业协作与
跨
平台兼容实践指南
局域网
通信
工具在现代办公环境中扮演着不可或缺的角色,尤其对于需要高效团队协作的企业而言。本文将全面介绍基于Qt框架开发的macOS
飞秋
客户端(feiq-mac),该工具完全兼容飞鸽传书协议,为企业用户提供稳定、高效的局域网消息传递和文件共享能力。通过功能模块解析、场景化应用指南、进阶配置技巧及问题排查方案,帮助用户充分发挥该工具在企业协作中的价值。 ## 一、启动与初始化 ### 环境部署流程
Mac
飞秋
完整指南:3步实现局域网高效通讯与文件传输
还在为Mac和Windows同事之间的文件传输而烦恼吗?每次都要用U盘或者微信传来传去,效率低下又麻烦?今天给大家推荐一款局域网通讯神器——Mac版
飞秋
客户端,让你在局域网内实现无缝通讯和极速文件传输! 作为Mac平台最佳的局域网通讯解决方案,
飞秋
完美解决了
跨
平台办公的痛点。无论是团队协作还是日常文件分享,这款工具都能让你的工作效率提升数倍。 ## 为什么Mac用户需要
飞秋
客户端? 传统的M
Mac用户如何打破局域网
通信
壁垒:
飞秋
Mac版完全指南
还在为Mac电脑无法与Windows同事顺畅
通信
而烦恼吗?
飞秋
Mac版正是解决这一痛点的开源工具。这款基于Qt框架开发的局域网聊天软件完全支持
飞秋
协议,让Mac用户也能无缝接入现有的局域网
通信
网络。无论你是办公室职员、学生还是家庭用户,这款开源工具都能满足你的日常
通信
需求。 --- ## 🚪 从零开始:搭建你的Mac
通信
工具 ### 环境准备与源码获取 首先确保你的Mac系统已安装必要的
3分钟快速上手:最轻量的Mac
飞秋
替代方案
还在为Mac上找不到好用的局域网
通信
工具而烦恼吗?**feiq-mac** 是基于Qt开发的
跨
平台局域网
通信
工具,完美兼容飞鸽传书协议,让你在macOS上也能享受流畅的局域网聊天体验!🚀 ## ✨ 快速上手 ### 环境准备与安装 首先确保你的Mac已安装Qt开发环境,然后通过以下命令获取项目源码: ```bash git clone https://gitcode.com/gh_mirr
飞秋
Mac版:3步实现Mac与Windows
跨
平台局域网
通信
飞秋
Mac版是基于Qt框架开发的开源局域网
通信
工具,专为Mac用户设计,完美兼容Windows版
飞秋
协议。这款工具解决了Mac与Windows设备在局域网内高效
通信
的痛点,支持文本聊天、文件传输、表情发送等核心功能,让
跨
平台协作变得简单顺畅。 ## 🚀 为什么选择
飞秋
Mac版? 在办公环境中,Mac与Windows设备共存的情况非常普遍。传统的
通信
方式往往存在兼容性问题,而
飞秋
Mac版提供了
通信技术
4,397
社区成员
28,909
社区内容
发帖
与我相关
我的任务
通信技术
通信技术相关讨论
复制链接
扫一扫
分享
社区描述
通信技术相关讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章