网络编程开源技术
文章平均质量分 79
介绍网络编程中的开源库,winpcap,libpcap,PF_RING,及socket编程的相关技术;winpcap是windows下的数据包捕获开源库,libpcap是linux下的数据包捕获开源库,PF_RING是一个优化的数据包接收库,socket是通用的网络编程技术。
smilestone322
通过软考: 系统架构设计师和信息系统项目管理师考试
工业相机和DVR开发,熟悉windows驱动开发,camera sdk开发,3D摄像头sdk开发。
联系方式:smilestone322@sina.com
展开
-
socket的常见问题---《六》
1) 在线程中碰到socket阻塞怎么办?比如socket服务器accept阻塞了,造成线程不能顺利退出?解决办法通过socket的KeepAlive机制; 2) 如何检测socket连接是否断开或异常?1)通过心跳机制; 2)KeepAlive机制; 3)Socket 常用的属性SO_REUSEADDR:1、 当有一个有相同本地地址原创 2013-03-21 22:38:12 · 1624 阅读 · 4 评论 -
socket常见问题---《伍》
1)客户端处在FIN_WAIT_1状态,服务器处在SYN_RECV状态;这个问题也是我最近在实际中碰到的问题,socket连接和断开流程已经前面的几节中讲到了,大家可以参考前面的内容;怎么出现这样的问题呢?原因是客户端连接服务器,但是服务器限制了客户端的接入数,它只listen没有accept动作,造成客户端每次connect是成功的,但是连接就是建立不起来,客户端又做了,原创 2013-03-21 22:37:07 · 1370 阅读 · 0 评论 -
socket常见问题----《四》
1) 服务器处在SYN_RECV,造成客户端在也连入不了服务端;原因是:没有收到客户端的Ack,客户端支持可能已经显示时Established 状态,但这个状态也只是一瞬间,马上会断开;B收到连接释放报文段后就立即发送确认,然后就进入close-wait状态,此时TCP服务器进程就通知高层应用进程,因而从A到B的连接就释放了。此时是“半关闭”状态。即A不可以发送原创 2013-03-21 22:31:16 · 1423 阅读 · 0 评论 -
socket常见问题---《三》
1) 如何让socket不进入Time_Wait状态在高并发短连接的server端,当server处理完client的请求后立刻closesocket此时会出现time_wait状态然后如果client再并发2000个连接,此时部分连接就连接不上了,用linger强制关闭可以解决此问题,但是linger会导致数据丢失,linger值为0时是强制关闭,无论并发多少多能正常连接上,如果非0会发原创 2013-03-21 22:26:45 · 1288 阅读 · 0 评论 -
socket编程中常见问题--《二》
1) socket 客户端 FIN_WAIT_2,而设备端显示CloseWait这个原因是服务器端没有及时CloseSocket;下面讲解下socket的断开流程:TCP报文段首部格式:序号:本报文段所发送的数据的第一个字节的序号。确认号ack:期待收到对方下一个报文段的第一个数据字节的序号确认ACK:占1位,仅当ACK=1时,确认号字段原创 2013-03-21 22:25:32 · 1578 阅读 · 0 评论 -
socket编程中常见问题--《一》
1) 在socket有自动重连机制的时候,如果在一个线程中实现socket错误或断线自动重连时,注意将socket设置为非阻塞的,不然当程序退出时,线程可能阻塞在connect函数,造成程序不能及时退出; 原理上是这样的:1.建立socket2.将该socket设置为非阻塞模式3.调用connect()4.使用select()检查该socket描述符是否可写(注意,是可写)原创 2013-02-28 21:04:18 · 2153 阅读 · 1 评论 -
socket 客户端在什么情况下需要bind
常规情况下:服务器的socket描述府一定需要绑定 把特定的地址和端口号绑定到服务器socket描述符上,不过客户端的socket一般不需要绑定,因为一般c/s通讯过程都是服务器端侦听 客户端连接,所以客户端连接的时候必须知道服务器的地址,连接上 ,也就可以通讯,所以没有必要绑定客户端的地址。但是客户端连接的地址必须是服务器的地址和端口。至于服务器accept 以后 返回的是新的描述符 ,原创 2012-12-28 22:26:05 · 4707 阅读 · 3 评论 -
socket tcp与udp的区别
socket tcp连接常规流程:服务器端:socket-->bind-->listen-->accept->recv(send)-->closesocket客户端:sokcet->connect->send(recv)-->closesocket可以参考:http://atu82.bokee.com/4667655.htmlUdp socket 常规流程原创 2012-12-28 22:24:41 · 1497 阅读 · 0 评论 -
socket 服务器端编程常见问题
1)当一个客户端sokcet长时间不发送数据时,服务器端如何将这个sokcet 踢掉,即closesocket;2)socket KeepAlive 机制超时时,select会返回什么状态, Select中的该sokcet能用recv读到什么东西?3)如何踢掉非法的攻击,即只连接服务器,不发送数据,造成服务器端的socket耗尽;4)如何判断客户端发送的是非法数据,尽早的过滤掉非法数据原创 2012-09-13 19:34:41 · 1548 阅读 · 1 评论 -
如何解决socket TIME_WAIT 资源耗尽问题
如何解决socket TIME_WAIT 资源耗尽问题,其实socket TIME_Wait是断开连接的必经阶段,默认是2倍MSL时间 如何让socket不进入Time_Wait状态在高并发短连接的server端,当server处理完client的请求后立刻closesocket此时会出现time_wait状态然后如果client再并发2000个连接,此时部分连接就连接不上了,用lin原创 2012-09-08 09:07:11 · 3860 阅读 · 1 评论 -
socket 设备自动重启/断电 recv send阻塞的解决办法
socket 设备自动重启/断电 recv send阻塞的解决办法 (1)使用socket的KeepAlive机制,当突然断电后,recv函数阻塞超时退出,不会造成程序死锁,或者程序一直阻塞在recv函数的问题,方法如下: // BOOL bKeepAlive = TRUE; nRet=setsockopt(listen_sock, SOL_SOCKET, SO_KEEP原创 2012-08-13 18:50:20 · 2608 阅读 · 0 评论 -
socket server select模型值得注意的地方
1)多个客户端连接socket服务器,怎么区分是哪个客户端连接的,换句话说,socket 怎么和客户端的ip一一对应?SOCKADDR_IN clientAddr; int socketLen = sizeof(SOCKADDR_IN); m_pListenSocket->Accept(*pClient,(SOCKADDR*)&clientAddr, &socketLen); un原创 2012-07-13 11:09:26 · 1153 阅读 · 0 评论 -
windows 下socket recv 阻塞接收速度慢--send 阻塞发送慢
socket recv 阻塞速度很慢,mjpeg码流,jpeg一帧数据大约100k,但是接收时间需要93ms左右,有没有大侠知道怎么优化recv的接收的,指点下,电脑配置,cpu 2.6 奔腾双核,2G内存。 解决办法: 发现recv阻塞了,没有数据到来,在recv前使用select,后,recv 接收就不耗时间了。原创 2012-06-23 18:39:25 · 5370 阅读 · 0 评论 -
多网卡或存在虚拟机的情况,socket广播包发送会出现问题
socket绑定时,不知绑定到那个网卡,然后发送广播包后,如果设备端只针对这个网卡的广播包进行回复,回复包收不到,造成设备找不到。 现象:有时包发送到了不是连接我们设备的那个网卡,有时根本就没有发送广播包,从代码上看sendto函数的返回值是对的,但是使用wireshark就抓不到他的包! 定位:windows socket 广播包时,如果要往多个网卡发送广播包,必须依次对各个网卡原创 2012-06-03 21:12:57 · 3714 阅读 · 2 评论 -
数据包的读写---(九)
数据包的读写包括从网卡中读取数据包到内核及从内核将数据包传递到用户空间,越分析到下面,就越底层了,上面已经分析了PF_RING内核补丁的大部分内容了,做完上面的工作之后,就可以读取数据包了。有时间我会以intel e1000e-1.2.17的驱动为例进行讲解,网卡驱动是怎样将数据包导入到内核的。因为在PF_RING的初始化中,注册了prot_hook。其func指针指向packet_rcv函数原创 2012-12-29 21:37:56 · 2430 阅读 · 1 评论 -
mmap内存映射---(八)
在应用空间采用mmap进行内存映射时,内核调用的是ring_mmap函数;例如:我们在前面讲解时,讲解了pfring_open_consumer函数,这个函数里面调用mmap如下: ring->buffer = (char *)mmap(NULL,memSlotsLen,PROT_READ|PROT_WRITE, MAP_原创 2012-12-29 21:36:41 · 2001 阅读 · 0 评论 -
绑定和分配mmap内核空间(bind_ring)--(七)
用户态在创建了套接字后,接下来就调用bind函数,绑定套接字,而PF_RING实际做的就是为RING分配相应的空间。也就是说,一个套接字,都有一个与之对应的RING。在前面我们已经提到 sock->ops = &ring_ops;这样当应用空间调用bind函数中,内核调用ring_bind函数;即当系统调用bind触发时,内核ring_bind函数就触发了。下面讲解ring_bind函数;/原创 2012-12-29 21:35:56 · 1758 阅读 · 0 评论 -
socket的创建(六)
Socket的创建函数,在PF_RING,创建sokcet的函数为ring_create,当pfring.c中通过sokcet函数建立socket时,内核调用的ring_create函数,ring_create源码如下:staticint ring_create(#if(LINUX_VERSION_CODE>= KERNEL_VERSION(2,6,24))原创 2012-12-29 21:30:19 · 1988 阅读 · 1 评论 -
PF_RING模块初始化(五)
Linux2.6的内核后对模块机制更加重视了,因为模块可以很方便的添加到内核,也可以很方便的从内核移除,对于驱动程序来说是一个很方便的事情,当需要该模块的时候采用insmod插入到内核,不需要时可以采用rmmod从内核很方便的删除,这样可以避免内核由于外设驱动程序的增多还不断庞大,linux和windows的一个区别就是linux的内核和应用程序是可以定制的,这样用户可以根据自己的需要进行配置,减原创 2012-12-29 21:28:40 · 2660 阅读 · 0 评论 -
PF_RING 内核源码(四)
终于开始讲解内核了,唉,长舒一口气,libpcap+pfring都讲解了40页,PF_RING就更难了。原创 2012-12-29 21:26:51 · 2594 阅读 · 0 评论 -
libpcap接收数据包(三)
本文以应用程序的api调用为主线,分析libpcap和pfring源码,当然还有内核PF_RING的源码在以后也会分析,以后可能我会分析从网卡驱动一直分析到应用层,争取把这些都讲清楚。Linux开源就是好,呵呵,闲话少说,继续分析,首先分析pcap_next函数吧,搞过winpcap的都知道这个是数据包的函数,一次只读一个数据包。constu_char * pcap_next(pcap_t *原创 2012-12-29 21:25:49 · 3187 阅读 · 0 评论 -
libpcap和pfring应用程序--Pcap_open_live(二)
首先以libpcap为主线,先通过pcap_open_live函数,做一些初始化的操作,比如打开网卡,设置好读取数据包的回调函数等等,然后就可以通过pcap_next,pcap_next_ex,pcap_dispatch,pcap_loop来捕获数据包了。本文的主要宗旨是分析源码,从应用层的libpcap,pfring一直分析到内核的PF_RING,通过对源码的讲解,使得我们深入的理解PF_RIN原创 2012-12-29 21:22:08 · 18563 阅读 · 1 评论 -
libpcap+PF_RING源码分析---前言(一)
Libpcap是linux下用来捕获数据包的抓包库,它主要是基于socket的,和winpcap的本质的不同是,winpcap是和tcp/ip协议同层的,而libpcap是应用层的库,在tcp/ip层上对socket的又一次封装,所以从网卡得到的数据包需要经过多次拷贝才能达到应用程序,在千兆网的条件下,捕获包的性能较差,为了提高libpcap的包捕获性能,采用PF_RING对libpcap进行改进原创 2012-12-29 21:17:17 · 4770 阅读 · 2 评论 -
winpcap 在win7 64位上广播 以太网数据包,当存在虚拟机或无线网卡(wifi)时存在问题;
使用winpcap做局域网的设备查找功能,当原创 2014-07-11 14:39:43 · 2416 阅读 · 0 评论 -
庖丁解牛—winpcap源码彻底解密系列续集(13)
如何从网卡读取数据包:Winpcap从网卡获取数据是从NPF_tap开始,NPF_tap是一个回调函数,当网卡有数据包到来时,NDis调用该函数接收数据包,该函数中首先进行了过滤,源码如下;NDIS_STATUS NPF_tap (IN NDIS_HANDLE ProtocolBindingContext,IN NDIS_HANDLE MacReceiveContext,IN PVOID原创 2011-10-31 15:11:21 · 1932 阅读 · 1 评论 -
庖丁解牛—winpcap源码彻底解密续 (12)
应用程序如何和内核驱动交互Event;/*! \brief Allocates the read event associated with the capture instance, passes it down to the kernel driver and stores it in an _ADAPTER structure. \param AdapterObjec原创 2011-10-29 16:35:41 · 2011 阅读 · 0 评论 -
庖丁解牛—winpcap源码彻底解密系列续集(11)
庖丁解牛—winpcap源码彻底解密系列续集(11)如何发送数据包:源码解析;int pcap_sendpacket(pcap_t * p, u_char * buf, int size原创 2011-10-28 15:45:32 · 2160 阅读 · 0 评论 -
庖丁解牛---winpcap源码彻底解密系列续集(10)
设置读超时: PacketSetReadTimeout(p->adapter, p->md.timeout);BOOLEAN PacketSetReadTimeout(LPADAPTER AdapterObject,int timeout){ BOOLEAN Result; TRACE_ENTER("PacketSetReadTimeout原创 2011-10-27 19:48:44 · 2857 阅读 · 5 评论 -
庖丁解牛—winpcap源码彻底解密系列续集(9)
设置用户缓冲区:pcap_setuserbuffer源码如下: intpcap_setuserbuffer(pcap_t *p, int size) { unsigned char *new_buff; if (!p->adapter) { sprintf(p->errbuf,"Impossible to set user原创 2011-10-27 19:34:04 · 1953 阅读 · 0 评论 -
庖丁解牛—winpcap源码彻底解密系列的续集(8)
设置超时,设置mintoCopy,设置内核缓冲,设置用户缓冲,设置MTU的大小,这些实现都和设置混合模式相似。讲解如下: 如设置内核缓冲区,代码段如下pcap_win32的pcap_activate_win32函数: if (p->opt.buffer_size == 0) p->opt.buffer_size = WIN32_DEFAU原创 2011-10-27 19:22:15 · 1910 阅读 · 0 评论 -
庖丁解牛---winpcap源码彻底解密系列的续集(7)
DeviceIoControl对应npf.sys中的NPF_IoControl函数; NTSTATUS NPF_IoControl(IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp){ POPEN_INSTANCE Open; PIO_STACK_LOCATION IrpSp; PLIST_ENTRY原创 2011-10-27 16:51:53 · 1933 阅读 · 0 评论 -
庖丁解牛---winpcap源码彻底解密系列的续集(6)
如何设置混合模式,本文是庖丁解牛---winpcap源码彻底解密系列的续集: static intpcap_activate_win32(pcap_t *p){ NetType type; #ifdef HAVE_REMOTE char host[PCAP_BUF_SIZE + 1]; char port[PCAP_BUF_SIZE +原创 2011-10-27 16:47:54 · 2848 阅读 · 1 评论 -
庖丁解牛-----winpcap源码彻底解密(五)
庖丁解牛-----winpcap源码彻底解密(五)原创 2010-12-19 22:10:00 · 2838 阅读 · 4 评论 -
庖丁解牛-----winpcap源码彻底解密(四)
<br /><br /><br />庖丁解牛-----winpcap源码彻底解密(四)<br /><br /><br />版权申明: 原创文章,转贴请注明出处!!!!!!!!<br /><br /><br />(1) 如何设置内核缓冲区的大小,前面已经谈过设置内核缓冲区的函数是pcap_setbuff,查看winpcap的开发文档,pcap_setbuff的定义如下:<br />int pcap_setbuff(pcap_t *p,int dim);<br />Set the size of t原创 2010-12-19 21:59:00 · 6416 阅读 · 11 评论 -
庖丁解牛-----winpcap源码彻底解密(三)
庖丁解牛-----winpcap源码彻底解密(三) 上一篇讲了怎么发送数据包,这次接着讲怎么接收数据包,数据包过滤后,就被复制到内核缓冲区(kernel buffer),接收数据包的方式有2种,使用回调函数接收数据包,比如pcap_loop,pcap_dispatch,二是非回调函数的方式来接收数据包,如pcap_ next, pcap_next_ex。这一篇讲讲怎么发送数据包。原创 2010-12-19 21:40:00 · 4442 阅读 · 3 评论 -
庖丁解牛-----winpcap源码彻底解密(二)
<br />庖丁解牛-----winpcap源码彻底解密(二)<br />查找到网卡后,open网卡,设置过滤器,然后就该读写数据包了,下面就讲讲怎么发送和接收数据包了。<br />(4)pcap_sendpacket<br />pcap_sendpacket用来发送数据包,该函数只能发送单个的数据包,<br />intpcap_sendpacket(pcap_t *p, constu_char *buf, intsize)<br />{<br /> if (p->inject_op(p, buf,原创 2010-12-19 16:52:00 · 4279 阅读 · 1 评论 -
庖丁解牛-----winpcap源码彻底解密(一)
庖丁解牛-----winpcap源码彻底解密 原创:转载请注明出处; 最近忙一个项目,需要使用winpcap抓取网络数据包,调用winpcap提供的api进行抓包后,发现丢包情况比较严重,而且cpu占用率比较大。所以下定决心,对winpcap源码进行分析,因为对驱动和对Ndis网络驱动比较熟悉,所以分析源码还不是很费劲,其实winpcap底层的npf不过是一个Ndis协原创 2010-12-18 22:50:00 · 9225 阅读 · 22 评论