【急】raw socket编程---各位大侠帮忙!!
1、机器有多个IP地址,怎么进行绑定(bind函数)
2、bind函数之后,使用recvfrom函数会不会收不到数据包?绑定之后是不是就只能用listen函数监听本机IP的某个端口的数据包?
3、我发的数据包(UDP\ICMP),如果填写的IP地址不是本机的,
要注意什么问题才能让自己的数据包好好的发给对方
(我发了很多个数据包出去,但是接收端一个都没有收到,怀疑是被丢弃了)
4、如果客户端没有IP可以建立TCP连接 发TCP数据包吗?
5、我怎样做 才能只收到我想收到的某源IP发送过来的数据包----除了接收到数据包,自己对该包的IP数据进行判断
[解决办法]
1,没必要,因为你应该不懂一张网卡对你意味着什么,所以让内核自动帮你选择出口。(原理方面,你需要深刻认识 默认网关/子网/拓扑 等知识)
2,原理同1,bind在一张网卡,只会收到这张网卡到来的数据。
3,你伪装IP了,对端当然是回包到你伪装的IP,除非你在同一个子网内在链路层抓包,否则是接受不到包的。
4,没IP不行。
5,说在最后,请使用libpcap抓包,libnet发包,libpcap支持filter,你的需求都是很基础的需求,这些开发本身也不应该那么复杂,借助第三方库是明智的选择,自己手写是愚蠢且垃圾的。
[解决办法]
1. bind 的时候要传一个地址参数进去, 你可以指定绑定某个 IP 或绑定所有的 IP.
2. recvfrom 是 UDP 协议的, bind 是 TCP 协议的, 他们用于不同的 socket 上, 在创建 socket 的时候就指明了 socket 类型了, 后面混着用的话应该是不行的. bind 后一样可以不 listen 而去 connect 的.
3. 看是被本地的操作系统丢弃了还是被中间的路由器丢弃的?
4. 不行
5. 设置防火墙, 只接受某个 IP 的连接就好了.
[解决办法]
1.
GetAdaptersInfo
The GetAdaptersInfo function retrieves adapter information for the local computer.
DWORD GetAdaptersInfo(
PIP_ADAPTER_INFO pAdapterInfo, // buffer to receive data
PULONG pOutBufLen // size of data returned
);
2.对收到的数据包检测其源IP,端口
3.这些基本的自己去看看吧。。
[解决办法]
1. 可以使用 ioctl 函数的 SIOCGIFADDR 选项来获得本机的 IP. 不过如果是要绑定所有的 IP 的话, 把地址设置成 INADDR_ANY 就行.
2. 我错了, UDP 协议的 socket 也可以 bind.
3. 注意下校验和看
[解决办法]
如果没有指定发送端使用那个 IP 的话, 它应该会根据目的 IP 地址和路由表来决定把.
[解决办法]