社区
网络编程
帖子详情
弱问ARP .100分
GR
2004-01-19 07:41:48
小弟刚接触网络不久,有一问题始终搞不清楚,就是发送一个包的时候,第一步发出去的包是不是要先知道对方的MAC地址才行,
也就是不管发什么包,首先要来一个广播知道一个MAC地址才行/?。
那么知道了这个MAC地址。后续的包又是怎么持续的能知道要发送到这个地址?,是通过ARP缓存么?还是通过什么?,
请指点一下,万分感谢。
...全文
32
3
打赏
收藏
弱问ARP .100分
小弟刚接触网络不久,有一问题始终搞不清楚,就是发送一个包的时候,第一步发出去的包是不是要先知道对方的MAC地址才行, 也就是不管发什么包,首先要来一个广播知道一个MAC地址才行/?。 那么知道了这个MAC地址。后续的包又是怎么持续的能知道要发送到这个地址?,是通过ARP缓存么?还是通过什么?, 请指点一下,万分感谢。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
3 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
GR
2004-01-19
打赏
举报
回复
多谢多谢,
刚刚又仔细看了一下封装格式,终于解了疑惑,感激
peral
2004-01-19
打赏
举报
回复
其实楼主的想法基本是正确的。
发包的处理过程如下:
1 根据目标IP地址检查路由表(命令行下用route print查看),如果在同一LAN内,
那么检查ARP的缓存信息,(命令行下用arp -a可以看到)
如果缓存里没有,那么会使用ARP广播来查找。
2 如果目标IP不在LAN内,那么将包发往网关,网关的IP地址可以根据路由表获得,
大部分情况下即为TCP/IP设置中的缺省网关IP。然后类似1中,根据此IP查找网关的MAC地址。
注意发出包的目标IP还是原来的,不会被改成网关IP
这些工作都是TCPIP驱动层的工作,winsock编程不需要考虑这些问题
yintongshun
2004-01-19
打赏
举报
回复
利用WinSock进行无连接的通信UDP(用户数据报协议):
通过UDP协议我们可以向指定IP地址的主机发送数据,同时也可以从指定IP地址的主机接收数据,发送和接收方处于相同的地位没有主次之分。利用CSocket操纵无连接的数据发送很简单,首先生成一个本地套接口(需要指明SOCK_DGRAM标记),然后利用
int CAsyncSocket::SendTo( const void* lpBuf, int nBufLen, UINT nHostPort, LPCTSTR lpszHostAddress = NULL, int nFlags = 0 )发送数据,
int CAsyncSocket::ReceiveFrom( void* lpBuf, int nBufLen, CString& rSocketAddress, UINT& rSocketPort, int nFlags = 0 )接收数据。
利用UDP协议发送和接收都可以是双向的,就是说任何一个主机都可以发送和接收数据。但是UDP协议是无连接的,所以发送的数据不一定能被接收,此外接收的顺序也有可能与发送顺序不一致。
下面的代码演示了如何建立连接和发送/接收数据:/*
发送方在端口6800上向接收方端口6801发送数据
*/
//发送方代码:
BOOL CMy62_s1_clientDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//创建本地套接口
m_sockSend.Create(6800,SOCK_DGRAM,NULL);
//绑定本地套接口
m_sockSend.Bind(6800,"127.0.0.1");
//创建一个定时器定时发送
SetTimer(1,3000,NULL);
...
}
void CMy62_s1_clientDlg::OnTimer(UINT nIDEvent)
{
static iIndex=0;
char szSend[20];
sprintf(szSend,"%010d",iIndex++);
//发送UDP数据
int iSend= m_sockSend.SendTo(szSend,10,6801,"127.0.0.1",0);
TRACE("sent %d byte\n",iSend);
...
}
//接收方代码
BOOL CMy62_s1_serverDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//创建本地套接口
m_sockRecv.Create(6801,SOCK_DGRAM,"127.0.0.1");
//绑定本地套接口
m_sockRecv.Bind(6801,"127.0.0.1");
//创建一个定时器定时读取
SetTimer(1,3000,NULL);
...
}
void CMy62_s1_serverDlg::OnTimer(UINT nIDEvent)
{
char szRecv[20];
CString szIP("127.0.0.1");
UINT uPort=6800;
//接收UDP数据
int iRecv =m_sockRecv.ReceiveFrom(szRecv,10,szIP,uPort,0);
TRACE("received %d byte\n",iRecv);
...
}
/*
接收方采用同步读取数据的方式,所以没有读到数据函数调用将不会返回
*/
利用WinSock进行有连接的通信TCP(传输控制协议):
通过TCP协议我们可以与指定IP地址的主机建立,同时利用建立的连接可以双向的交换数据。利用CSocket操纵有连接数据交换很简单,但是在有连接的通信中必需有一方扮演服务器的角色等待另一方(客户方)的连接请求,所以服务器方需要建立一个监听套接口,然后在此套接口上等待连接。当连接建立后会产生一个新的套接口用于通信。而客户方在创建套接口后只需要简单的调用连接函数就可以创建连接。对于有连接的通信不论是数据的发送还是发送与接收的顺序都是有保证的。
下面的代码演示了如何建立连接和发送/接收数据:
/*
服务器方在端口6802上等待连接,当连接建立后关闭监听套接口
客户方向服务器端口6802发起连接请求
*/
BOOL CMy63_s1_serverDlg::OnInitDialog()
{
CDialog::OnInitDialog();
CSocket sockListen;
//创建本地套接口
sockListen.Create(6802,SOCK_STREAM,"127.0.0.1");
//绑定参数
sockListen.Bind(6802,"127.0.0.1");
sockListen.Listen(5);
//等待连接请求,m_sockSend为成员变量,用于通信
sockListen.Accept(m_sockSend);
//关闭监听套接口
sockListen.Close();
//启动定时器,定时发送数据
SetTimer(1,3000,NULL);
...
}
void CMy63_s1_serverDlg::OnTimer(UINT nIDEvent)
{
static iIndex=0;
char szSend[20];
sprintf(szSend,"%010d",iIndex++);
//发送TCP数据
int iSend= m_sockSend.Send(szSend,10,0);
...
}
BOOL CMy63_s1_clientDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//创建本地套接口
m_sockRecv.Create();
//发起连接请求
BOOL fC=m_sockRecv.Connect("127.0.0.1",6802);
TRACE("connect is %s\n",(fC)?"OK":"Error");
//启动定时器,定时接收数据
SetTimer(1,3000,NULL);
...
}
void CMy63_s1_clientDlg::OnTimer(UINT nIDEvent)
{
char szRecv[20];
//接收TCP数据
int iRecv =m_sockRecv.Receive(szRecv,10,0);
TRACE("received %d byte\n",iRecv);
if(iRecv>=0)
{
szRecv[iRecv]='\0';
m_szRecv=szRecv;
UpdateData(FALSE);
}
...
}
java开发速成班培训课程(11)
[url=http://www.buildapp.net/java/show.asp?id=21800]能用JAVA代替VB编写一个宏并在MapInfo中运行吗[/url] [url=http://www.buildapp.net/java/show.asp?id=21799]jcreator中怎么引入自制包啊[/url] [url=http://www.buildapp.n...
基于springboot+vue+mysql电商平台的设计与实现(源码+论文+开题报告).rar
采用前后端
分
离架构,包含数据库文件,代码经过完整测试,保证可以运行,内部包含详细的运行说明文档,如遇运行
问
题可私信博主。 本项目主要面向计算机相关专业中正在筹备大作业、毕业设计的学生,以及渴望通过实战项目提升编码能力的自学者,系统难度设计贴合教学需求,功能模块覆盖全栈开发核心知识点,所有代码与文档均经测试审核,学习者可放心下载参考或直接用于课程实践。
基于JavaEE JSF XML 导航规则配置源码.zip
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目
问
题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、本项目仅用作交流学习参考,请切勿用于商业用途。
实验一图像文件的读取项目文件+报告
实验一图像文件的读取项目文件+报告
Android自定义Button控件实现不同背景图片设置方法
资源下载链接为: https://pan.quark.cn/s/f989b9092fc5 在Android开发中,为了满足特定的设计需求或功能扩展,我们常常需要对系统控件进行自定义。本文将介绍如何自定义一个Button控件,并为其设置不同的背景图片,涉及自定义控件的基本原理和布局管理。 首先,创建一个继承自Button的自定义类MyButton。通过继承,我们可以保留Button原有的功能,并在此基础上添加自定义特性。在MyButton类中,重写构造函数以正确处理属性初始化,并添加成员变量存储文本、位置信息和背景图片ID。 为了实现背景图片切换,添加onSetText和onSetBmp方法。onSetText用于设置按钮文本及其位置和样式,onSetBmp用于设置按钮按下和松开状态的背景图片ID。 接着,重写onDraw方法以显示自定义文本,并重写onTouchEvent方法,在用户按下或松开按钮时切换背景图片。
网络编程
18,363
社区成员
64,187
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章