`

原始套接字接收时犯的一个错误

阅读更多
if ( (nread = recvfrom( fd, ptr, nleft, 0, (sockaddr*)&m_addrSourceIp,
				                    &sizeSock) ) < 0)




int CSynScan::CheckSyn(const char* _buffPackage)
{
	assert( _buffPackage!=NULL);

	cout<<"pTcp->tcp_flags:"<<pTcp->tcp_flags<<endl;
	cout<<"pTcp->acknowledgement:"<<ntohl(pTcp->tcp_acknowledgement)<<endl;
  cout<<"pTcp->ack:"<<ntohl(pTcp->tcp_ack)<<endl;


这就是我的接收语句和处理过程,一开始,我总是接收到不是我所期待的值。又很仔细的将程序检查了一遍,用tcpdump抓包(包收发均正常)逐个排查后,对sockaddr_in这个结构体起了疑心。可是又一时说不出问题在哪儿。 后来我自己问了自己一个问题, 套接字怎么知道在哪个端口接哪个数据?TCP上,服务端可以bind,客户端connect。UDP上,sendto有个sockaddr_in结构体参数,指示它进行发送,recvfrom的sockaddr_in结构存储了收到时的对方主机地址参数等。 等等,我似乎遗漏了什么,recvfrom依据什么来让套接字明白从哪个端口接收? bind?对,就是它,recvfrom需要一个bind。原始套接字能否进行bind还得实验下,但是在扫描程序里,套接字通常不去绑定一个端口进行发送,而是随机的指定,这样才能加快扫描的速度。。。
    恩,既然这样,那么在没有bind的情况下,recvfrom似乎是接到了所有进程的数据。那么我又在处理程序里加上了这句

	if( (ntohl(pTcp->tcp_ack)!=SEQ_TCP+1) )
		{
			cout<<"xx"<<endl;
		 return -1;	
		}


OK.搞定。那么recv程序根据是否接到正确的包进行重复的接收,直接收到正确的包。如果超时,你还可以设定个标志,如果N秒内没有改变它,就判定它超时吧 ^_^
分享到:
评论

相关推荐

    基于winsock原始套接字的IP数据包的捕获与解析

    原始套接字提供了一个接口,允许我们捕获所有经过网络接口的数据包,无论是入方向还是出方向。我们可以使用Winsock的`WSASocket`函数创建一个原始套接字,然后使用`recv`函数捕获数据包。 IP数据包解析 在捕获到IP...

    原始套接字

    原始套接字是一种特殊的网络套接字,允许用户直接处理IP协议数据包,而不经过标准的传输层协议如TCP或UDP封装。这种套接字在Linux操作系统中广泛应用于网络编程和管理,尤其适用于需要直接操纵网络层数据的应用程序...

    windows原始套接字抓包

    2. 创建原始套接字:使用`socket`函数创建一个原始套接字,指定地址家族和套接字类型为SOCK_RAW。 3. 绑定套接字:通过`bind`函数将套接字与特定的IP地址和端口绑定,通常设置为INADDR_ANY以监听所有网络接口。 4. ...

    原始套接字数据包转发

    在上述代码中,我们创建了一个原始套接字并绑定到本地地址和端口,然后进入一个无限循环,不断接收数据包,解析它们,然后将接收到的数据包原封不动地转发到指定的目标地址和端口。 **注意事项和安全问题:** 1. **...

    原始套接字发送iCMP自定义头部版本

    原始套接字(Raw Socket)是网络编程中的一个重要概念,它允许程序员直接操作TCP/IP协议栈,而不必受限于标准的TCP、UDP等高层协议。在这个主题中,“原始套接字发送iCMP自定义头部版本”指的是利用原始套接字来创建...

    用原始套接字结合fstream的vc文件传输程序

    通过以上分析,我们可以看到这个"用原始套接字结合fstream的vc文件传输程序"是一个涵盖网络编程、文件操作、错误处理等多个方面的学习实例,对于提升开发者技能和理解网络通信有极大的帮助。在实践中不断调整和优化...

    原始套接字实现ping

    1. **创建原始套接字**:在Python中,我们可以使用socket.socket()函数创建一个原始套接字,指定socket.AF_INET和socket.SOCK_RAW作为参数,表示使用IPv4协议并直接操作原始数据包。 2. **设置套接字选项**:由于...

    Qt套接字编程源码

    3. **源码分析**:在Qt套接字源码中,可以看到QTcpSocket和QTcpServer的实现细节,包括错误处理、连接状态管理、数据读写等。源码中的信号和槽机制是关键,它们帮助我们跟踪连接的生命周期,并在合适的时间进行数据...

    Linux下基于原始套接字的嗅探器

    本篇将详细讲解如何使用C++和Linux系统来创建一个基于原始套接字的嗅探器,用于捕获包括ARP、RARP、TCP和UDP在内的基本数据包。 首先,了解原始套接字的基本概念。在Linux中,原始套接字允许程序绕过传输层,直接与...

    第5讲 数据报套接字编程与原始套接字编程.pdf

    ### 数据报套接字编程与原始套接字编程 #### 一、概述 在计算机网络领域,套接字(Socket)编程是一种重要的技术手段,它为应用程序提供了与网络进行交互的能力。套接字按照不同的标准可以分为多种类型,其中数据报...

    利用原始套接字实现PING功能的源代码(13kb)

    标题中的“利用原始套接字实现PING功能的源代码”是指使用计算机网络编程中的原始套接字(Raw Sockets)来构建一个简单的网络诊断工具,类似于操作系统内置的PING命令。这个工具可以用来测试网络连通性,测量数据包...

    linux 原始套接字 编程

    在Linux操作系统中,原始套接字(Raw Sockets)是一种特殊的网络编程接口,它允许程序员直接操作网络协议栈,而不受TCP/IP协议栈的限制。原始套接字提供了对底层网络协议的直接访问,可以用来构造自定义的网络数据包...

    原始套接字的sniff

    当创建一个原始套接字时,它不会自动应用任何特定的传输层协议,这与TCP或UDP套接字不同。通过使用原始套接字,你可以指定所需的网络协议,比如IP或者ARP,从而接收或发送特定类型的数据包。 使用原始套接字进行...

    linux_sock_raw原始套接字编程

    以上代码创建了一个原始套接字,并将其绑定到指定网卡(例如"eth0"),以接收所有类型的数据帧。 原始套接字编程提供了对网络通信的深度控制,但同时也需要对网络协议和操作系统内核的工作机制有深入理解,以正确...

    05-原始套接字05-原始套接字

    - **定义**: 原始套接字实现了系统核心级别的接口,使得应用程序可以直接发送或接收未经协议栈处理的数据包。 - **权限要求**: 因为其强大的功能可能带来安全风险,创建原始套接字的程序必须具备超级用户权限(sudo...

    Java套接字编程

    当两个网络应用程序需要进行通信时,会首先建立一个流套接字连接,这一过程类似于电话呼叫,只有当接收方准备好接收时,连接才能建立。 在客户端-服务器架构中,客户端创建包含服务器IP地址和端口号的流套接字,...

    套接字编程学习套接字编程学习

    `accept`函数用于接收新连接,返回一个新的套接字句柄,用于与客户端的通信。这个新的套接字将在处理完客户端请求后关闭,而原始侦听套接字将继续等待新的连接。 在实际应用中,服务器端还需要实现一个循环来持续...

    linux_sock_raw.rar_RAW_linux sock raw_原始套接字

    2. **自定义协议**:如果需要实现一个不基于现有协议的自定义网络通信协议,原始套接字是理想选择。 3. **网络攻击检测**:通过监控网络流量,原始套接字可以帮助检测并防止DoS攻击或其他恶意行为。 七、注意事项 ...

    网络套接字实例20个

    1. **创建套接字**:使用`socket()`函数创建一个套接字,指定协议类型(如TCP或UDP)、地址家族(如IPv4或IPv6)和套接字类型(如流式套接字或数据报套接字)。 2. **绑定**:通过`bind()`函数将套接字与特定的IP...

    用套接字实现ping

    3. **绑定IP和端口**:虽然ping通常不需要绑定特定的IP和端口,但在某些系统中,创建原始套接字可能需要指定一个本地端口。 4. **构建ICMP请求报文**:ICMP回显请求由一个8字节的头部和可变长度的数据部分组成。...

Global site tag (gtag.js) - Google Analytics