社区
网络编程
帖子详情
弱问ARP .100分
GR
2004-01-19 07:41:48
小弟刚接触网络不久,有一问题始终搞不清楚,就是发送一个包的时候,第一步发出去的包是不是要先知道对方的MAC地址才行,
也就是不管发什么包,首先要来一个广播知道一个MAC地址才行/?。
那么知道了这个MAC地址。后续的包又是怎么持续的能知道要发送到这个地址?,是通过ARP缓存么?还是通过什么?,
请指点一下,万分感谢。
...全文
29
3
打赏
收藏
弱问ARP .100分
小弟刚接触网络不久,有一问题始终搞不清楚,就是发送一个包的时候,第一步发出去的包是不是要先知道对方的MAC地址才行, 也就是不管发什么包,首先要来一个广播知道一个MAC地址才行/?。 那么知道了这个MAC地址。后续的包又是怎么持续的能知道要发送到这个地址?,是通过ARP缓存么?还是通过什么?, 请指点一下,万分感谢。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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);
}
...
}
tipedia:非官方TiDB百科,目标收录所有TiDB开发维护使用过程中可能会碰到的概念配置项其他等等
Tipedia 这是什么 这是一个非官方的TiDB相关概念的百科,目标收录所有TiDB开发/维护/使用过程中可能会碰到的概念/配置项/其他等等。 为什么会有这个东西 在工作中,无论是读代码,审阅设计文档,看事故复盘,查监控还是参与他人讨论,我们都会常常碰到我们不甚了解的概念: (以下内容收集自企业微信) 修改什么? DM是什么的简称呀。 这个schrodinger_test是啥? (以下内容收集自Slack) 请
问
这个hot_peer是做什么用的呀? ndv是啥呀? 抱歉,术语“修改交易”是否意味着交易会更改表/数据库的元数据? (以下内容收集自google doc) unique filter的含义是什么,搜了下文档没搜到。 下面两个是来搞笑的。就算是搞笑的也很有价值! (搜集自微信)
弱
问
413是什么 不知道渡渡鸟是什么 这些
问
题的人中许多都是经验丰富的优秀工程师,就
python如何停止子线程_
弱
问
python的
问
题.怎么终止一个子线程
展开全部等待串口数据导致线程自己sleep而没有机会执行,主线程的join没法继续,方法就是这样32313133353236313431303231363533e4b893e5b19e31333361323564的,换成这个能执行from threading import *import timeclass MyThread(Thread):def run (self):self.ifdo = T...
php 不恒等,Re:
弱
问
:Latex里不恒等号(三横一撇) - 精华区 - 数学科学学院(SMS)版 - 北大未名BBS...
发信人:vonNeumann(YP04->DSEC@SMS|冯·诺伊曼),信区:SMS标题:Re:
弱
问
:Latex里不恒等号(三横一撇)怎么打?发信站:北大未名站(2007年05月28日15:10:34星期一),转信\usepackage{txfonts}\nequiv或\usepackage{amssymb}\not\equivmondist (猫を被る。。ブイブ...
matlab 中插入附录,
弱
问
一个在Latex论文模版附录插入Matlab代码的
问
题 - 数学工具(MathTools)版 - 北大未名BBS...
用裸ctexbook文档类编译试试?那样还有
问
题的话,就可以直接找@cauchy了。\documentclass[UTF8]{ctexbook} % 或 GBK,取决于 build_tree.m 的字符编码。\usepackage{fancyvrb}\begin{document}\VerbatimInput[...]{...} % 这个命令按原先文件里的样子抄上去。\end{docume...
弱
问
JSP中的<%= %>和${ }到底有什么区别?
弱
问
JSP中的和${ }到底有什么区别? 2011-11-03 11:11匿名 | 浏览 0 次
分
享到: 2011-11-03 11:33 提
问
者采纳 只能得到当前面定义的值 即你在这个页里有
100
%> 你在下面才可以使用 ${ }这个是el表达式 可以从上下文中得到值 具体你可以看一下 http://apps.h
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章