Linux網路程式設計(2) UDP客戶服務程式設計

2021-06-25 18:07:21 字數 2915 閱讀 8763

udp,即使用者資料報協議,是一種無連線的傳輸層協議。如何利用套接字實現乙個udp通訊。其套接字程式設計流程圖如下:

函式原型:

ssize_t recvfrom(int s,void *buf,size_t len,int flags,struct sockaddr *from,socklen_t *fromlen);
引數說明:

s:接收端套接字

buf:接收端緩衝區

len:接收端緩衝區長度

flags:操作標誌,通常為0。常用的值還有以下幾個:

msg_peek:返回的資料不會在系統內刪除

msg_waitall:強迫接收到len大小的資料後才返回

msg_nosignal:不會被sigpipe訊號中斷

返回值:如果函式執行成功,返回接收到的字元數。

2)sendto函式

函式原型:

ssize_t sendto(int s,const void *buf,size_t len,int flags,const struct sockaddr*to,socklen_t tolen);
引數說明:

s:連線至遠端主機的套接字

buf:傳送資料的緩衝區

len:緩衝區長度

flags:操作標誌,通常是0.常用的有如下幾個:

msg_dontwait:非阻塞傳送

msg_nosignal:不會被sigpipe訊號中斷

返回值:如果執行成功則返回傳送到的字元數

udo通訊例程:

#include #include #include #include #include #include #include #include #include #define server_port 8888

#define max_msg_size 1024

void udps_respon(int sockfd)

}int main(void)

/********服務端填充sockaddr結構********/

bzero(&addr,sizeof(struct sockaddr_in));

addr.sin_family=af_inet;

addr.sin_addr.s_addr=htonl(inaddr_any);

addr.sin_port=htons(server_port);

/**********描述符***********/

if(bind(sockfd,(struct sockaddr*) &addr,sizeof(struct sockaddr_in))<0)

udps_respon(sockfd);

close(sockfd);

}

udp_client.c

#include #include #include #include #include #include #include #include #include #include #define server_port 8888

#define max_buf_size 1024

void udpc_requ(int sockfd,const struct sockaddr_in *addr,int len)

}int main(int argc,int **argv)

/*****建立sockfd套接字********/

sockfd=socket(af_inet,sock_dgram,0);

if(sockfd<0)

/***********填充伺服器端資料*******************/

bzero(&addr,sizeof(struct sockaddr_in));

addr.sin_family=af_inet;

addr.sin_port=htons(server_port);

if(inet_aton(argv[1],&addr.sin_addr)<0)

udpc_requ(sockfd,&addr,sizeof(struct sockaddr_in));

close(sockfd);

}

問題描述一:關於udp與tcp之間的區別:

tcp——面向有向連線,可靠的位元組流服務。當客戶與伺服器彼此交換資料前,必須雙方之間建立乙個tcp連線,之後才能傳輸資料。tcp提供超時延發,丟棄重複資料,檢驗資料,流量控制等功能。保證資料能從另一端傳送到另一端。

udp——面向無向連線,是一種簡單的面向資料報的傳輸層協議,udp不提供可靠性。它只是把應用層傳給ip層的資料報傳送出去即可。並不保證達到目的地。

問題描述二:關於tcp網路程式設計的連線時的「三次握手」機制,具體實現過程是什麼?

第一次握手是客戶端connect連線到server;

第二次握手是server accept client的請求之後,向client端傳送乙個訊息,相當於說我都準備好了,你連線上我了;

第三次握手就是client向server傳送的,就是對第二次握手訊息的確認。之後client和server就開始通訊了。

問題描述三:斷開連線的「四次握手」是如何實現的?

第一次握手:斷開連線的一端傳送close請求;

第二次握手:另外一端接收到斷開連線的請求之後需要對close進行確認,傳送乙個訊息;

第三次握手:傳送了確認訊息之後還要向對端傳送close訊息,要關閉對對端的連線;而在最初傳送斷開連線的一端接收到訊息之後,進入到乙個很重要的狀態time_wait狀態;

第四次握手:最初傳送斷開連線的一端接收到訊息之後。對訊息的確認;

linux網路程式設計 udp

udp udp收發 udp 協議不需要建立連線,類似於傳送簡訊,因此 udp 的程式設計方式比 tcp 更加簡單。udp 有其自己特有的接受與傳送資料的函式 socket af inet,sock dgram,0 建立socket bind socket fd,struct sockaddr ser...

Linux 網路程式設計(二)UDP程式設計

資料報通訊 對於資料報通訊的伺服器端來說,它不必再在乙個埠上偵聽,以等待建立連線,而只需生成乙個埠描述符,並且把這個埠描述符繫結到本地位址上就可以了。udp網路程式設計具體的操作流程為 使用系統呼叫socket 來獲得檔案描述符,該呼叫的宣告格式為 connect 系統呼叫由客戶端呼叫,它的用法如下...

Linux網路程式設計 UDP程式設計例項

使用udp協議通訊時伺服器端和客戶端無需建立連線,只要知道對方套接字的位址資訊,就可以傳送資料。伺服器端只需建立乙個套接字用於接收不同客戶端發來的請求,經過處理後再把結果傳送給對應的客戶端。伺服器端和客戶端使用udp的流程如下圖示 伺服器端 server.c include include incl...