概念與技巧:
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...