linux 網路程式設計常用函式及流程

2022-08-21 12:09:11 字數 4674 閱讀 8991

一、網路程式設計之tcp流程

服務端:socket---bind---listen---while(1)---close

客戶端:socket----------------------------------connect---send---recv-----------------close

二、網路程式設計常用函式

伺服器端:

標頭檔案包含:

#include

#include

#include

#include

#include

#include

#include

#include

2. socket函式:生成乙個套介面描述符。

原型:int socket(int domain,int type,int protocol);

引數:domain->

type->{tcp:sock_streamudp:sock_dgram}

protocol->指定socket所使用的傳輸協議編號。通常為0.

返回值:成功則返回套介面描述符,失敗返回-1。

常用例項:int sfd = socket(af_inet, sock_stream, 0);

if(sfd == -1)

原型:int bind(int sockfd,struct sockaddr * my_addr,int addrlen);

引數:sockfd->為前面socket的返回值。

my_addr->為結構體指標變數

對於不同的socket domain定義了乙個通用的資料結構

struct sockaddr  //此結構體不常用

;此sockaddr結構會因使用不同的socket domain而有不同結構定義,

例如使用af_inet domain,其socketaddr結構定義便為

struct sockaddr_in  //常用的結構體

;struct in_addr

;addrlen->sockaddr的結構體長度。通常是計算sizeof(struct sockaddr);

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

常用例項:struct sockaddr_in my_addr;  //定義結構體變數

memset(&my_addr, 0, sizeof(struct sockaddr)); //將結構體清空

//或bzero(&my_addr, sizeof(struct sockaddr));

my_addr.sin_family = af_inet;  //表示採用ipv4網路協議

my_addr.sin_port = htons(8888);  //表示埠號為8888,通常是大於1024的乙個值。

//htons()用來將引數指定的16位hostshort轉換成網路字元順序

my_addr.sin_addr.s_addr = inet_addr("192.168.0.101"); //inet_addr()用來將ip位址字串轉換成網路所使用的二進位制數字,如果為inaddr_any,這表示伺服器自動填充本機ip位址。

if(bind(sfd, (struct sockaddr*)&my_str, sizeof(struct socketaddr)) == -1)

(注:通過將my_addr.sin_port置為0,函式會自動為你選擇乙個未占用的埠來使用。同樣,通過將my_addr.sin_addr.s_addr置為inaddr_any,系統會自動填入本機ip位址。)

4. listen函式:使伺服器的這個埠和ip處於監聽狀態,等待網路中某一客戶機的連線請求。如果客戶端有連線請求,埠就會接受這個連線。

原型:int listen(int sockfd,int backlog);

引數:sockfd->為前面socket的返回值.即sfd

backlog->指定同時能處理的最大連線要求,通常為10或者5。最大值可設至128

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

常用例項:if(listen(sfd, 10) == -1)

5. accept函式:接受遠端計算機的連線請求,建立起與客戶機之間的通訊連線。伺服器處於監聽狀態時,如果某時刻獲得客戶機的連線請求,此時並不是立即處理這個請求,而是將這個請求放在等待佇列中,當系統空閒時再處理客戶機的連線請求。當accept函式接受乙個連線時,會返回乙個新的socket識別符號,以後的資料傳輸和讀取就要通過這個新的socket編號來處理,原來引數中的socket也可以繼續使用,繼續監聽其它客戶機的連線請求。(也就是說,類似於移動營業廳,如果有客戶打**給10086,此時伺服器就會請求連線,處理一些事務之後,就通知乙個話務員接聽客戶的**,也就是說,後面的所有操作,此時已經於伺服器沒有關係,而是話務員跟客戶的交流。對應過來,客戶請求連線我們的伺服器,我們伺服器先做了一些繫結和監聽等等操作之後,如果允許連線,則呼叫accept函式產生乙個新的套接字,然後用這個新的套接字跟我們的客戶進行收發資料。也就是說,伺服器跟乙個客戶端連線成功,會有兩個套接字。)

原型:int accept(int s,struct sockaddr * addr,int * addrlen);

引數:s->為前面socket的返回值.即sfd

addr->為結構體指標變數,和bind的結構體是同種型別的,系統會把遠端主機的資訊(遠端主機的位址和埠號資訊)儲存到這個指標所指的結構體中。

addrlen->表示結構體的長度,為整型指標

返回值:成功則返回新的socket處理**new_fd,失敗返回-1

常用例項:struct sockaddr_in clientaddr;

memset(&clientaddr, 0, sizeof(struct sockaddr));

int addrlen = sizeof(struct sockaddr);

int new_fd = accept(sfd, (struct sockaddr*)&clientaddr, &addrlen);

if(new_fd == -1)

printf("%s %d success connect\n",inet_ntoa(clientaddr.sin_addr),ntohs(clientaddr.sin_port));

6. recv函式:用新的套接字來接收遠端主機傳來的資料,並把資料存到由引數buf 指向的記憶體空間

原型:int recv(int sockfd,void *buf,int len,unsigned int flags);

引數:sockfd->為前面accept的返回值.即new_fd,也就是新的套接字。

buf->表示緩衝區

len->表示緩衝區的長度

flags->通常為0

返回值:成功則返回實際接收到的字元數,可能會少於你所指定的接收長度。失敗返回-1

常用例項:char buf[512] = ;

if(recv(new_fd, buf, sizeof(buf), 0) == -1)

puts(buf);

7. send函式:用新的套接字傳送資料給指定的遠端主機

原型:int send(int s,const void * msg,int len,unsigned int flags);

引數:s->為前面accept的返回值.即new_fd

msg->一般為常量字串

len->表示長度

flags->通常為0

返回值:成功則返回實際傳送出去的字元數,可能會少於你所指定的傳送長度。失敗返回-1

常用例項:if(send(new_fd, "hello", 6, 0) == -1)

8. close函式:當使用完檔案後若已不再需要則可使用close()關閉該檔案,並且close()會讓資料寫回磁碟,並釋放該檔案所占用的資源

原型:int close(int fd);

引數:fd->為前面的sfd,new_fd

返回值:若檔案順利關閉則返回0,發生錯誤時返回-1

常用例項:close(new_fd);

close(sfd);

客戶端:

1. connect函式:用來請求連線遠端伺服器,將引數sockfd 的socket 連至引數serv_addr 指定的伺服器ip和埠號上去。

原型:int connect (int sockfd,struct sockaddr * serv_addr,int addrlen);

引數:sockfd->為前面socket的返回值,即sfd

serv_addr->為結構體指標變數,儲存著遠端伺服器的ip與埠號資訊。

addrlen->表示結構體變數的長度

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

常用例項:struct sockaddr_in seraddr;//請求連線伺服器

memset(&seraddr, 0, sizeof(struct sockaddr));

seraddr.sin_family = af_inet;

seraddr.sin_port = htons(8888); //伺服器的埠號

seraddr.sin_addr.s_addr = inet_addr("192.168.0.101");  //伺服器的ip

if(connect(sfd, (struct sockaddr*)&seraddr, sizeof(struct sockaddr)) == -1)

Linux網路程式設計常用函式

計算機資料儲存有兩種位元組優先順序 高位位元組優先和低位位元組優先。internet上資料以高位位元組優先順 序在網路上傳輸,所以對於在內部是以低位位元組優先方式儲存資料的機器,在internet上傳輸資料時就需 要進行轉換。我們要討論的第乙個結構型別是 struct sockaddr,該型別是用來...

Linux 網路程式設計常用函式詳解

sendto 經socket傳送資料 相關函式 send sendmsg,recv recvfrom socket 表頭檔案 include sys types.h include sys socket.h 定義函式 int sendto int s const void msg,int len,u...

linux網路程式設計常用函式詳解與例項

常用的網路命令 netstat telnet telnet是乙個用來遠端控制的程式,但是我們完全可以用這個程式來除錯我們的服務端程式的.比如我們的伺服器程式在監聽8888埠,我們可以用telnet localhost 8888來檢視服務端的狀況.網路函式描述和例項 int socket int do...