Linux網路程式設計基礎 一

2021-08-11 00:25:55 字數 3775 閱讀 2503

1、怎樣完成網路程式設計

伺服器:提供資料的為伺服器;

客戶端:獲取資料的為客戶端;

2、協議的選擇

tcp:面向連線,可靠的流式服務;

udp:無連線的,不可靠的,資料報服務;

3、tcp的程式設計流程

sever(伺服器端):

建立socket

#include

#include

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

/*domain:告訴系統使用哪個底層協議,使用tcp/ip協議將引數設定為:pf_inet,使用unix本地域協議族則將引數設定為pf_unix;

type:指定服務型別,主要有sock_stream服務(流服務)和sock_ugram(資料報)服務,分別表示傳輸層使用tcp協議和udp協議;

protocol:在前兩個引數構成的協議集合下,再選擇乙個具體的協議,一般我們把它設定為0;

*/

繫結或命名socket

#include#includeint bind(int sockfd,const struct sockaddr*

my_addr,socket_len addrlen);

/*bind將my_addr所指的sockfd位址分配給未命名的sockfd檔案識別符號,addrlen引數指出該socket位址的長度;

bind成功返回0,失敗返回-1並設定errno。

*//*struct sockaddr*

我們一般不使用這個結構體,通常使用struct sockaddr_in*,在傳參的時候需要進行強轉,定義如下:

struct sockaddr_in 

;struct sin_addr;

*/

監聽socket

#inckude

int listen(int sockfd,int backlog);

/*sockfd:指定被監聽的socket;

backlog:提示核心監聽佇列的最大長度;

返回值:成功時返回0,失敗時返回-1並設定errno;

*/

接收連線

#include

#include

int accept(int sockfd,struct sockaddr *addr,

socklen_t  *addrlen);

/*sockfd:執行過listen系統呼叫的監聽socket;

addr:用來獲取被接受連線的遠端sockfd位址;

addrlen:socket位址的長度;

返回值:成功時返回乙個新的連線socket,伺服器可通過讀寫該

socket來與被接受連線對應的客戶端通訊;失敗時返回-1

並設定errno。

*/

tcp資料讀寫

#include

#include

ssize_t recv(int sockfd,void* buf,size_t len,int flags);

/*recv讀取sockfd上的資料,buf和len引數分別指定讀取緩衝區的位置和大小,flags通常設定為0;

recv成功時返回實際讀取到的資料長度,它可能小於我們希望讀取到的資料長度,因此可能需要多次呼叫recv才能讀取到完整的資料;recv可能返回0說明通訊對方已關閉連線;recv出錯時返回-1.

*/ssize_t send(int sockfd,const

void *buf,size_t len,int flags);

/*send往sockfd上寫入資料,buf和len引數分別指定寫緩衝區的

大小;send成功時返回實際寫入的資料的長度,失敗時返回-1;

*/

關閉連線

#include

int close(int fd);

/*fd:帶關閉的socket;

close呼叫並不是立即關閉乙個連線,而是將fd的引用計數減

1,只用當fd的引用計數為0時,才真正關閉連線。

*///立即終止連線

#include

int shutdown(int sockfd,int howto);

/*sockfd:待關閉的socket;

howto:shutdown的行為;

返回值:成功返回0,失敗返回-1.

*/

客戶端:

與伺服器端程式設計流程相似,不同的是,建立socket後不需要監

聽和接受連線,而是發起連線,下來同樣是資料讀寫和關閉連線。

//發起連線

#include

#include

int connect(int sockfd,const

struct sockaddr*

serv_addr,socklen_t addrlen );

/*sockfd:由socket呼叫返回的乙個socket;

serv_addr:伺服器監聽的socket位址;

addrlen:指定伺服器監聽的socket位址的長度;

返回值:成功返回0,即成功建立連線,客戶端通過讀寫

sockfd來與伺服器端通訊;失敗則返回-1.

*/

4、tcp程式設計練習

伺服器端 ser.c

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

void fun(int sign)

void main()

pid_t n = fork();

assert(n != -1);

if(n == 0)

;int n = recv(c, buff, 127, 0);

if(n <= 0)

printf("addr::%s port::%d\n",

inet_ntoa(cli.sin_addr), ntohs(cli.sin_port));

printf("%s\n", buff);

send(c, "ok", 2, 0);

}printf("%d unlink\n", c);

close(c);

exit(0);

}close(c);

}}

客戶端  cli.c

#include 

#include

#include

#include

#include

#include

#include

#include

#include

void main()

; fgets(buff, 128, stdin);

if(strncmp(buff, "end", 3) == 0)

send(sockfd, buff, strlen(buff) - 1, 0);

memset(buff, 0, 128);

recv(sockfd, buff, 127, 0);

printf("%s\n", buff);

}}

linux網路程式設計基礎(一)

一 資料儲存順序 大端和小端 高位位元組儲存高位元組稱為小端模式,通常都計算機採用這個模式儲存。而網路則採用大端傳輸。所以需要轉換 面試有時會出這麼個題 寫乙個程式判斷程式的儲存是大端還是小端?程式的原理見下圖 include includeunion wordc int check int mai...

Linux網路程式設計(一)基礎

一 資料儲存順序 大端和小端 大端模式 位址的增長順序與值的增長順序相反 小段模式 位址的增長順序與值的增長順序相同 為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為8bit。但是在c語言中除了8bit的char之外,還有16b...

linux網路程式設計基礎 網路基礎

客戶機 client 伺服器 server 模式。需要在通訊兩端各自部署客戶機和伺服器來完成資料通訊。瀏覽器 browser 伺服器 server 模式。只需在一端部署伺服器,而另外一端使用每台pc都預設配置的瀏覽器即可完成資料的傳輸。c s模式 優點缺點 資料快取本地,效率高 工作量大,開發周期更...