Linux環境程式設計 基於UDP通訊協議的回聲伺服器

2021-10-09 18:41:11 字數 4833 閱讀 1987

socket是一種可以進行網路通訊的核心物件,它有乙個唯一的識別符號,一般稱它為socket描述符——sockfd,可模擬於檔案描述符fd,基於linux下一切皆檔案的概念,所以sockfd也可以用read/write/close操作。

socket函式:建立socket物件

int

socket

(int domain,

int type,

int protocol)

;

type:socket物件型別

sock_stream:資料流協議,tcp(面向連線的通訊協議)。特點是安全可靠,資料不會丟失,但速度慢。常用於安全性較高的場景;

sock_dgram:資料報協議,udp(面向無連線的通訊協議)。特點是速度快,資料可能丟失,安全性和可靠性與tcp相比不同。一般用於安全性要求不高但是對速度有要求的場景。

protocol:特殊協議

較少使用,一般直接寫0

返回值:成功返回非負描述符,失敗返回-1

網路通訊位址

struct sockaddr_in

int

bind

(int sockfd,

const

struct sockaddr *addr,socklen_t addrlen)

;

sockfd:socket物件的描述符,即socket函式的返回值

struct sockaddr* addr指定了想要繫結的ip和埠號,均用網路位元組序-即大端模式;

addrlen是前面struct sockaddr(與sockaddr_in等價)的長度

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

connect函式:連線通訊目標

int

connect

(int sockfd,

const

struct sockaddr *addr,socklen_t addrlen)

;

個人計算機系統資料的儲存方式可能是大端,也可能是小端,網路通訊時需要的是大端資料,必須把資料轉換成大端。

uint32_t

htonl

(uint32_t hostlong)

;//功能:把32位的主機位元組序轉換成32位網路位元組序

uint16_t

htons

(uint16_t hostshort)

;//功能:把16位的主機位元組序轉換成16位網路位元組序

uint32_t

ntohl

(uint32_t netlong)

;//功能:把32位網路位元組序轉換成32位的主機位元組序

uint16_t

ntohs

(uint16_t netshort)

;//功能:把16位網路位元組序轉換成16位的主機位元組序

生成埠號:

埠號就是乙個16位的無符整數(065536),一般設定為大於1024的值,11023為保留埠號。

通常使用htons()函式來獲取埠號。

in_addr_t inet_addr

(const

char

*cp)

;

char

*inet_ntoa

(struct in_addr in)

;

ssize_t recvfrom

(int sockfd,

void

*buf, size_t len,

int flags,

struct sockaddr *src_addr, socklen_t *addrlen)

;

sendto函式:傳送資料到指定的目標

ssize_t sendto

(int sockfd,

const

void

*buf, size_t len,

int flags,

const

struct sockaddr *dest_addr, socklen_t addrlen)

;

udp程式設計模型:

程序a:建立socket物件->準備位址->繫結->接收資料和**的位址->原路返回資料->關閉socket。

程序b:建立socket物件->準備位址->向目標傳送資料->接收資料->關閉socket。

使用udp協議實現雙向傳輸資料(通過ip位址和埠,既可以與自己也可以與別人通訊)。

服務端

#include

#include

#include

#include

#include

#include

#include

typedef

struct sockaddr* sp;

intmain

(int argc,

const

char

* argb)

// 準備通訊位址(自己的)

struct sockaddr_in svr_addr =

,cli_addr =

; svr_addr.sin_family = af_inet;

svr_addr.sin_port =

htons

(7788);

svr_addr.sin_addr.s_addr =

inet_addr

("172.20.10.2");

socklen_t addrlen =

sizeof

(svr_addr)

;// 繫結位址與socket物件if(

bind

(svr_sock,

(sp)

&svr_addr,addrlen)

)char buf[

4096]=

;char buf2[

4096]=

; size_t buf_size =

sizeof

(buf)

;for(;

;)printf

("from:%s recv:%s bits:%d\n"

,inet_ntoa

(cli_addr.sin_addr)

,buf,ret_size)

;sprintf

(buf2,

",return:%s"

,inet_ntoa

(svr_addr.sin_addr));

strcat

(buf,buf2)

;// 返回資料

sendto

(svr_sock,buf,

strlen

(buf)+1

,0,(sp)

&cli_addr,addrlen);}

}

客戶端

#include

#include

#include

#include

#include

#include

#include

typedef

struct sockaddr* sp;

intmain

(int argc,

const

char

* argb)

setsockopt

(cli_sock,sol_socket,so_broadcast,

&is_broadcast,1)

;// 準備通訊位址(服務端)

struct sockaddr_in svr_addr;

svr_addr.sin_family = af_inet;

svr_addr.sin_port =

htons

(7788);

svr_addr.sin_addr.s_addr =

inet_addr

("172.20.10.2");

socklen_t addrlen =

sizeof

(svr_addr)

;char buf[

4096]=

; size_t buf_size =

sizeof

(buf)

;for(;

;)// 向伺服器傳送資料

sendto

(cli_sock,buf,

strlen

(buf)+1

,0,(sp)

&svr_addr,addrlen)

;// 從伺服器接收資料

size_t ret_size =

recvfrom

(cli_sock,buf,buf_size,0,

(sp)

&svr_addr,

&addrlen);if

(0>= ret_size)

printf

("from:%s recv:%s bits:%d\n"

,inet_ntoa

(svr_addr.sin_addr)

,buf,ret_size);}

}

基於Linux下的UDP程式設計

一.linux下udp程式設計框架 使用udp進行程式設計可以分為客戶端和伺服器端兩部分。1.伺服器端程式包括 建立套接字 將套接字位址結構進行繫結 讀寫資料 關閉套接字 2.客戶端程式包括 建立套接字 讀寫資料 關閉套接字 3.伺服器端和客戶端程式之間的差別 伺服器端和客戶端兩個流程之間的主要差別...

基於UDP的socket程式設計

轉貼自 udpsocket sockets 套接字 程式設計有三種,流式套接字 sock stream 資料報套接字 sock dgram 原始套接字 sock raw 基於udp的socket程式設計是採用的資料報套接字。在這個程式中,將兩個工程新增到乙個工作區。同時還要鏈結乙個ws2 32.li...

unix環境程式設計 UDP通訊

一 udp伺服器 程式設計的端一般步驟是 1 用函式socket 建立socket 第二個引數為sock dgram 2 用函式bind 繫結ip 位址 埠資訊 3 用函式recvfrom 接收資料 4 關閉網路連線 udp客戶端 程式設計的一般步驟是 1 建立乙個socket 用函式socket ...