偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

基于TCP的socket使用

網(wǎng)絡 網(wǎng)絡管理
TCP協(xié)議提供全雙工的通信服務,但是一般的客戶端/服務器程序的流程是由客戶端主動發(fā)起請求,服務器被動處理請求,一問一答的方式。在學習socketAPI時要注意應用程序和TCP協(xié)議層是如何交互的,下文為您介紹。

 數(shù)據(jù)傳輸?shù)倪^程:

建立連接后,TCP協(xié)議提供全雙工的通信服務,但是一般的客戶端/服務器程序的流程是由客戶端主動發(fā)起請求,服務器被動處理請求,一問一答的方式。因此,服務器從accept()返回后立刻調(diào)用read(),讀socket就像讀管道一樣,如果沒有數(shù)據(jù)到達就阻塞等待,這時客戶端調(diào)用write()發(fā)送請求給服務器,服務器收到后從read()返回,對客戶端的請求進行處理,在此期間客戶端調(diào)用read()阻塞等待服務器的應答,服務器調(diào)用write()將處理結果發(fā)回給客戶端,再次調(diào)用read()阻塞等待下一條請求,客戶端收到后從read()返回,發(fā)送下一條請求,如此循環(huán)下去。

如果客戶端沒有更多的請求了,就調(diào)用close()關閉連接,就像寫端關閉的管道一樣,服務器的read()返回0,這樣服務器就知道客戶端關閉了連接,也調(diào)用close()關閉連接。注意,任何一方調(diào)用close()后,連接的兩個傳輸方向都關閉,不能再發(fā)送數(shù)據(jù)了。如果一方調(diào)用shutdown()則連接處于半關閉狀態(tài),仍可接收對方發(fā)來的數(shù)據(jù)。

在學習socketAPI時要注意應用程序和TCP協(xié)議層是如何交互的:

*應用程序調(diào)用某個socket函數(shù)時TCP協(xié)議層完成什么動作,比如調(diào)用connect()會發(fā)出SYN段

*應用程序如何知道TCP協(xié)議層的狀態(tài)變化,比如從某個阻塞的socket函數(shù)返回就表明TCP協(xié)議收到了某些段, 再比如read()返回0就表明收到了FIN段.

最簡單的TCP網(wǎng)絡程序

Service.c 的作用是從客戶端讀字符,然后將每個字符轉換為大寫并回送給客戶端。


 

TCP之socket


 

TCP之socket

int socket(int family, inttype, int protocol);

socket()打開一個網(wǎng)絡通訊端口,如果成功的話,就像open()一樣返回一個文件描述符,應用程序可以像讀寫文件一樣用read/write在網(wǎng)絡上收發(fā)數(shù)據(jù),如果socket()調(diào)用出錯則返回-1。對于IPv4,family參數(shù)指定為AF_INET。對于TCP協(xié)議,type參數(shù)指定為SOCK_STREAM,表示面向流的傳輸協(xié)議。如果是UDP協(xié)議,則type參數(shù)指定為SOCK_DGRAM,表示面向數(shù)據(jù)報的傳輸協(xié)議。protocol參數(shù)的介紹從略,指定為0即可。

int bind(int sockfd, conststruct sockaddr *myaddr, socklen_t addrlen);

服務器程序所監(jiān)聽的網(wǎng)絡地址和端口號通常是固定不變的,客戶端程序得知服務器程序的地址和端口號后就可以向服務器發(fā)起連接,因此服務器需要調(diào)用bind綁定一個固定的網(wǎng)絡地址和端口號。bind()成功返回0,失敗返回-1。

bind()的作用是將參數(shù)sockfd和myaddr綁定在一起,使sockfd這個用于網(wǎng)絡通訊的文件描述符監(jiān)聽myaddr所描述的地址和端口號。前面講過,struct sockaddr *是一個通用指針類型,myaddr參數(shù)實際上可以接受多種協(xié)議的sockaddr結構體,而它們的長度各不相同,所以需要第三個參數(shù)addrlen指定結構體的長度.

int listen(int sockfd, intbacklog);

典型的服務器程序可以同時服務于多個客戶端,當有客戶端發(fā)起連接時,服務器調(diào)用的accept()返回并接受這個連接,如果有大量的客戶端發(fā)起連接而服務器來不及處理,尚未accept的客戶端就處于連接等待狀態(tài),listen()聲明sockfd處于監(jiān)聽狀態(tài),并且最多允許有backlog個客戶端處于連接待狀態(tài),如果接收到更多的連接請求就忽略。listen()成功返回0,失敗返回-1。

int accept(int sockfd, structsockaddr *cliaddr, socklen_t *addrlen);

三方握手完成后,服務器調(diào)用accept()接受連接,如果服務器調(diào)用accept()時還沒有客戶端的連接請求,就阻塞等待直到有客戶端連接上來。cliaddr是一個傳出參數(shù),accept()返回時傳出客戶端的地址和端口號。addrlen參數(shù)是一個傳入傳出參數(shù)(value-result argument),傳入的是調(diào)用者提供的緩沖區(qū)cliaddr的長度以避免緩沖區(qū)溢出問題,傳出的是客戶端地址結構體的實際長度(有可能沒有占滿調(diào)用者提供的緩沖區(qū))。如果給cliaddr參數(shù)傳NULL,表示不關心客戶端的地址。

由于客戶端不需要固定的端口號,因此不必調(diào)用bind(),客戶端的端口號由內(nèi)核自動分配。注意,客戶端不是不允許調(diào)用bind(),只是沒有必要調(diào)用bind()固定一個端口號,服務器也不是必須調(diào)用bind(),但如果服務器不調(diào)用bind(),內(nèi)核會自動給服務器分配監(jiān)聽端口,每次啟動服務器時端口號都不一樣,客戶端要連接服務器就會遇到麻煩。

int connect(int sockfd, conststruct sockaddr *servaddr, socklen_t addrlen);

客戶端需要調(diào)用connect()連接服務器,connect和bind的參數(shù)形式一致,區(qū)別在于bind的參數(shù)是自己的地址,而connect的參數(shù)是對方的地址。connect()成功返回0,出錯返回-1。

 

 

TCP之socket

 

 

sockaddr數(shù)據(jù)結構

 

責任編輯:何妍 來源: CSDN博客
相關推薦

2011-07-22 17:48:29

IOS Socket TCP

2012-03-19 11:41:30

JavaSocket

2015-04-24 11:03:53

2024-02-02 09:14:55

TCP協(xié)議Socket編程WPF

2010-01-21 11:19:44

TCP Socketlinux

2021-06-10 09:52:33

LinuxTCPAccept

2020-10-10 07:00:16

LinuxSocketTCP

2015-03-03 13:47:34

HttpTCPIP

2024-12-04 11:53:05

2021-02-22 10:05:30

連接池網(wǎng)絡前端

2021-03-19 11:32:20

TCPNVMeSSD

2021-08-04 08:55:02

Socket Java開發(fā)

2015-04-24 09:48:59

TCPsocketsocket編程

2019-08-26 09:50:15

TCP連接Socket

2020-10-14 14:31:37

LinuxTCP連接

2014-10-13 09:22:39

TCPIPwireshark

2009-08-13 16:27:07

C#基于TCP協(xié)議

2009-02-18 09:42:58

TCPISO傳輸

2011-01-18 11:50:51

Linuxsocket性能

2011-01-18 13:42:18

Linuxsocket性能
點贊
收藏

51CTO技術棧公眾號