套接字程式設計
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層介面與裝...