UNIX網路通訊

2022-08-27 06:15:10 字數 3118 閱讀 6755

國際標準化組織(iso)定義了網路協議的基本框架,被稱為osi模型。osi模型包括應用層、表示層、會話層、傳輸層、網路層、資料鏈路層及物理層。而osi模型過於複雜至今沒有得到實際的應用。

tcp/ip協議模型將osi的7層協議模型簡化為4層,從而更有利於實現和使用。tcp/ip協議模型包括應用層、傳輸層、網路層、網路介面層。

tcp/ip協議與osi模型的對應關係如下圖:

它是一種可以進行網路通訊的核心物件,它有乙個唯一的識別符號,一般稱它為socket描述符,跟檔案描述符類似,也可以用read/wrote/close操作。

int socket(int domain, int type, int protocol);/*

功能:建立socket物件

af_unix / af_local :本地程序間通訊

type:

sock_stream :資料流協議,tcp面向連線的通訊協議

優點:安全可靠,資料不丟失,但速度慢。

一般常用於安全性較高的場景

sock_dgram :資料報協議,udp面向無連線的通訊協議

優點:速度快,資料可能會丟失,安全性和可靠性於tcp相比不高

一般用於安全性要求不高,但對速度有要求的場景。

protocol:特殊協議一般不使用,直接寫 0

*/

本地通訊位址

struct sockaddr_un

網路通訊位址

struct sockaddr_in

準備好的通訊位址通常要將其強制轉換成基本通訊位址才能傳給函式使用。

int bind(int sockfd, const

struct sockaddr *addr,socklen_t addrlen);

//int connect(int sockfd, const

struct sockaddr *addr,socklen_t addrlen);

//功能:連線通訊目標

//socketaddr:目標位址

個人計算機系統資料的儲存方式可能是大端,也可能是小端,網路通訊時需要的是大端資料,必須把資料轉換成大端。

uint32_t htonl(uint32_t hostlong);

//功能:把32位的主機位元組序轉換成32位的網路位元組序

uint16_t htons(uint16_t hostshort);

//功能:把16位的主機位元組序轉換成16位的網路位元組序

uint32_t ntohl(uint32_t netlong);

//功能:把32為網路位元組序轉換成32位的主機位元組序

uint16_t ntohs(uint16_t netshort);

//功能:把16為網路位元組序轉換成16位的主機位元組序

生成埠號

埠號就是乙個16為的無符號整數

uint16_t htons(uint16_t hostshort);
生成ip位址

in_addr_t inet_addr(const

char *cp);

//char *inet_ntoa(struct in_addr in

);

//

程序a:建立socket物件->準備位址->繫結->接收資料和來時的位址->原路返回資料->關閉socket

程序b:建立socket物件->準備位址->向目標傳送資料->接收資料->關閉socket

當socket物件被全部關閉後,會在核心中停留一段時間(給乙個重新連線的機會),如果再使用同樣的ip位址和埠號時就會失敗(延時關閉)

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

//

//addrlen:是引數,要得到的src_addr的長度

ssize_t sendto(

int sockfd, const

void *buf, size_t len, int flags,const

struct sockaddr *dest_addr, socklen_t addrlen);

//功能:傳送資料到指定的目標

面向連線的網路通訊,在通訊過程中時刻保持連線,這種通訊方式類似與打**,能保證安全可靠、資料不丟失,但與udp相比傳輸速度略低。

程序a:建立socket->準備位址->繫結->監聽(設定佇列長度)->等待連線->通訊->關閉。

程序b;建立socket->準備位址->連線->通訊->關閉

int listen(int sockfd, int

backlog);

//功能:設定socket物件最大的排隊數量

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

//功能:等待其他主機與當前socket建立連線關係。

//返回值:建立連線的描述符,此後通訊都用此描述符

int connect(int sockfd, const

struct sockaddr *addr,socklen_t addrlen);

//功能:連線通訊目標

//socketaddr:目標位址

ssize_t recv(

int sockfd, void *buf, size_t len, int

flags);

//功能:網路通訊專用的資料接收

//flag: 0 阻塞

//1 不阻塞

//返回值:-1 時,說明連線斷開,此時應該結束迴圈

ssize_t send(

int sockfd, const

void *buf, size_t len, int

flags);

//功能:網路通訊專用的資料傳送

//返回值:-1 時,說明連線斷開 ,此時應該結束迴圈

C 網路通訊

c 網路通訊 一 伺服器端程式 10.17 1.建立伺服器端socket 1 使用socket類 建立伺服器socket物件 socket objs new socket 引數 使用ipendpoint類設定伺服器ip位址和埠號 或使用dns類 ipaddress serip ipaddress.p...

Winsock網路通訊

winsock網路通訊 這裡我希望和大家 一下winsock網上通訊的程式,由於網際網路的普及,越來越多的程式具有了在網上與其他程式通訊的功能.其實所有這些功能都建立在winsock介面之上,應用程式執行大多數網路通訊的基本物件稱為套介面或軟插口 socket 使用mfc winsocket類新增網...

Winsock網路通訊

winsock網路通訊 這裡我希望和大家 一下winsock網上通訊的程式,由於網際網路的普及,越來越多的程式具有了在網上與其他程式通訊的功能.其實所有這些功能都建立在winsock介面之上,應用程式執行大多數網路通訊的基本物件稱為套介面或軟插口 socket 使用mfc winsocket類新增網...