Unix网络编程
Unix网络编程
橙子砰砰枪
即使盗版书也看的津津有味
展开
-
Unix网络编程-TCP心跳包的实现(使用紧急数据)
发送端三个新函数/** * @file heartbeatcli.c * 紧急数据实现心跳包 */#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/ip.h>#include <netinet/in.h>#include &原创 2022-05-20 00:24:34 · 457 阅读 · 0 评论 -
Unix网络编程-TCP带外数据(紧急数据)
简单的发送程序/** * @file oobtcpsend1.c * 简单的带外数据发送程序 */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/socket.h>#include <netinet/ip.h>#include <netinet/in.h>#include <arpa/inet.h>#inclu原创 2022-05-19 23:54:27 · 300 阅读 · 0 评论 -
Unix网络编程-非阻塞IO
非阻塞IOUnix所提供的IO默认都是阻塞IO,在高性能网络库中,一般不会使用阻塞IO,不论是普通的消息收发,甚至是connect函数,accept函数,此文重写str_cli(),以及改写connect,accpet,写成非阻塞版本。str_cli()/** * @file str_cli.c * 非阻塞版本 * 不建议在网络通信中使用标准IO,虽然有缓冲区 * 但是标准IO的缓冲区操纵难度大,弊大于利 * 这里我们使用自己建立的缓冲区数组 */#include <stdlib.原创 2022-05-18 15:12:11 · 173 阅读 · 0 评论 -
Unix网络编程-Unix域套接字
Unix域套接字的bind调用/** * @file bind.c * Unix域套接字 * 创建域套接字,绑定路径名,getsockname输出这个这个绑定的路径 */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/un.h>#in原创 2022-05-17 17:36:48 · 276 阅读 · 0 评论 -
Unix网络编程-使用select执行TCP和UDP业务
/** * @file server-select-TCP-UDP.c * 使用select同时处理TCP和UDP */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/select.h>#include <arpa/inet.h&原创 2022-05-07 17:36:21 · 402 阅读 · 0 评论 -
Unix网络编程-IO多路复用Poll
服务端/** * @file server-poll.c * 使用poll,只需要维护一个结构体数组,不需要维护两个fd_set和一个clients数组 */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/socket.h>#include <poll.h>#include <sys/types.h>#include <原创 2022-05-06 00:19:58 · 183 阅读 · 0 评论 -
Unix网络编程-IO多路复用Select
客户端/** * @file client-select.c * 使用select改进client1.c中的str_cli函数 * 这个str_cli函数是不正确的: * 1.标准IO缓冲区不会触发select,不建议待缓冲区的IO和select一起使用 * 2.写完就关闭套接字,可能会有数据遗留在网络中,应该先进行半关闭 * */// 只负责连接#include <stdio.h>#include <stdlib.h>#include <string原创 2022-05-06 00:19:13 · 173 阅读 · 0 评论 -
Unix网络编程-Posix消息队列
消息队列的创建命名只能是/queuename.默认存放在/dev/mqueue里,(posixIPC都在这里,System V 可以用ipcs查看)与内核相同的持续时间——除非删除队列,否则里面的消息不丢失存在引用计数,最后一个计数为0且unlink可以删除创建:/** * @file 1-mqcreate.c * 创建一个消息队列 */#include <stdio.h>#include <stdlib.h>#include <fcntl.h>原创 2022-05-01 22:16:16 · 492 阅读 · 0 评论 -
Unix网络编程-客户端和服务端不同的终止状态
正常终止信号处理回收子进程处理被中断的慢系统调用accept返回前终止在完成三次握手和accept返回之间(这是一个很小的间隔),客户端重发了RST报文,导致accept失败。这个时候的connect还是可以复用的,所以只要重新连接就行了。通过套接字选项可以设置RST报文。此时Posix下errno值会被设置成ECONNABORTED。因为这个错误是非致命的,所以可以重新启动accept。只要处理这个错误,并再循环执行accept就可以了。服务器进程终止进程终止与主机崩溃不同。服原创 2022-05-01 20:09:08 · 757 阅读 · 0 评论 -
Unix网络编程-信号回收子进程和信号对慢系统调用的影响
信号对慢系统调用的影响信号从接受到处理是有一个过程的,因为这个时候信号集要进内核,并从内核出来再执行信号处理函数。就可能会导致一些慢系统调用函数的假性出错(就是这个函数本身没有出错,而是由于内核执行了信号处理,才导致它出错),有些函数假错是可以重新启动的,比如说:accept,listen,read,write等;但是connect是不能重新启动的,如果对connect重连,会直接返回错误,正确的做法是关闭套接字,重新打开进行连接。信号打断accept:几乎所有的慢系统调用含税被信号打断,都会报一个E原创 2022-05-01 20:08:14 · 450 阅读 · 0 评论 -
Unix网络编程-管道和FIFO
管道/** * @file pipe.c * 1.客户端传送给服务端一个路径名字 * 2.服务端读取文件内容通过ipc传送给客户端 * 3.客户端将读取的内容显示到标准输出 * * 管道本身是半双工,fork之后是可以全双工,但是只有一个管道缓冲区,根本没法进行通信 * 全双工的通信还是像下面这样,用两个管道,用两个缓冲区实现 */#include <stdio.h>#include <stdlib.h>#include <unistd.h>#原创 2022-04-26 22:48:19 · 219 阅读 · 0 评论 -
网络协议详解
网络模型OSI七层模型:学习用的五层模型:路由器中只有下三层(网络层,链路层,物理层)。协议和数据:交换机是多接口的网桥,全双工通信,有自学习MAC地址的能力。路由器隔绝广播域,隔绝不同子网,连接不同网段。MAC地址和IP地址IP地址是目标地址,MAC地址是每一步的地址。每一个网卡都有一个6字节的MAC地址,且全球唯一。mac地址的标识格式:当消息在网络上传输的时候,我们给出目标IP地址,消息通过路由器的转发,最终到达目标IP地址的主机上。因为IP的底层是MAC,所以转发的原创 2022-04-26 12:00:43 · 3504 阅读 · 0 评论 -
C/C++Unix网络编程-IPC简介
IPC是进程间通信的简称。进程、线程与信息共享Unix进程间的信息共享的方式:(1) 左边的两个进程共享存留于文件系统中某个文件上的某些信息。为访问这些信息、每个进程都得穿越内核(例如read、write、lseek等)。当一个文件有待更新时,某种形式的同步是必要的,这样既可保护多个写入者,防止相互串扰,也可保护一个或多个读出者,防止写入者的干扰。(2)中间的两个进程共享驻留于内核中的某些信息。是这种共享类型的一个例子,System V消息队列和System V信号量也是。现在访问共享信息的每次操原创 2022-03-28 19:32:56 · 2486 阅读 · 0 评论 -
C/C++Unix网络编程-套接字编程简介
套接字地址结构套接字的地址结构可以在两个方向上传播:从进程到内核和从内核到进程。IPV4套接字地址结构sin_len是长度字段,有的平台上的套接字没有这个东西,因为有外置的sizeof运算符。...原创 2022-03-28 10:12:37 · 2004 阅读 · 0 评论