Linux Socket Programming by Example-第一章读书笔记

这些年,一直从事DLNA数字家庭网络的研发工作,却一直没有很好研究网络编程,接下来半年时间里打算认真

阅读Socket编程相关书籍,并记录下自己的一些感悟思考。


第一章首先回顾了Socket的由来。Socket的设计主要来自电话。

分析一下打电话的流程:

第一步:    发起端预先知道接收端的电话号码,并拨打对方号码。

第二步:   通过中继网络,将连接请求发送到接收端。

第三步:   接收方听到电话提示声音后拿起电话,并发送应答信号

第四步:  发起端接到回音信号,通信建立。


从上面可以看出: 一个通话过程有2个端, 并且目标端能通过网络寻找到。


引申到Socket, socket也是由(IP,Port)组成。IP地址用来寻找接收端。

不同的地方在于,电话只提供一种服务,而soecket为了提供多种服务,增加了port.


接下来,对比了管道(Pipe)和Socket的差别。

在Linux系统中,网络也是一种特殊的文件,所以,Socket也支持文件的一般操作(open,close,read,write)。

不过,由于是一种特殊的文件,并不支持lseek操作。


功能上的相同点:

管道(pipe)和Socket均不支持lseek


不同点:

pile是先进先出(FIFO)的单向管道。而Socket是双向通信。


编程上的不同:

pipe使用:

#include <unistd.h>

int pipe(int fd[2]);     -> fd[0] 为接收端(Read), fd[1]为发送端(write)


socketpair使用:

#include <sys/types.h>

#include <sys/socket.h>

int socketpair(int domain, int type, int protocol, int sv[2]);

domain通常为AF_LOCAL, type有两种: SOCK_STREAM  TCP协议, SOCK_DGRAM UDP协议,

protocol不使用,定义为0,sv[0]与sv[1]为两个通信端。


小技巧:

可以使用netstat --unix -p | more  与lsof -i tcp 命令查看系统已建立的Socket连接信息。


接下来,关于socket的关闭,比较了close(sv[0]) 与shutdown(sv[0],SHUT_RD)的区别。

close(sv[0])的缺点:

1. dup/fork等操作后,当sv[0]存在复制版时,只有最后一个close才起作用。

2. 可能导致正在待处理中的数据丢失。


思考点:

pipe和socketpair什么时候用?

很明显,由于是无名的,无法跨进程使用,适用同一个进程的父子进程间通信。


应用举列:

1. 父进程调用socketpair创建两个socket端。

2. 调用fork创建一个子进程

子进程:

3. 调用write(sv[1],msg,msglen)向父进程发送Reques

4. 调用shutdown(sv[1], SHUT_WR)通知父进程消息发送完毕。

5. 调用read(sv[1],...)接收父进程的回应。

6.调用close(sv[1])关闭socket端。

父进程:

7. 调用read(sv[0],msg,msglen)接收子进程发送来的Request

8. 调用write(sv[0],...)发送父进程的回应。

9.调用close(sv[0])关闭socket端。

10调用waitpid(childpid,...)等待子进程结束。







展开阅读全文

没有更多推荐了,返回首页