網路通訊C S模型 TCP

2021-10-05 17:59:44 字數 2718 閱讀 5731

基本模型圖如下:

伺服器呼叫socket()bind()listen()完成初始化後,呼叫accept()阻塞等待,處於監聽埠的狀態,客戶端呼叫socket()初始化後,呼叫connect()發出syn段並阻塞等待伺服器應答,伺服器應答乙個syn-ack段,客戶端收到後從connect()返回,同時應答乙個ack段,伺服器收到後從accept()返回。

資料傳輸的過程:

建立連線後,tcp協議提供全雙工的通訊服務,但是一般的客戶端/伺服器程式的流程是由客戶端主動發起請求,伺服器被動處理請求,一問一答的方式。因此,伺服器從accept()返回後立刻呼叫read(),讀socket就像讀管道一樣,如果沒有資料到達就阻塞等待,這時客戶端呼叫write()傳送請求給伺服器,伺服器收到後從read()返回,對客戶端的請求進行處理,在此期間客戶端呼叫read()阻塞等待伺服器的應答,伺服器呼叫write()將處理結果發回給客戶端,再次呼叫read()阻塞等待下一條請求,客戶端收到後從read()返回,傳送下一條請求,如此迴圈下去。

如果客戶端沒有更多的請求了,就呼叫close()關閉連線,就像寫端關閉的管道一樣,伺服器的read()返回0,這樣伺服器就知道客戶端關閉了連線,也呼叫close()關閉連線。注意,任何一方呼叫close()後,連線的兩個傳輸方向都關閉,不能再傳送資料了。如果一方呼叫shutdown()則連線處於半關閉狀態,仍可接收對方發來的資料。

server

#include

#include

#include

#include

#include

#include

#include

#define maxline 80

#define serv_port 8080

intmain

(void

)return0;

}

client

#include

#include

#include

#include

#include

#include

#define maxline 80

#define serv_port 6666

intmain

(int argc,

char

*ar**)

str = ar**[1]

; sockfd =

socket

(af_inet, sock_stream,0)

;bzero

(&servaddr,

sizeof

(servaddr));

servaddr.sin_family = af_inet;

inet_pton

(af_inet,

"127.0.0.1"

,&servaddr.sin_addr)

; servaddr.sin_port =

htons

(serv_port)

;connect

(sockfd,

(struct sockaddr *

)&servaddr,

sizeof

(servaddr));

write

(sockfd, str,

strlen

(str));

n =read

(sockfd, buf, maxline)

;printf

("response from server:\n");

write

(stdout_fileno, buf, n)

;close

(sockfd)

;return0;

}

由於客戶端不需要固定的埠號,因此不必呼叫bind(),客戶端的埠號由核心自動分配。注意,客戶端不是不允許呼叫bind(),只是沒有必要呼叫bind()固定乙個埠號,伺服器也不是必須呼叫bind(),但如果伺服器不呼叫bind(),核心會自動給伺服器分配監聽埠,每次啟動伺服器時埠號都不一樣,客戶端要連線伺服器就會遇到麻煩。

客戶端和伺服器啟動後可以使用netstat命令檢視鏈結情況:

netstat -apn|grep 8080

linux網路通訊套接字C S模型

server.c include include include include include include include error.h define serv port 8888 intmain void write accprt fd,buf,n close sfd close accp...

通過TCP協議進行C S模式的網路通訊

通過tcp協議進行c s模式的網路通訊 1.sockaddr in 結構體 struct sockaddr in in addr 結構體 struct in addr in addr t 在標頭檔案 中定義,等價於 unsigned long,長度為4個位元組。也就是說,s addr 是乙個整數,而...

linux網路通訊二(TCP)

tcp通訊 流程圖如下 1 建立 socket套接字 相同2 繫結 將建立的socket套接字返回的控制代碼與本機的ip 埠繫結 相同3 監聽 監聽socket include int listen int s,int backlog s 監聽的控制代碼 backlog 監聽的最大數,預設20 成功...