国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于TCP/UDP的socket服務(wù)器搭建流程

這篇具有很好參考價值的文章主要介紹了基于TCP/UDP的socket服務(wù)器搭建流程。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

TCP/UDP概念介紹

一、TCP/UDP對比

  1. TCP面向連接(如打電話要先撥號建立連接);UDP是無連接的,即發(fā)送數(shù)據(jù)之前不需 要建立連接
  2. TCP提供可靠的服務(wù)。也就是說,通過TCP連接傳送的數(shù)據(jù),無差錯,不丟失,不重復(fù),且按序到達;UDP盡最大努力交付,即不保證可靠交付
  3. TCP面向字節(jié)流,實際上是TCP把數(shù)據(jù)看成一連串無結(jié)構(gòu)的字節(jié)流;UDP是面向報文的。UDP沒有擁塞控制,因此網(wǎng)絡(luò)出現(xiàn)擁塞不會使源主機的發(fā)送速率降低(對實時應(yīng)用很有用,如IP電話,實時視頻會議等)
  4. 每一條TCP連接只能是點到點的;UDP支持一對一,一對多,多對一和多對多的交互通信
  5. TCP首部開銷20字節(jié);UDP的首部開銷小,只有8個字節(jié)
  6. TCP的邏輯通信信道是全雙工的可靠信道,UDP則是不可靠信道

二、端口號的作用

一臺擁有IP地址的主機可以提供許多服務(wù),比如Web服務(wù)、FTP服務(wù)、SMTP服務(wù)等。這些服務(wù)完全可以通過1個IP地址來實現(xiàn)。那么,主機是怎樣區(qū)分不同的網(wǎng)絡(luò)服務(wù)呢?顯然不能只靠IP地址,因為IP 地址與網(wǎng)絡(luò)服務(wù)的關(guān)系是一對多的關(guān)系。
實際上是通過IP地址+端口號來區(qū) 分不同的服務(wù)的。
端口提供了一種訪問通道,服務(wù)器一般都是通過知名端口號來識別的。
例如,對于每個TCP/IP實現(xiàn)來說,F(xiàn)TP服務(wù)器的TCP端口號都是21,每個Telnet服務(wù)器的TCP端口號都是23,每個TFTP(簡單文件傳送協(xié)議)服務(wù)器的UDP端口號都是69

三、字節(jié)序

1、概念

字節(jié)序,就是多字節(jié)類型的數(shù)據(jù)在計算機內(nèi)存中存儲或者網(wǎng)絡(luò)傳輸時各字節(jié)的存放順序。是在跨平臺和網(wǎng)絡(luò)編程中,時常要考慮的問題

2、分類

字節(jié)序經(jīng)常被分為兩類:
1. Big-Endian(大端):高位字節(jié)排放在內(nèi)存的低地址端,低位字節(jié)排放在內(nèi)存的高地址端。
2.Little-Endian(小端):低位字節(jié)排放在內(nèi)存的低地址端,高位字節(jié)排放在內(nèi)存的高地址端。
3.網(wǎng)絡(luò)字節(jié)序=大端字節(jié)序

樣例介紹:
在內(nèi)存中雙字0x01020304(DWORD)的存儲方式
內(nèi)存地址
4000&4001&4002&4003
LE 04 03 02 01
BE 01 02 03 04

3、C程序在內(nèi)存空間的映射

C程序映射中內(nèi)存的空間布局大致如下:
最高內(nèi)存地址 0xFFFFFFFF
棧區(qū)(從高內(nèi)存地址,往 低內(nèi)存地址發(fā)展。即棧底在高地址,棧頂在低地址)
堆區(qū)(從低內(nèi)存地址 ,往 高內(nèi)存地址發(fā)展)
全局區(qū)(常量和全局變量)
代碼區(qū)
最低內(nèi)存地址 0x00000000

socket服務(wù)器與客戶端開發(fā)流程

一、流程介紹

基于TCP/UDP的socket服務(wù)器搭建流程
詳細說明文章來源地址http://www.zghlxwxcb.cn/news/detail-402565.html

  1. socket() 創(chuàng)建套接字
  2. bind() 為套接字添加信息(IP地址+端口號)
  3. listen() 監(jiān)聽網(wǎng)絡(luò)連接(客戶端接入)
  4. accept() 監(jiān)聽到有客戶端接入,接收一個連接
  5. read/write 數(shù)據(jù)交互
  6. close() 關(guān)閉套接字,斷開連接

二、socket服務(wù)器搭建API介紹

1、scoket() 創(chuàng)建套接字

//**創(chuàng)建套接字**
int socket(int domain, int type, int protocol);
 - domain:
指明所使用的協(xié)議族,通常為AF_INET,表示互聯(lián)網(wǎng)協(xié)議族(TCP/IP協(xié)議族)- AF_INET   IPv4因特網(wǎng)域
 - AF_INET6  IPv6因特網(wǎng)域
 - AF_UNIX   Unix域
 - AF_ROUTE  路由套接字
 - AF_KEY    秘鑰套接字
 - AF_UNSPEC 未指定

 - type:
 指定socket的類型:
 - SOCK_STREAM:
 流式套接字提供可靠的、面向連接的通信流;它使用TCP協(xié)議,從而保證了數(shù)據(jù)傳輸?shù)恼_性和順序性
 - SOCK_DGRAM:
數(shù)據(jù)報套接字定義了一種無連接的服務(wù),數(shù)據(jù)通過相互獨立的報文進行傳輸,是無序的,并且不保證是可靠、無差錯的。它使用數(shù)據(jù)報協(xié)議UDP。
 - SOCK_RAW:
允許程序使用低層協(xié)議,原始套接字允許對低層協(xié)議如IP或者ICMP進行直接訪問,功能強大但使用較為不便,主要用于一些協(xié)議棧的開發(fā)。

 - protocol:
通常賦值“0- 0選擇type類型對應(yīng)的默認協(xié)議 
 - IPPROTO_TCP   TCP傳輸協(xié)議 
 - IPPROTO_UDP   UDP傳輸協(xié)議
 - IPPROTO_SCTP  SCTP傳輸協(xié)議     
 - IPPROTO_SCTP  TIPC傳輸協(xié)議

2、bind() 將套接字與地址關(guān)聯(lián)

//關(guān)聯(lián)地址和套接字
#include <sys/types.h>    
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr,
        socklen_t addrlen);
功能:
	用于綁定IP地址和端口號到socketfd
參數(shù):
 - sockfd   是一個socket描述符
 - addr     是一個指向包含有本機IP地址及端口號等信息的sockaddr類型的指針,指向要綁定給
            sockfd的協(xié)議地址結(jié)構(gòu)。這個地址結(jié)構(gòu)根據(jù)地址創(chuàng)建socket時的地址協(xié)議族的不同而不同
 - addrlen  套接字的大小

IPv4對應(yīng)的是:
	struct sockaddr {
 		unsigned short sa_family;	//協(xié)議族
 		char        sa_data[14];	//IP+端口
	 }
同等替換:
	struct sockaddr_in {
 		sa_family_t     sin_family;	/*協(xié)議族*/
 		in_port_t	    sin_port;	/*端口號*/
 		struct in_addr  sin_addr;   /*IP地址結(jié)構(gòu)體*/
 		unsigned char   sin_zero[8]; /*填充 沒有實際意義,只是為跟sockaddr結(jié)構(gòu)在內(nèi)存中對齊,這樣兩者才能相互轉(zhuǎn)換*/
	 }

3、地址轉(zhuǎn)換API

1. 把字符串形式的“192.168.1.123”轉(zhuǎn)為網(wǎng)絡(luò)能識別的格式
int inet_aton(const char* straddr,struct in_addr *addrp);
功能:
	將一個字符串表示的點分十進制IP地址IP轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序存儲在addr中,并且返回該網(wǎng)絡(luò)字節(jié)序表示的無符號整數(shù)。
參數(shù):
	const char *straddr: 我們輸入的點分十進制的IP地址
	struct in_addr* addr: 將IP轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序(大端存儲)后并保存在addr中
返回值:
	成功;返回點分十進制的IP地址對應(yīng)的網(wǎng)絡(luò)字節(jié)序表示的無符號整數(shù)
	失??;返回0
2. 把網(wǎng)絡(luò)格式的ip地址轉(zhuǎn)為字符串形式
char* inet_ntoa(struct in_addr inaddr); 
功能:
	將一個網(wǎng)絡(luò)字節(jié)序的IP地址(也就是結(jié)構(gòu)體in_addr類型變量)轉(zhuǎn)化為點分十進制的IP地址(字符串)
參數(shù):
	struct in_addr{    
		in_addr_t s_addr;
	};
	in_addr是一個按網(wǎng)絡(luò)順序存儲的IP地址
返回值:
	該函數(shù)的返回值是一個字符串,這個字符串是點分十進制的IP地址

4、listen() 監(jiān)聽

//監(jiān)聽設(shè)置函數(shù)
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int listen(int sockfd, int backlog);
功能:
 - 設(shè)置能處理的最大連接數(shù),listen()并未開始接收連線,只是設(shè)置socket的listen模式,listen函數(shù)只用于服務(wù)器端,服務(wù)器進程不知道要與誰連接,
   因此,它不會主動地要求與某個進程連接,只是一直監(jiān)聽是否有其他客戶進程與之連接,然后響應(yīng)該連接請求,并對它作出處理,一個服務(wù)進程可以同時處理多個客戶進程的連接。
   主要就兩個功能:將一個未連接的套接字轉(zhuǎn)換為一個被動套接字(監(jiān)聽),規(guī)定內(nèi)核為相應(yīng)套接字排隊的最大連接數(shù)。
 - 內(nèi)核為任何一個給定監(jiān)聽套接字維護兩個隊列:
 	 - 未完成連接隊列,每個這樣的SYN報文端對應(yīng)其中一項;已由某個客戶端發(fā)出并到達服務(wù)器,而服務(wù)器正在等待完成相應(yīng)的TCP三次握手過程。這些套接字處于SYN_REVD狀態(tài)。
 	 - 已完成連接隊列,每個已完成TCP三次握手過程的客戶端對應(yīng)其中一項。這些套接字處于ESTABLISHED狀態(tài)
參數(shù):
	- sockfd:sockfd是socket系統(tǒng)調(diào)用返回的服務(wù)端socket描述符
	- backlog:backlog指定在請求隊列中允許的最大請求數(shù)

5、accept 連接

#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
功能:
	accept函數(shù)由TCP服務(wù)器調(diào)用,用于從已完成連接隊列隊頭返回下一個已完成連接。如果已完成連接隊列為空,那么進程進入睡眠。
參數(shù):
	sockfd: 是socket系統(tǒng)調(diào)用返回的服務(wù)器端socket描述符
	addr:   用來返回已連接的對端(客戶端)的協(xié)議地址
	addrled:客戶端地址長度
返回值:
	該函數(shù)的返回值是一個新的套接字描述符,返回值是表示已經(jīng)連接的套接字描述符,而第一個參數(shù)是服務(wù)器監(jiān)聽套接字描述符。
	一個服務(wù)器通常僅僅創(chuàng)建一個監(jiān)聽套接字,它在該服務(wù)器的生命周期內(nèi)一直存在。
	內(nèi)核為每個由服務(wù)器進程接收的客戶連接創(chuàng)建一個已連接套接字(表示TCP三次握手已經(jīng)完成),當服務(wù)器完成對某個給定客戶的服務(wù)時,相應(yīng)的已連接套接字就會被關(guān)閉。

6、數(shù)據(jù)收發(fā)

//字節(jié)流讀取函數(shù)
在套接字通信中進行字節(jié)讀取函數(shù):read(),write().與I/O中的讀取函數(shù)略有區(qū)別,因為他們輸入或輸出的字節(jié)數(shù)可能比請求的少。
ssize_t write(int fd, const void*buf,size_t nbytes);
ssize_t read(int fd,void *buf,size_t nbyte);
/*說明
*函數(shù)均返回讀或?qū)懙淖止?jié)個數(shù),出錯則返回-1
*/
第一個將buf中的nbytes個字節(jié)寫入到文件描述符fd中,成功時返回寫的字節(jié)數(shù)。
第二個為從fd中讀取nbyte個字節(jié)到buf中,返回實際所讀的字節(jié)數(shù)。詳細應(yīng)用說明參考使用read、write讀寫socket(套節(jié)字)。
網(wǎng)絡(luò)I/O還有一些函數(shù),例如:recv()/send(),readv()/writev(),recvmsg()/sendmsg(),recvfrom()/sendto()等。

數(shù)據(jù)收發(fā)常用第二套API
1.在TCP套接字上發(fā)送數(shù)據(jù)函數(shù):有連接
ssize_t send(int s,const void *msg,size_t len,int flags);
//包含3要素:套接字s,待發(fā)數(shù)據(jù)msg,數(shù)據(jù)長度len
//函數(shù)只能對處于連接狀態(tài)的套接字使用,參數(shù)s為已建立好連接的套接字描述符,即accept函數(shù)的返回值
//參數(shù)msg指向存放待發(fā)送數(shù)據(jù)的緩沖區(qū)
//參數(shù)len為待發(fā)送數(shù)據(jù)的長度,參數(shù)flags為控制選項,一般設(shè)置為0
2.在TCP套接字上接收數(shù)據(jù)函數(shù):有連接
ssize_t recv(int s,void *buf,size_t len,int flags);
//包含3要素:套接字s,待發(fā)數(shù)據(jù)msg,數(shù)據(jù)長度len
//函數(shù)recv從參數(shù)s所指定的套接描述符(必須是面向連接的套接字)上接收
//數(shù)據(jù)并保存到參數(shù)buf所指定的緩沖區(qū)
//參數(shù)len則為緩沖區(qū)長度,參數(shù)flags為控制選項,一般設(shè)置為0

7、connect()

//客戶機連接主機
#include <sys/types.h>      
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr,
                   socklen_t addrlen);
功能:
	該函數(shù)用于綁定之后的client端(客戶端),與服務(wù)器建立連接
參數(shù):
sockfd:是目的服務(wù)器的socket描述符
addr:是服務(wù)器端的IP地址和端口號的地址結(jié)構(gòu)指針
addrlen:地址長度常設(shè)置為sizeof(struct sockaddr)
返回值:
成功返回0,遇到錯誤時返回-1,并且errno中包含相應(yīng)的錯誤碼

到了這里,關(guān)于基于TCP/UDP的socket服務(wù)器搭建流程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • C#上位機基礎(chǔ)學(xué)習(xí)_基于SOCKET實現(xiàn)與PLC服務(wù)器的TCP通信(一)

    C#上位機基礎(chǔ)學(xué)習(xí)_基于SOCKET實現(xiàn)與PLC服務(wù)器的TCP通信(一)

    測試軟件: TIA PORTAL V15.1 S7-PLCSIM ADVANCED V3.0 Visual Studio 2019 如下圖所示,打開S7-PLCSIM ADVANCED V3.0仿真軟件,新鍵一個實例,設(shè)置仿真PLC的IP地址等參數(shù),然后點擊Start激活PLC, 如下圖所示,激活PLC后,可以看到已經(jīng)存在一個實例, 如下圖所示,打開TIA PORTAL V15.1,新建一個項目,

    2023年04月15日
    瀏覽(21)
  • 《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于UDP的服務(wù)器端/客戶端

    《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于UDP的服務(wù)器端/客戶端

    目錄 1--TCP和UDP的主要區(qū)別 2--基于 UDP 的數(shù)據(jù) I/O 函數(shù) 3--基于 UDP 的回聲服務(wù)器端/客戶端 4--UDP客戶端Socket的地址分配 5--UDP存在數(shù)據(jù)邊界 6--UDP已連接與未連接的設(shè)置 ① TCP 提供的是可靠數(shù)據(jù)傳輸服務(wù),而 UDP 提供的是不可靠數(shù)據(jù)傳輸服務(wù); ② UDP 在結(jié)構(gòu)上比 TCP 更簡潔,其不會

    2024年02月09日
    瀏覽(53)
  • 基于c++的簡易web服務(wù)器搭建(初嘗socket編程)

    基于c++的簡易web服務(wù)器搭建(初嘗socket編程)

    用 Socket 編程實現(xiàn)一個 Web 服務(wù)器(端口號 8080) 實驗要求: 該 Web 服務(wù)器在一臺主機上運行,支持多臺主機同時訪問 有服務(wù)控制界面,開啟和關(guān)閉按鈕 能夠指定主頁(index.html) 測試方法: 在同組其他主機上,打開瀏覽器,輸入 http://主機 IP 地址:8080,瀏覽器上顯示主頁

    2023年04月08日
    瀏覽(29)
  • 【python】TCP socket服務(wù)器 Demo

    【python】TCP socket服務(wù)器 Demo

    目錄 一、單線程服務(wù)器 二、多線程服務(wù)器 三、多線程服務(wù)器(發(fā)送和接收分離) 說明:只能連接一個客戶端 客戶端測試結(jié)果: 服務(wù)端測試結(jié)果: ?說明:可以支持連接多個客戶端 客戶端測試結(jié)果:? 服務(wù)端測試結(jié)果: 說明:?可以支持連接多個客戶端,并且能夠做到和多

    2024年02月09日
    瀏覽(22)
  • 【網(wǎng)絡(luò)原理】使用Java基于TCP搭建簡單客戶端與服務(wù)器通信

    【網(wǎng)絡(luò)原理】使用Java基于TCP搭建簡單客戶端與服務(wù)器通信

    TCP服務(wù)器與客戶端的搭建需要借助以下API ServerSocket 是創(chuàng)建TCP服務(wù)端Socket的API。 ServerSocket 構(gòu)造方法 : 方法簽名 方法說明 ServerSocket(int port) 創(chuàng)建一個服務(wù)端流套接字Socket,并綁定到指定端口 ServerSocket 方法: 方法簽名 方法說明 Socket accept() 開始監(jiān)聽指定端口(創(chuàng)建時綁定的端

    2024年03月12日
    瀏覽(34)
  • 云服務(wù)器:開放TCP、UDP端口

    云服務(wù)器:開放TCP、UDP端口

    ????????眾所周知,電腦設(shè)備有些端口默認是不開放的,我們使用TCP或者UDP去連接沒有開放端口時就會被防火墻攔截,所以就需要到電腦防火墻設(shè)置里面把需要用到的端口開放出來。操作如下: ????????1.打開防火墻(可以直接搜索) ????????2.新建規(guī)則 ??????

    2024年02月03日
    瀏覽(25)
  • 使用Socket實現(xiàn)TCP版的回顯服務(wù)器

    使用Socket實現(xiàn)TCP版的回顯服務(wù)器

    Socket(Java套接字)是Java編程語言提供的一組類和接口,用于實現(xiàn)網(wǎng)絡(luò)通信。它基于Socket編程接口,提供了一種簡單而強大的方式來實現(xiàn)網(wǎng)絡(luò)應(yīng)用程序。 Socket類庫提供了豐富的方法和功能,用于處理網(wǎng)絡(luò)通信的各個方面。它支持TCP和UDP協(xié)議,可以實現(xiàn)可靠的、面向連接的通信

    2024年02月14日
    瀏覽(20)
  • Linux網(wǎng)絡(luò)編程:socket、客戶端服務(wù)器端使用socket通信(TCP)

    Linux網(wǎng)絡(luò)編程:socket、客戶端服務(wù)器端使用socket通信(TCP)

    socket(套接字),用于網(wǎng)絡(luò)中不同主機間進程的通信。 socket是一個偽文件,包含讀緩沖區(qū)、寫緩沖區(qū)。 socket必須成對出現(xiàn)。 socket可以建立主機進程間的通信,但需要協(xié)議(IPV4、IPV6等)、port端口、IP地址。 ??????? ?(1)創(chuàng)建流式socket套接字。 ? ? ? ? ? ? ? ? a)此s

    2024年02月11日
    瀏覽(33)
  • 【網(wǎng)絡(luò)編程】實現(xiàn)UDP/TCP客戶端、服務(wù)器

    【網(wǎng)絡(luò)編程】實現(xiàn)UDP/TCP客戶端、服務(wù)器

    需要云服務(wù)器等云產(chǎn)品來學(xué)習(xí)Linux的同學(xué)可以移步/--騰訊云--/--阿里云--/--華為云--/官網(wǎng),輕量型云服務(wù)器低至112元/年,新用戶首次下單享超低折扣。 ? 目錄 一、UDP 1、Linux客戶端、服務(wù)器 1.1udpServer.hpp 1.2udpServer.cc 1.3udpClient.hpp 1.4udpClient.cc 1.5onlineUser.hpp 2、Windows客戶端 二、T

    2024年02月06日
    瀏覽(19)
  • Socket網(wǎng)絡(luò)編程(TCP/IP)實現(xiàn)服務(wù)器/客戶端通信。

    Socket網(wǎng)絡(luò)編程(TCP/IP)實現(xiàn)服務(wù)器/客戶端通信。

    一.前言 回顧之前進程間通信(無名管道,有名管道,消息隊列,共享內(nèi)存,信號,信號量),都是在同一主機由內(nèi)核來完成的通信。 那不同主機間該怎么通信呢? 可以使用Socket編程來實現(xiàn)。 Socket編程可以通過網(wǎng)絡(luò)來實現(xiàn)實現(xiàn)不同主機之間的通訊。 二.Socket編程的網(wǎng)絡(luò)模型如

    2024年02月08日
    瀏覽(37)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包