linux高级编程day09 笔记
2012-08-22 16:18
387 查看
一.信号量(同步)
1.回顾:
一个进程控制另外一个进程.
逻辑变量+pause/sleep+信号
2.信号量(semaphore)信号灯
三个数据:红灯/绿灯/黄灯
60 90 10
信号量是共享内存整数数组.根据需要定义指定的数组长度
信号量就是根据数组中的值,决定阻塞还是解除阻塞
3.编程
3.1.创建或者得到信号量 semget
3.2.初始化信号量中指定下标的值 semctl
3.3.根据信号量阻塞或者解除阻塞 semop
3.4.删除信号量 semctl
案例:
A: B
创建信号量 得到信号量
初始化信号量
根据信号量阻塞 解除阻塞
删除信号量
semget函数说明
返回: -1:失败
>=0:成功返回信号量的ID
返回:
-1:时失败
0:成功
sem_op:
前提条件信号量是unsigned short int;
不能<0.
-:够减,则semop马上返回,不够减,则阻塞.
+:执行+操作
0:判定信号量>0,则阻塞,直到为0
控制进程的搭配方式:
+(解除阻塞) -(阻塞)
0(阻塞) -(解除阻塞)
View Code
总结:
1.问题:
connect + send == sendto
2.问题:
recvfrom的作用不是专门从指定IP接收
而是从任意IP接收数据,返回发送数据者的IP
3.问题:
为什么要bind,bind主要目的告诉网络发送数据的目标.
是否一定绑定才能发送数据?
否:只要知道你的IP与PORT,就能发送数据.
4.问题:
为什么发送者没有绑定IP与端口,他也有端口?
底层网络驱动,帮我们自动生成IP与端口.
5.缺陷:
接收方不区分发送者的.
send函数
sendto函数
返回:
-1:发送失败
>=0:发送的数据长度
recv函数
recvfrom函数
2.2.TCP编程的数据特点
2.3.TCP服务器的编程
3.TCP的服务器编程模型
4.IP协议与处理(SOCK_RAW,SOCK_PACKET)
5.pcap编程
6.HTTP协议与网页搜索
作业:
1.重新编写UDP网络通信
2.使用gethostbyname的得到bbs.tarena.com.cn
www.sina.com
1.回顾:
一个进程控制另外一个进程.
逻辑变量+pause/sleep+信号
2.信号量(semaphore)信号灯
三个数据:红灯/绿灯/黄灯
60 90 10
信号量是共享内存整数数组.根据需要定义指定的数组长度
信号量就是根据数组中的值,决定阻塞还是解除阻塞
3.编程
3.1.创建或者得到信号量 semget
3.2.初始化信号量中指定下标的值 semctl
3.3.根据信号量阻塞或者解除阻塞 semop
3.4.删除信号量 semctl
案例:
A: B
创建信号量 得到信号量
初始化信号量
根据信号量阻塞 解除阻塞
删除信号量
semget函数说明
int semget(key_t key, int nums,//信号量数组个数 int flags);//信号量的创建标记 //创建IPC_CREAT|IPC_EXCL|0666 //打开0
返回: -1:失败
>=0:成功返回信号量的ID
int semop( int semid,//信号量ID struct sembuf *op,//对信号量的操作.操作可以是数组多个 size_t nums,//第二个参数的个数 );
返回:
-1:时失败
0:成功
int semctl(int semid, int nums,//对IPC_RMID无意义 int cmd,//SETVAL IPC_RMID ...);//对IPC_RMID无意义
struct sembuf { int sem_num;//下标 int sem_op; int sem_flg;//建议为0. }
sem_op:
前提条件信号量是unsigned short int;
不能<0.
-:够减,则semop马上返回,不够减,则阻塞.
+:执行+操作
0:判定信号量>0,则阻塞,直到为0
控制进程的搭配方式:
+(解除阻塞) -(阻塞)
0(阻塞) -(解除阻塞)
View Code
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <netdb.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> main() { int fd; struct sockaddr_in ad; char buf[101]; int r; fd=socket(AF_INET,SOCK_DGRAM,0); if(fd==-1) printf("socket err:%m\n"),exit(-1); ad.sin_family=AF_INET; ad.sin_port=htons(11111); ad.sin_addr.s_addr=inet_addr("192.168.180.92"); //connect(fd,(struct sockaddr*)&ad,sizeof(ad)); while(1) { r=read(0,buf,sizeof(buf)-1); if(r<=0) break; buf[r]=0; r=sendto(fd,buf,r,0, (struct sockaddr*)&ad,sizeof(ad)); bzero(buf,sizeof(buf)); r=recv(fd,buf,sizeof(buf),0); buf[r]=0; printf("来自接收方的数据:%s\n",buf); //r=send(fd,buf,r,0); if(r==-1) break; } close(fd); }
总结:
1.问题:
connect + send == sendto
2.问题:
recvfrom的作用不是专门从指定IP接收
而是从任意IP接收数据,返回发送数据者的IP
3.问题:
为什么要bind,bind主要目的告诉网络发送数据的目标.
是否一定绑定才能发送数据?
否:只要知道你的IP与PORT,就能发送数据.
4.问题:
为什么发送者没有绑定IP与端口,他也有端口?
底层网络驱动,帮我们自动生成IP与端口.
5.缺陷:
接收方不区分发送者的.
send函数
sendto函数
int sendto( int fd,//socket描述符号 const void *buf,//发送的数据缓冲 size_t size,//发送的数据长度 int flags,//发送方式MSG_NOWAIT MSG_OOB const struct sockaddr *addr,//发送的目标的IP与端口 socklen_t len//sockaddr_in的长度 );
返回:
-1:发送失败
>=0:发送的数据长度
recv函数
recvfrom函数
int recvfrom( int fd, void *buf, size_t size, int flags, struct sockaddr*addr,//返回发送者IP与端口 socklen_t *len);//输入返回IP的缓冲大小,返回实际IP的大小
2.2.TCP编程的数据特点
2.3.TCP服务器的编程
3.TCP的服务器编程模型
4.IP协议与处理(SOCK_RAW,SOCK_PACKET)
5.pcap编程
6.HTTP协议与网页搜索
作业:
1.重新编写UDP网络通信
2.使用gethostbyname的得到bbs.tarena.com.cn
www.sina.com
相关文章推荐
- linux高级编程day01 笔记
- c++ 学习笔记(高级linux编程) day6
- linux高级编程day08 笔记
- c++ 学习笔记(高级linux编程) day8
- Linux高级编程复习笔记 第五章 exec 进程 父子进程 fork()
- c++ 学习笔记(高级linux编程) day7
- linux高级编程day06 笔记
- 【linux高级环境编程学习笔记四】消息队列进程通信
- c++ 学习笔记(高级linux编程) day2
- Linux高级编程复习笔记 第一章 内存管理 malloc new delete free sbrk brk
- c++ 学习笔记(高级linux编程) day10
- linux高级编程day04 笔记
- 【linux高级环境编程学习笔记一】管道通信
- c++ 学习笔记(高级linux编程) day11
- linux高级编程day10 笔记
- c++ 学习笔记(高级linux编程) day9
- Linux高级文件编程 标准C部分笔记
- Linux高级编程复习笔记 第二章 映射虚拟内存 mmap gcc 静态库 动态库
- c++ 学习笔记(高级linux编程) day14
- linux高级编程day05 笔记