网络编程
xb_0916
自我评价
为人诚恳,热情,专业知识扎实,工作认真踏实负责,良好的沟通能力及团队合作创新精神
展开
-
struct sockaddr 与 struct sockaddr_in
struct sockaddr 与 struct sockaddr_in2009-12-13 14:05:50 struct sockaddr {unsigned short sa_family; /* address family, AF_xxx */char sa_data[14]; /* 14 bytes of protocol address */};sa_转载 2013-05-16 09:39:43 · 619 阅读 · 0 评论 -
Linux网络编程之广播
1.概念前面介绍的TCP,UDP都是单播方式,即一对一.而广播是一台主机向局域网内的所有主机发送数据。这时,同一网段的所有主机都能接收到数据。发送广播包的步骤大致如下:(1)确定一个发送广播的接口,如eth0(2)确定广播的地址,通过ioctl函数,请求码设置为SIOCGIFBRDADDR得到广播的地址(3)使用这个广播地址进行广播由于TCP协议是端到端的协转载 2014-05-08 14:38:36 · 448 阅读 · 0 评论 -
Linux网络编程之高级并发服务器
1. 介绍在上一节,我们介绍了Linux简单的并发服务器,通过在服务器端建立多个子进程,来接收客户端的请求,实现并发处理,但这种方式明显有缺陷,服务器并不知道客户端请求的数量,所以事先建立的进程数不好确定。所以,这里介绍三种高级并发服务器模式。第一种是服务器端统一accept,接收客户端的到来,然后为每个客户端分配一个进程去处理. 第二种是统一accept接收请求,然后为每个客户端分配一个转载 2014-05-08 14:49:36 · 375 阅读 · 0 评论 -
Linux网络编程:原始套接字的魔力【上】
基于原始套接字编程 在开发面向连接的TCP和面向无连接的UDP程序时,我们所关心的核心问题在于数据收发层面,数据的传输特性由TCP或UDP来保证: 也就是说,对于TCP或UDP的程序开发,焦点在Data字段,我们没法直接对TCP或UDP头部字段进行赤裸裸的修改,当然还有IP头。换句话说,我们对它们头部操作的空间非常受限,只能使用它们已经开放给我们的诸如源、目的I转载 2014-05-09 09:19:49 · 451 阅读 · 0 评论 -
Linux网络编程之原始套接字-ping协议实现
1.概述PING协议是用来检验本地主机与远程主机是否连接,发送的是ICMP ECHO_REQUEST包。普通的套接字是基于TCP或者是UDP的,无法发送ICMP包,所以必须用原始套接字来实现。PING协议的客户端类型值为8,代码值为0,表示请求。而PING协议的响应端类型值为0,代码值也为0,表示应答. 以太网数据部分的最小值为46字节,而IP首部占20个字节,ICMP的首部占8个字节,所转载 2014-05-08 14:44:47 · 564 阅读 · 0 评论 -
Linux网络编程之I/O复用循环服务器
1.介绍在前几节,我们介绍了循环服务器,并发服务器. 简单的循环服务器每次只能处理一个请求,即处理的请求是串行的。而并发服务器可以通过创建多个进程或者是线程来并发的处理多个请求。但由于进程或线程的切换会带来一定的开销。而且随着客户端请求的增多,创建的线程或进程的数目也越来越多,开销势必会增加。因此,本文提出了I/O复用的循环服务器。I/O复用的循环服务器创建两个线程,一个是客户端连接处理线转载 2014-05-08 14:48:08 · 450 阅读 · 0 评论 -
Linux网络编程之循环服务器
1.介绍Linux网络循环服务器是指逐个处理客户端的连接,处理完一个连接后再处理下一个连接,是一个串行处理的方式,比较适合时间服务器,DHCP服务器.对于TCP服务器来说,主要阻塞在accept函数,等待客户端的连接。而对于UDP服务器来说,主要阻塞在recv函数.2.循环服务器模型TCP循环服务器:算法如下: socket(...);转载 2014-05-08 14:52:06 · 409 阅读 · 0 评论 -
Linux网络编程之多播
1.概念单播是用于两个主机之间传送数据,广播是一个主机对局域网内的所有主机发送数据。而多播,又称为组播,它是对一组特定的主机通信。将网络上同一类型业务逻辑上分组,只和组内的成员通信,其它主机没有加入组则不能通信。与单播相同的是,组播允许在Internet上通信,而广播只是同一局域网内的主机通信。组播地址是特定的,D类地址用于组播,即244.0.0.0到239.255.255.255. 并划转载 2014-05-08 14:39:40 · 406 阅读 · 0 评论 -
Linux网络编程:原始套接字的魔力【下】
可以接收链路层MAC帧的原始套接字 前面我们介绍过了通过原始套接字socket(AF_INET, SOCK_RAW, protocol)我们可以直接实现自行构造整个IP报文,然后对其收发。提醒一点,在用这种方式构造原始IP报文时,第三个参数protocol不能用IPPROTO_IP,这样会让系统疑惑,不知道该用什么协议来伺候你了。 今天我们介绍原始套接字的另一种用法转载 2014-05-09 09:22:27 · 419 阅读 · 0 评论 -
Linux网络编程:原始套接字的魔力【续】
如何从链路层直接发送数据帧 本来以为这部分都弄完了,结果有朋友反映说看了半天还是没看到如何从链路层直接发送数据。因为上一篇里面提到的是从链路层“收发”数据,结果只“收”完,忘了“发”,实在抱歉,所以就有这篇续出来了。 上一节我们主要研究了如何从链路层直接接收数据帧,可以通过bind函数来将原始套接字绑定到本地一个接口上,然后该套接字就只接收从该接口收上来的对应的数据转载 2014-05-09 09:23:14 · 399 阅读 · 0 评论 -
epoll完整实例
#include deque>#include map>#include vector>#include pthread.h>#include semaphore.h>#include time.h>#include sys/time.h>#include sys/shm.h>#include errno.h>#include sys/types.h>#in转载 2014-05-08 14:23:51 · 555 阅读 · 0 评论 -
Linux 网络编程之原始套接字
1. 介绍前面主要介绍了流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),基本上能够满足TCP与UDP的应用。但一些问题,我们仍然无法解决,如:(1)发送一个自定义的IP包(2)发送ICMP包(3)侦听网络上的数据包(4)伪装IP地址(5)实现自定义的协议究其原因,标准的套接字与TCP,UDP层打交道,而原始套接字只转载 2014-05-08 14:41:14 · 414 阅读 · 0 评论 -
UDP并发技术
通常所见的的TCP服务器都 是并发实现的,即服务同时处理多个请求,而不是等待前一个完成再处理下一个请求,这个实现得益于TCP的listen()与connect()的分工处理 机制。具体为,服务器监听来自客户的连接,当一个请求到来时,服务器fork()一个子进程,处理该请求,然后父进程继续监听外部请求。 但在UDP中,没有这种监听和连接机制,所以它必须等待前一处理完成才能继续处理下一个客转载 2014-07-09 16:46:42 · 511 阅读 · 0 评论 -
linux 内核与用户空间通信之netlink使用方法
Linux中的进程间通信机制源自于Unix平台上的进程通信机制。Unix的两大分支AT&T Unix和BSD Unix在进程通信实现机制上的各有所不同,前者形成了运行在单个计算机上的System V IPC,后者则实现了基于socket的进程间通信机制。同时Linux也遵循IEEE制定的Posix IPC标准,在三者的基础之上实现了以下几种主要的IPC机制:管道(Pipe)及命名管道(Named转载 2015-01-16 11:12:53 · 332 阅读 · 0 评论 -
对于C++网络编程的一点了解
源码包下载; http://download.dre.vanderbilt.edu/ http://blog.csdn.net/superyao2008/article/details/2576099 http://blog.csdn.net/sunny3106/article/details/7284172 因为我们通常用C进行后台转载 2015-03-25 15:53:05 · 1120 阅读 · 0 评论 -
epoll的LT和ET模式
转载自:http://kenby.iteye.com/blog/1162853epoll的两种模式 LT 和 ET二者的差异在于 level-trigger 模式下只要某个 socket 处于 readable/writable 状态,无论什么时候进行 epoll_wait 都会返回该 socket;而 edge-trigger 模式下只有某个 socket 从 unrea转载 2015-03-25 09:39:05 · 336 阅读 · 0 评论 -
linux 高并发socket通信模型
------select1 一个误区很多人认为它最大可以监听1024个,实际上却是文件描述符的值不能大于等于1024,所以除掉标准输入、输出、错误输出,一定少于1024个,如果在之前还打开了其他文件,那会更少2 select返回后,一般要轮询fd_set,发现新连接要加上,连接断开要去掉,这个过程一定要这样做:select之前把fd_set临时拷贝一份,轮询中对它的修改只在临时fd_set转载 2015-03-25 09:47:19 · 354 阅读 · 0 评论 -
linux下写程序检测ip冲突(ARP)
原理其实很简单,那就是广播一个arp包,然后recv,如果没有数据(这里要设置延时),那么说明这个ip是可用的,否则就检测这个数据是否为回复我们发出的arp的应答包.如果是则证明ip已被使用,否则继续等待.这里可以看下busybox的dhcp中的检测程序。 networking/udhcp/arpping.c C代码 /* vi: set sw=4转载 2013-10-10 09:49:42 · 1408 阅读 · 0 评论 -
关于异步,同步,阻塞与非阻塞
如果你想吃一份宫保鸡丁盖饭:同步阻塞:你到饭馆点餐,然后在那等着,还要一边喊:好了没啊!同步非阻塞:在饭馆点完餐,就去遛狗了。不过溜一会儿,就回饭馆喊一声:好了没啊!异步阻塞:遛狗的时候,接到饭馆电话,说饭做好了,让您亲自去拿。异步非阻塞:饭馆打电话说,我们知道您的位置,一会给你送过来,安心遛狗就可以了。上面的比喻给出一个形象的感觉,这里有一段关于Reactor和Pro转载 2013-08-19 18:55:08 · 314 阅读 · 0 评论 -
解释nginx的epoll的网络I/O模型为什么快的原因
epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,在开始讨论这个问题之前,先来解释一下为什么需要多路复用IO.以一个生活中的例子来解释.假设你在大学中读书,要等待一个朋友来访,而这个朋友只知道你在A号楼,但是不知道你具体住在哪里,于是你们约好了在A号楼门口见面.如果你使用的阻塞IO模型来处理这个问题,那么你就只能一直守候在A号转载 2013-08-06 17:14:55 · 2592 阅读 · 0 评论 -
一些重要的网络结构体ifconf, ifreq,sockaddr,caddr_t
ifconf, ifreq,sockaddr,caddr_t //提示:结构体设计的非常规范,强烈推荐 /* Interface request structure used for socket ioctl's. All interface ioctl's must have parameter definitions which begin with ifr_name转载 2013-05-13 14:10:35 · 1106 阅读 · 0 评论 -
linux C获取IP地址
int get_ip(char *ip,){ int sockfd; sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd == -1) { perror("create socket fail\n"); } return(-1); }原创 2013-05-15 16:51:08 · 588 阅读 · 0 评论 -
linux c获取mac地址
int get_mac(char* mac){ struct ifreq tmp; int sock_mac; char mac_addr[30]; sock_mac = socket(AF_INET, SOCK_STREAM, 0); if( sock_mac == -1){ perror("create socket fa转载 2013-05-15 16:44:52 · 755 阅读 · 0 评论 -
linux 下实现服务器与客户端连接小例子
[cpp] view plaincopy// 服务器端 /******* 服务器程序 (server.c) ************/ #include #include #include #include #include #include #include #include #include #include int m转载 2013-05-21 18:00:25 · 740 阅读 · 0 评论 -
Linux系统下UDP发送和接收广播消息小例子
2013-01-07 10:54 581人阅读 评论(2)收藏 举报[cpp] view plaincopy// 发送端 #include #include #include #include #include #include #include #include #include using namespace转载 2013-05-21 17:58:48 · 432 阅读 · 0 评论 -
gethostbyname()函数说明
gethostbyname()函数说明——用域名或主机名获取IP地址 包含头文件 #include #include 函数原型 struct hostent *gethostbyname(const char *name); 这个函数的传入值是域名或者主机名,例如"www.google.cn"等等。传出值,是一个hostent转载 2013-05-22 19:38:20 · 374 阅读 · 0 评论 -
Socket编程小结
1. read系统调用测试程序:客户端向服务器端(tcp)发送一个”hello”字符串,服务器端读取并echo到客户端。 服务器端主要代码:char buf[4096];int r = tcp_readn(sock, buf, 4096);int w = tcp_writen(sock, buf, r); 客户端主要代码:char buf[4096];int转载 2013-05-23 09:42:48 · 465 阅读 · 0 评论 -
ping 原理与ICMP协议
ping 的原理 ping 程序是用来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建立连接。ping 使用的是ICMP协议,它发送icmp回送请求消息给目的主机。ICMP协议规定:目的主机必须返回ICMP回送应答消息给源主机。如果源主机在一定时间内收到应答,则认为主机可达。 ICMP协议通过IP协议发送的,IP协议是一种无连接的,不可转载 2013-05-27 17:35:35 · 451 阅读 · 0 评论 -
ioctl 函数与网络接口
本文只讨论ioctl 在 linux网络编程中的应用 #include int ioctl( int fd, int request, .../* void *arg */ ); 返回0——成功, -1——出错 第一个参数 fd 指示某个文件描述符(当然也包括 套接口描述符)第二个参数 request 指示要ioc转载 2013-05-28 13:41:00 · 538 阅读 · 0 评论 -
setsockopt()用法(参数详细说明)
nt setsockopt(SOCKET s,int level,int optname,const char* optval,int optlen);s(套接字): 指向一个打开的套接口描述字level:(级别): 指定选项代码的类型。SOL_SOCKET: 基本套接口IPPROTO_IP: IPv4套接口IPPROTO_IPV6: IPv6套接口转载 2013-05-16 10:08:17 · 372 阅读 · 0 评论 -
UNIX网络编程初步
1.1 客户端程序和服务端程序 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 网络程序是先有服务器程序启动,等待客户端的程序运行并建立连接.一般的来说是服务端的程序 在一个端口上监听,直到有一个客户端的程序发来了请求. 1.2 常用的命令 由于网络程序是有两个部分组成,所以在调试的时候比较麻烦,为此我们有必要知道一些常用的网络命令转载 2013-06-07 15:13:23 · 633 阅读 · 0 评论 -
linux udp bind函数说明
1. IP包头部20个字节,其中有包含源IP地址与目标IP地址,报文长度用2个字节表示,说明最大IP大小为65535,如下图所示:0481216192431版本首部长度服务类型长度认证标志段偏移量TTL协议校验和源IP地址转载 2013-06-17 13:08:55 · 1389 阅读 · 0 评论 -
UNIX网络编程学习(9)--getsockname和getpeername的用法及实例
getsockname可以获得一个与socket相关的地址。 服务器端可以通过它得到相关客户端地址。 而客户端也可以得到当前已连接成功的socket的ip和端口。第二种情况在客户端不进行bind而直接连接服务器时,而且客户端需要知道当前使用哪个ip进行通信时比较有用(如多网卡的情况)。笔者分别通过TCP和UDP协议进行测试,测试结果表明:对于TCP连接的情转载 2013-05-20 14:43:13 · 506 阅读 · 0 评论 -
ip地址、子网掩码、网关的关系
子网掩码是每个网管必须要掌握的基础知识,只有掌握它,才能够真正理解TCP/IP协议的设置。以下我们就来深入浅出地讲解什么是子网掩码。IP地址的结构:要想理解什么是子网掩码,就不能不了解IP地址的构成。互联网是由许多小型网络构成的,每个网络上都有许多主机,这样便构成了一个有层次的结构。IP地址在设计时就考虑到地址分配的层次特点,将每个IP地址都分割成网络号和主机号两部分,以便于IP地址的寻址操作转载 2013-05-17 11:05:32 · 1637 阅读 · 0 评论 -
0端口 0.0.0.0地址
服务端 socket() bind() //端口为0的时候表示系统分配端口//端口号为5050 listen() accept(); 客户端 socket() connect() //这里也设置了个端口号5050,书上说客户端和服务器端的端口号必须一样 当客户端进行连接时,我的accept得到个sockaddr_in里面的端口号并不是5转载 2013-07-18 11:37:33 · 1489 阅读 · 0 评论 -
TCP/IP,http,socket,长连接,短连接——小结
概要: 之前对这几个概念有点糊涂,查阅了些资料,稍微概括下他们的区别吧。如有错误,请拍~~~先看图:TCP/IP是什么? TCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层。 在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。 在传输层中有TCP协议与UDP协议。 在应用层有FT转载 2013-08-01 10:50:18 · 569 阅读 · 0 评论 -
TCP连接探测中的Keepalive 和心跳包
采用TCP连接的C/S模式软件,连接的双方在连接空闲状态时,如果任意一方意外崩溃、当机、网线断开或路由器故障,另一方无法得知TCP连接已经失效,除非继续在此连接上发送数据导致错误返回。很多时候,这不是我们需要的。我们希望服务器端和客户端都能及时有效地检测到连接失效,然后优雅地完成一些清理工作并把错误报告给用户。如何及时有效地检测到一方的非正常断开,一直有两种技术可以运用。一种是由TCP协议层实转载 2015-04-08 15:00:41 · 336 阅读 · 0 评论