概念与技巧:
1.服务器端socket :目的和构造
2.客户端socket :目的和构造
3.客户/服务器协议
4.服务器协议:使用fork来接收多个请求
5.僵尸问题
6.HTTP
服务器设计重点:
基于 socket 的客户端/服务器系统大多是类似的。虽然电子邮件,文件传输,远程登录,分布式数据库,以及其他的 Internet 服务在内容上相异,但他们的运作原理是一致
理解 socket 流的客户/服务器系统
主要操作:
1.服务器设立服务
2.客户连接到服务器
3.服务器和客户处理事务
1.建立服务器端 socket
1.1.创建一个socket
socket=socket(PF_INET,SOCK_STREAM,0);
1.2.给socket 绑定一个地址
bind(sock, &addr, sizeof(addr));
1.3.监听接入请求
listen(sock, queque_size);
2.建立客户到服务器的连接
2.1.创建一个socket
socket=socket(PF_INET,SOCK_STREAM,0);
2.2.使用该socket连接到服务器
connect(sock,&serv_addr,sizeof(serv_addr));
3.客户/服务器的会话
可以使用专门的函数来建立服务器端的socket,同时也有专门的函数来连接到服务器。
服务器设计问题:DIY 或者代理
1.DIY:服务器接收请求,自己处理工作
使用场景:用于快速简单的任务
2.代理:服务器接收请求,然后创建一个新进程来处理工作
使用场景:慢速的更加复杂的任务。
数据报表的编程:
1.数据报 socket
2.TCP和UDP
3.许可证
4.时间戳
5.分布式系统
6.Unix域的socket
流socket 叫TCP网络
数据报 socket 叫UTP
TCP 和 UDP 的区别
TCP UDP
流 数据报
分片/重组 无
排序 无
可靠的 可能丢失
连接的 多个发送者
流socket 对传送负责,数据报则不。
UDP 对Web服务器和e-mail 服务器是较差的选择吗。
对 允许丢帧的声音和视频是较好的选择
数据报编程:目的地址,返回地址,消息
从socket 发送信息:sendto
#include <sys/types.h>
#include <sys/socket.h>
ssize_t ret=send(int sockfd, const void *buf, size_t len, int flags);
ssize_t ret=sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t ret=sendmsg(int sockfd, const struct msghdr *msg, int flags);
sockfd=socket id
buf=发送的数据,任意结构
len=发送数据长度
flags=发送的属性,0表示普通
dest_addr=远端socket地址的指针
addrlen=地址长度
ret:-1=错误,其余=发送的字符数
从 socket 接收消息 recfrom
#include <sys/types.h>
#include <sys/socket.h>
ssize_t ret=recv(int sockfd, void *buf, size_t len, int flags);
ssize_t ret=recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
ssize_t ret=recvmsg(int sockfd, struct msghdr *msg, int flags);
sockfd=socket id
buf=接收的数据
len=接收数据长度
flags=接收属性集合,0=普通
src_addr=发送端socket 地址指针
addrlen=发送端socket 地址长度
ret: -1=错误, 其余=接收的字符。
数据报 是从 socket 发送到另一个socket 的短消息。
发送者用sendto来指定消息、长度和目的地
接收者使用recvfrom接收消息
数据报和带有地址的Internet上传输的数据包的基本结构接近。
服务器现实的问题:客户端崩溃和服务器崩溃
分布式许可证服务器:服务器和客户端不在同一个机器
1.重复的进程ID
2.客户端资源回收
3.主机崩溃
Unix 域 socket
两种连接:流连接和数据报连接
两种socket地址:Internet 地址和 本地地址
Internet地址包含主机ID和端口号,本地地址叫做linux域地址,是一个文件名(如:/dev/log,/dev/printer 和 /tmp/lserversock),没有主机和端口号