随笔分类 - unp-net
摘要:SIGIO信号 信号驱动式I/O不适用于TCP套接字, 因为产生的信号过于频繁且不能准确判断信号产生的原因. 设置信号驱动需把sockfd的非阻塞与信号驱动属性都打开 server sockfd单独提出来作为全局变量, 便于sig_io处理函数访问 num变量用于设置当前可读数据报数量 struct
阅读全文
摘要:简单说明 TCP带外数据也称为紧急模式, 常用于中断某些操作, 如中断ftp文件的传输. 调用系统函数时我们需要处理一些信号操作, 而TCP带外数据可理解为由本地向对端发送一个signal, 让对端能采取相应的处理措施. 接收到带外数据时, 系统会产生SIGURG信号. TCP带外数据就是一个普通的
阅读全文
摘要:测试准备 UDP广播常用于局域网内, 一次性给局域网内的所有主机发送消息 如果只有一台电脑, 可以在手机里安装一个UDP接收端app 注: 如果linux与windows机子互相ping不通, 可能是杀毒软件的原因 实例 与普通UDP client相比, 有两个不同: 1.目标地址为xxx.xxx.
阅读全文
摘要:使用方法 首先要生成一个可用的套接字描述符,TCP或UDP的都可以,为方便一般使用UDP套接字描述符 然后调用ioctl函数获取所有网络接口列表(struct ifconf), 网卡越多列表数目越多 再次调用ioctl函数从一个个网络接口中获取子项(struct ifreq)进行输出 每获取一个子项
阅读全文
摘要:传递的实质 一个进程向另一个进程传递文件描述符时,实质是传递并共享同一文件描述符的表项, 也就是共享文件指针的当前位置/文件状态标志等 在技术实现上就是把文件表项的指针传递给另一个进程 通常发送进程与接受进程对传递的文件描述符的编号(int fd)是不一样的 涉及的结构和函数 要发送描述符,需要用s
阅读全文
摘要:与tcp套接字的主要不同 1.tcp为AF_INET; unix域为AF_LOCAL 2.tcp需要指定IP和port,连接两端无限制; unix域需要连接两端在同一台主机上,连接两端通过一个socket文件互相通信 3.tcp结构名称sockaddr_in,unix域结构名称sockaddr_un
阅读全文
摘要:与pipe的区别 pipe产生的文件描述符是半双工的,需要pipe两次才能实现全双工,产生的两个描述符是一个读,一个写 socketpair直接就可以全双工,产生的两个文件描述符的任何一个都可读可写 pipe例子 c include include include int main(){ int f
阅读全文
摘要:gethostbyname/gethostbyaddr 均用于IPv4中, 第一个通过域名查ip地址, 第二个通过ip地址反向查询域名. 不过需要注意的反向查询需要本地有反射解析服务, 或者说本地的etc/hosts文件中有相应的记录 gethostbyname的参数是域名的字符串 gethostb
阅读全文
摘要:解决绑定失败 在测试时,经常会出现绑定错误,bind error: Address already in use 这里只要指定一下socket的reuseaddr属性即可解决 c int on=1; if(setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&on,s
阅读全文
摘要:粘包及处理方法 粘包:由于缓冲区及下层硬件的原因,第n个包与第n+1个包合并在一起发送,或第n个包与第n+1个包的一部分合并在一起发送,等等。如果接收方要求格式良好,那我们就必须控制发送与接收方式。 处理方法: 1.发送定长包,发送方每次固定发送n个字节长,同时接受方固定每次读n个字节长。缺点:数据
阅读全文
摘要:server.c 把accept也看成是一个read类型的函数, 于是我们可以把sockfd也放入到select中 maxi标记当前客户端连接数组的最大下标 select返回值为当前已经准备就绪的fd总数 c include include include include include inclu
阅读全文
摘要:select的优点与使用方法 select用单线程的方法遍历所有待读写的I/O接口, 当有接口可用时就会返回. select可设置电脑阻塞或非阻塞. 特别注意: 每次select前都要重新初始化集合和相关的时间结构 使用的基本过程: 实例 只写了server端的,client端差不多 c inclu
阅读全文
摘要:非阻塞read/write 函数返回0表示可读或可写, 1表示select失败或超时 select返回0表示超时, 1表示读取失败,1表示可读或可写 非阻塞accecpt c int accept_timeout(int fd,struct sockaddr_in addr,unsigned int
阅读全文
摘要:select的限制 select的并发数受到两个限制:1.一个进程能打开的最大描述符数量;2.select中fd_set集合容量的限制(FD_SETSIZE) 关于进程的最大描述符数量: ulimit n:查看一个进程能打开的最大描述符数量 ulimit n 2048:将最大描述符数量更改为2048
阅读全文
摘要:关于select/poll与epoll select/poll虽然避免了无限循环轮循, 但是有一个问题,那就是特定事件发生时,我们还是需要再次轮循一遍查看到底时哪个或哪几个fd产生了可读或可写事件 epoll的等待事件返回后, 虽然返回值也是可用事件总数, 但可用事件会返回到一个指定的事件集合中,这
阅读全文
摘要:getaddrinfo getaddrinfo的一个重要功能, 很方便的构造struct sockaddr_in对象, 把繁琐的构造过程隐藏起来 getaddrinfo兼有gethostbyname和getservbyname等四个函数的功能 能传入ip/port, hostname/port, i
阅读全文
摘要:先说结论 一般分字符串形式和二进制形式两种. 由于大小端, 64/32位问题, 推荐使用字符串作为传输数据格式 字符串方式 主程序在[多线程的发送与接收]那一节 主要修改就是服务端接收到数据后,将字符串转换成数字进行相加,然后发回给客户端 二进制方式 先加个头文件sum.h, 服务端与客户端都使用同
阅读全文
摘要:第二版的问题 第二版中存在一个问题, 当服务端进程意外终止, 如果客户端正阻塞在输入时, 那么无法接收到通知, 直到按下回车发送时报错才得知服务端已经关闭 client serv 几点说明: 变量i,sockfd功能相近, 遍历时用 client[FD_SETSIZE]用来保存所有需要读取的fd m
阅读全文
摘要:server 最大连接数为10,监听13号端口,当有客户端连接上来时,打印客户端的相关信息,同时向客户端发送当前服务器时间 client 连接到服务端,连接完成后只接受不发送信息,收到第一条信息后打印并退出
阅读全文
摘要:三个基本问题 1. 服务器请求处理完毕, 处理僵尸进程 2. 慢系统调用被SIGCHLD信号中断 3. 多个SIGCHLD同时到达的情况 wait和waitpid 子进程终止时会产生SIGCHLD信号并发送给父进程 父进程可以捕获处理该信号也可以不捕获 SIGCHLD只是个数值信号, 并不包含结束子
阅读全文

浙公网安备 33010602011771号