您的位置:首页 > 运维架构 > Linux

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函数说明

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: