linux 網路程式設計

2021-06-03 12:49:37 字數 2990 閱讀 4985

套接字程式設計

struct sockaddr{

unsigned short sa_family;       //位址協議,ipv4 tcp/ip:af_inet,ipv6 :af_inet6

char   sa_data[14];     //14位元組的位址協議

struct sockaddr_in{

unsigned short            sin_family;                    //位址型別

unsigned short int    sin_port                          //埠號

struct  in_addr            sin_addr                         //ip位址

unsigned char            sin_zero[8];                    //填充位元組,一般賦值未0

通常在編寫基於tcp/ip協議的網路程式時,使用 結構體sockaddr_in來設定位址,然後通過強制型別轉化成sockaddr型別。

2 建立套接字

#include

#include

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

domain用於指定建立套接字所使用的協議組。常用的有:af_unix  建立只在本機內進行通訊的套接字,af_inte   ipv4 ,  af_inet6   ipv6

type指定套接字的型別     sock_stream   建立tcp流套接字  sock_dgram  建立udp資料報套接字

protocol 通常設定為0,表示通過引數domain指定的協議族和引數type指定的套接字型別來確定使用的協議。

建立鏈結

int connect(int sockfd,const  struct  sockaddr  *serv_addr, socklen_t  addrlen);  

繫結套接字

int bind(int sockfd, struct sockaddr *my_addr, socklen_t  addrlen);

在套接字上監聽

int   listen(int s,  int backlog)    //引數backlog指定了已經建立的鏈結最大長度

接受鏈結

int accept(int s,  struct sockaddr  *addr,  socklen_t *addrlen);//s是經bind繫結到本地某一埠上的,並有listen轉化而來的監聽套接字 ,  引數addr用來儲存發起鏈結請求的主機的位址和介面  ,addrlen是addr所指向的結構體大小。

tcp套接字的資料傳輸

傳送資料:  ssize_t send(int s, const void *msg, size_t len, int flags);   //s為已建立好鏈結的套接字描述符,msg指向存放待傳送資料的緩衝區,len為待傳送資料的長度,flags為控制長度:一般為msg_oob  傳送外待資料msg_dontroute通過最直接的路徑傳送資料

接收資料:  ssize_t recv(int s, void *buf, size_t len, int flags);

udp套接字的資料傳輸

傳送資料: ssize_t sendto(int s,const void *msg,size_t len,int flags,const struct sockaddr *to,socklen_t tolen);  //不需要套接字處於鏈結狀態,所以需要to指定目的位址

接收資料: recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t  *fromlen);//from儲存資料的源位址

關閉套接字

int close(int fd);

int shutdown(int s,int how);//how指定了關閉的方式:shut_rd讀通道關閉,但仍可傳送資料,shut_wr寫信道關閉,可接受資料,shut_rdwr讀寫通道都關閉

位元組順序和轉換函式

#include uint32_t htonl(uint32_t hostlong);//how to network long 將主機unsigned int 型資料轉化成網路位元組順序 

uint16_t htons(uint16_t hostshort);//how to network short 將主機unsigned short 型資料轉換成網路位元組順序

uint32_t ntohl(uint32_t netlong);//和htonl功能相反

uint16_t ntohs(uint16_t netshort);//和htons功能相反

inet 系列函式

#include #include #include int inet_aton(const char *cp, struct in_addr *inp);//將cp所指向的字串形式的ip位址轉換成為二進位制的網路位元組順序的ip位址,結果村於inp中

in_addr_t inet_addr(const char *cp);//和inet_aton功能相同,只不過它執行成功後將結果返回

in_addr_t inet_network(const char *cp);//將cp所指的字串形式的網路位址轉換為主機位元組順序形式的二進位制ip位址。

char *inet_ntoa(struct in_addr in);//將數值為in的網路位元組順序形式的二進位制ip轉化成點分十進位制字串形式

struct in_addr inet_makeaddr(int net, int host);//將主機號和網路號組合成乙個網路位址

in_addr_t inet_lnaof(struct in_addr in);//從in中提取出主機位址

in_addr_t inet_netof(struct in_addr in);//從in中提取出網路位址

Linux網路程式設計

linux網路程式設計 當然,我們現在,將要開始編寫的第乙個網路程式,雖然非常簡單,但是卻可以很 清楚的說明大部分編寫網路程式需要的基本概念,好了先讓我們看看網路程式的tcp服 務器端的編寫步驟 1.和伺服器的步驟一樣。2.通過設定套介面位址結構,我們說明,客戶端要與之通訊的伺服器的ip位址和 埠。...

linux 網路程式設計

當然,我們現在,將要開始編寫的第乙個網路程式,雖然非常簡單,但是卻可以很 清楚的說明大部分編寫網路程式需要的基本概念,好了先讓我們看看網路程式的tcp服 務器端的編寫步驟 現在讓我們來看看網路程式客戶端的程式設計步驟 以上的步驟,是比較普遍的,我們可以從中看出,編寫網路程式是很有意思的,同 時,也不...

Linux網路程式設計

1 tcp ip協議族 tcp ip為協議族,有很多子協議,為一族。tcp 傳輸控制協議 ip 網路協議 2 我們所做的為伺服器應用軟體開發,伺服器 有相應的硬體,作業系統 電腦也為伺服器,不過多了個顯示 3 協議棧 存放很多協議的地方叫做協議棧,其範圍是從協議無關層 如通用的socket層介面與裝...