连接和协议:简单的web服务器

概念与技巧:

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),没有主机和端口号

 

上一篇:大白话说懂,“六字真诀”socket


下一篇:Linux通过手机USB网络共享上网