伺服器端:
建立socket:int socket(int domain, int type, int protocal);
引數1:域 af_inet(ipv4) af_inet6 (ipv6)
引數2:型別 sock_dgram(udp協議) sock_stream (tcp協議)
引數3:預設0即可
引數1:socket描述符
引數2:位址結構體
//通用的位址【此處所用的結構體】
struct sockaddr
//ipv4位址【ipv4專用,我們平常所用的最多】
struct sockaddr_in
struct in_addr
in_addr_t inet_addr(const char* cp); //將192.168.1.1轉化為整數型的ip位址(網路位元組序)
舉例:in_addr.saddr = inet_addr(「192.168.1.1」 );
char *inet_ntoa (struct in_addr) //將整數形式的ip位址轉化為字串形式的ip位址
補充2:網路位元組序
補充2.1:大端和小端模式
要想知道網路位元組序是什麼?首先需要知道大端和小端模式;簡而言之:大端模式,是指資料的高位元組儲存在記憶體的低位址中,而資料的低位元組儲存在記憶體的高位址中 ;小端模式,是指資料的高位元組儲存在記憶體的高位址中,而資料的低位元組儲存在記憶體的低位址中 ;
具體知識請參考
我們自己電腦可能是大端,也可能是小端的;同樣,別人的電腦也有可能是大端或者小端的,所以在網路上傳輸資料時,我們就需要統一他們的大小端模式。
規定網路中傳輸的是大端模式,所以網路位元組序是大端模式的;
主機位元組序和網路位元組序轉化函式:
uint32_t htonl(uint32_t hostlong); //將32位的資料從主機位元組序轉換為網路位元組序
//舉例: in_addr.saddr = htonl(inaddr_any)
uint16_t htons(uint16_t hostshort); //將16位的資料從主機位元組序轉換為網路位元組序
uint32_t ntohl(uint32_t netlong); //將32位的資料從網路位元組序轉換為主機位元組序
uint16_t ntohs(uint16_t netshort); //將16位的資料從網路位元組序轉換為主機位元組序
監聽:int listen(int sockfd, int backlog);
引數1:socket描述符
引數2:backlog 允許連線的客戶機的數目
等待連線:int accept(int sockfd, struct sockaddr* restrict addr, socklen_t* restrict len);
引數1:socket描述符
返回值:新的套接字的fd(記住了:以後收發用這個新的sockfd哦!)
傳送:ssize_t send(int sockfd, const void* buf, size_t nbytes, int flags);
引數1:新的套接字的fd(accept的返回值)
引數2:要傳送的資料
引數3:資料的長度
引數4:預設為0即可
接收:ssize_t recv(int sockfd, void* buf, size_t nbytes, int flags);
關閉連線close():
客戶機端:
連線伺服器:connect(int sockfd, const struct sockaddr* addr, socklen_t len);
引數1:socket描述符
引數3:位址長度—整形
其餘函式參考伺服器端的講解。
**:伺服器code:
#include
#include
#include
#include
#define portnum 3333
int main()
設定要繫結的位址
bzero(&server_addr, sizeof(struct sockaddr_in));
server_addr.sin_family = af_inet;
server_addr.sin_port = htons(portnum); //位元組序(大小端)
server_addr.sin_addr.s_addr = htonl(inaddr_any);
//2.繫結位址
bind(sockfd,(struct sockaddr*)(&server_addr),sizeof(struct sockaddr));
//3.監聽埠
listen(sockfd,5);
while(1)
close(sockfd);
return 0;
}
客戶端code:
#include
#include
#include
#include
#define portnum 3333
int main()
設定要連線的伺服器的位址
bzero(&server_addr, sizeof(struct sockaddr_in));
server_addr.sin_family = af_inet;
server_addr.sin_port = htons(portnum);
server_addr.sin_addr.s_addr = inet_addr("192.168.103.100");
//2.連線伺服器
if(connect(sockfd,(struct sockaddr*)(&server_addr),sizeof(struct sockaddr)) == -1)
//3.傳送資料到伺服器
printf("please input char:\n");
fgets(buffer,128,stdin);
send(sockfd, buffer, strlen(buffer), 0);
//4.關閉連線
close(sockfd);
return 0;}
01、網路協議入門
02、lan、wan、wlan、vlan 和 vpn 的區別
03、ip 位址介紹
04、廣播位址介紹
05、無連線和面向連線協議的區別
06、網際網路的ip協議是不可靠無連線的,那為何當初不直接把它設計為可靠?
07、c/s和b/s架構的區別
09、套接字的介紹
10、udp程式設計
11、繫結( bind )埠需要注意的問題
12、udp廣播
13、udp多播
14、tcp程式設計
15、tcp中connect()、listen()和accept()三者的關係
16、** tcp 三次握手和四次揮手
17、併發伺服器的三種實現模型
18、原始套接字能幹什麼?
19、原始套接字程式設計
20、原始套接字例項:mac 頭部報文分析
22、ip 資料報格式詳解
23、tcp 和 udp 資料報格式詳解
24、原始套接字例項:傳送 udp 資料報
25、libpcap詳解
26、libnet使用指南
四、拓展知識篇
27、防毒軟體和防火牆的區別
28、iptables使用說明
29、內網和外網之間的通訊
30、抓包工具 wireshark 使用介紹
Linux網路程式設計
linux網路程式設計 當然,我們現在,將要開始編寫的第乙個網路程式,雖然非常簡單,但是卻可以很 清楚的說明大部分編寫網路程式需要的基本概念,好了先讓我們看看網路程式的tcp服 務器端的編寫步驟 1.和伺服器的步驟一樣。2.通過設定套介面位址結構,我們說明,客戶端要與之通訊的伺服器的ip位址和 埠。...
linux 網路程式設計
當然,我們現在,將要開始編寫的第乙個網路程式,雖然非常簡單,但是卻可以很 清楚的說明大部分編寫網路程式需要的基本概念,好了先讓我們看看網路程式的tcp服 務器端的編寫步驟 現在讓我們來看看網路程式客戶端的程式設計步驟 以上的步驟,是比較普遍的,我們可以從中看出,編寫網路程式是很有意思的,同 時,也不...
linux 網路程式設計
套接字程式設計 struct sockaddr unsigned short sa family 位址協議,ipv4 tcp ip af inet,ipv6 af inet6 char sa data 14 14位元組的位址協議 struct sockaddr in unsigned short s...