共享内存:(最快) 常用的命令 ipcs ipcrm ipcmk include <errno.h>用以下面判断是否key已经先建立 if(errno == EEXIST){说明已经被对方建好,这里加上处理函数,比如shmat....} 一般先用ftok建立key 创建/打开共享内存shmget(key_t key, size_t size, int shmflg);注意读写者的第三个参数0666| IPC_CREAT | IPC_EXCL /*fail if key exists*/0666是ipcs 中的perms 属性 映射共享内存 shmat (p = (SHM *)shmat(shmid, NULL, 0)) == (SHM *)-1 获取对象的属性struct shmid_ds buf (shmctl(shmid, IPC_STAT, &buf) == -1) 撤销共享内存映射 shmat 删除对象shmctl(shmid, IPC_RMID, NULL) == -1 脱离共享内存 deattch shmdt 当有多个读写者连上 共享内存时,struct shmid_ds buf。if(Buf.shm_nattch==0) 判断连接数目当没有了再删除对象 (shmctl(shmid, IPC_RMID, NULL) == -1) 当有几个读者的时候,能几个读者共同读到呢?? 信号灯: 常与共享内存一起用,可以实现P V的强大操作。对多种资源进行操作多个可以利用 int semop(int semid, struct sembuf *sops, unsigned nsops); 没有mask命令 只有umask 这个是屏蔽码。哪位为1则屏蔽哪位 大端:高字节存在低位 (刚开始的端口是大的)同下为78563412 小端:低字节存在低位 (端口是小的)若 i=0x78563412 则利用p++输出为12345678 我们的电脑经常是小端:所以需要转化成网络字节序(网络字节序是大段) 小端上192.168.0.1转化为大端后为1.0.168.192 TCP 服务器端模型 socket >>>bind>>>listen>>>accept>>>send/recv>>>close TCP 客户端模型 socket >>>bind(可选)>>>connect>>>send/recv>>>close 应用:TFTP服务器 可用get put list等命令上传下载文件 允许多行输入可以用 scanf(“%[^\$]”,)接收$符号以前的字符。包括'\n' 常用调试工具:telnet , netstat -na | grep “8888” 查看占用端口8888的网络服务,netstat 显示当前的网络进程 UDP server: socket >>> bind >>> recvfrom >>>sendto client: socket >>> bind(可选) >>>sendto >>>recvfrom 这里注意没bind不能先recvfrom再sendto 客户端可用connect可以多次调用也可用recv/send 一个客户端多次调用connect 与多个服务器进行连接。 UDP应用: 回射服务器:多个客户端(固定回什么)如 系统上的时间更新服务器 UNIX/Linux下的4种I/O模型 以及 各自的优缺点 阻塞 I/O 非阻塞I/O I/O多路复用 信号驱动I/O 并发服务器(TCP常用 (注意回收僵尸进程signal(SIGCHLD, ) (会占用进程号(系统有最大进程号太大则不能创建 I/O多路复用并发服务器 初始化(socket>>bind>> bind while(1){ 设置监听读写文件描述符集合(FD_*);//select会改变传入的集合参数 注意 重新赋值 调用select;//maxfd+1 if:监听套接字就绪(需要用for 一个一个检测0-maxfd),说明有新的连接请求{ 建立连接accept; 加入到监听文件描述符集合; } else:是一个已经连接过的描述符{ 进行操作(send或者recv)//由于上面有加入到监听集合,所以这里注意清除刚处理过 的set中的FD } } 循环服务器(UDP常用 广播 和 组播的编程 UNIX域套接字 (用于本地进程 协议为PF_UNIX(和其他进程之间通信相比效率更高 有几个结构和问题需要注意 1.sockaddr_in (in是inet的缩写)和sockaddr;为什么函数传递过程中要强制转化为sockaddr :因为sockaddr原来是用于进程间的。sockaddr_in是后来发现这个特别适合网络于是扩展的,当然还有sockaddr_un之类的结构也需要转化 2.listen(,n)n的具体作用 允许n个进入等待队列,多余的则拒绝。使之变为监听套接字 3.监听套接字 和 非监听套接字 4.UDP为何高效:不用等待确认,不存在发送缓冲区满的情况。 写操作永远不会阻塞 5.bind时创建socket 抓包工具:wireshark开源的
用原始套接字实现ping 可以看见/bin下面的ping文件是红色的并且属性为 -rwsr-xr-x 1 root root 34740 Nov 8 2011 ping* 注意自己写的要chown root:root ping 并chmod +s ping 3握手,4挥手,心跳包 ,IP冲突检测 chengyaogen unix