連線和協議 簡單的web伺服器

2022-09-08 07:12:09 字數 3235 閱讀 7045

概念與技巧:

1.伺服器端socket :目的和構造

2.客戶端socket :目的和構造

3.客戶/伺服器協議

4.伺服器協議:使用fork來接收多個請求

5.殭屍問題

伺服器設計重點:

基於 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

#include

ssize_t ret=send(int sockfd, const void *buf, size_t len, int flags);

ssize_tret=sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);

ssize_tret=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

#include

ssize_t ret=recv(int sockfd, void *buf, size_t len, int flags);

ssize_tret=recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);

ssize_tret=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

兩種連線:流連線和資料報連線

internet位址包含主機id和埠號,本地位址叫做linux域位址,是乙個檔名(如:/dev/log,/dev/printer 和 /tmp/lserversock),沒有主機和埠號

web伺服器 簡單web伺服器實現

三次握手 一般情況下是瀏覽器先傳送請求資料,c s ack 應答 三次握手成功後,才開始進行通訊資料的收發。四次揮手 一般情況下是客戶端先關閉,給瀏覽器傳送關閉資訊。如果瀏覽器傳送了關閉資訊,但是伺服器沒有回過去,較慢 那麼瀏覽器一直發是不是就會有問題?所以會等待 2msl的時間。一般為2 5分鐘。...

簡單的web伺服器 (1)HTTP協議

這段時間查詢如何實現乙個簡單的web伺服器的一些資料,發現了一些不太清楚的概念,下面是我找的一些資料以及我自己的理解 我自己的理解 簡單來說,超文字檔案可以理解成我們平時所說的鏈結。超文字檔案中包含有超連結,指向其他的資源,超文字檔案是全球資訊網 www 的基礎。我們平時使用瀏覽器時,都是點選乙個選...

簡單實現web伺服器

import multiprocessing import socket import re class webservice object def init self 建立套接字 self.socket server socket.socket socket.af inet,socket.sock...