Udp 模擬實現客戶端與伺服器通訊

2021-10-12 10:55:58 字數 3638 閱讀 9597

//客戶端模組

#include

#include

#include

//std::string

#include

//close介面

#include

//atoi介面

#include

//位址結構定義

#include

//位元組序轉換介面

#include

//套接字介面

class

udpsocket

//1. 建立套接字

bool

socket()

return

true;}

//2. 為套接字繫結位址資訊

bool

bind

(const std::string &ip,

uint32_t port)

return

true;}

//3. 傳送資料

bool

send

(const std::string &data,

const std::string &ip,

uint16_t port)

return

true;}

//4. 接收資料

bool

recv

(std::string *buf, std::string *ip =

null

,uint16_t

*port =

null);

//臨時用於存放資料的緩衝區

ret =

recvfrom

(_sockfd, tmp,

4096,0

,(struct sockaddr*

)&addr,

&len);if

(ret <0)

buf-

>

assign

(tmp, ret)

;//給buf申請ret大小的空間,從tmp中拷貝ret長度的資料進去

if(ip !=

null)if

(port !=

null

)return

true;}

//5. 關閉套接字

void

close()

private

://貫穿全文的套接字描述符

int _sockfd;};

#define check_ret(q) if((q)==false)

intmain

(int argc,

char

*ar**)

std::string ip_addr = ar**[1]

;//服務端位址資訊

uint16_t port_addr =

atoi

(ar**[2]

);udpsocket sock;

check_ret

(sock.

socket()

);//建立套接字

//check_ret(sock.bind());//繫結位址資訊

while(1

) sock.

close()

;return0;

}

//服務端

#include

#include

#include

#include

#include

//sockaddr結構體/ ipproto_udp

#include

//包含一些位元組序轉換的介面

#include

//套接字介面標頭檔案

intmain

(int argc,

char

*ar**)

const

char

*ip_addr = ar**[1]

;uint16_t port_addr =

atoi

(ar**[2]

);//socket(位址域, 套接字型別, 協議型別)

int sockfd =

socket

(af_inet, sock_dgram, ipproto_udp);if

(sockfd <0)

//bind(套接字描述符, 位址結構, 位址長度);

//struct sockaddr_in ipv4位址結構

// struct in_addr;

struct sockaddr_in addr;

addr.sin_family = af_inet;

//htons-將兩個位元組的主機位元組序整數轉換為網路位元組序的整數

addr.sin_port =

htons

(port_addr)

;//注意千萬不要使用htonl

//inet_addr 將乙個點分十進位制的字串ip位址轉換為網路位元組序的整數ip位址

addr.sin_addr.s_addr =

inet_addr

(ip_addr)

; socklen_t len =

sizeof

(struct sockaddr_in)

;//獲取ipv4位址結構長度

int ret =

bind

(sockfd,

(struct sockaddr*

)&addr, len);if

(ret <0)

while(1

);struct sockaddr_in cliaddr;

socklen_t len =

sizeof

(struct sockaddr_in)

;//recvfrom(描述符,緩衝區,長度,引數,客戶端位址資訊, 位址首席資訊官度)

//阻塞接收資料,將資料放入buf中,將傳送端的位址放入cliaddr中

int ret =

recvfrom

(sockfd, buf,

1023,0

,(struct sockaddr*

)&cliaddr,

&len);if

(ret <0)

printf

("client say: %s\n"

, buf)

;printf

("server say:");

fflush

(stdout);

//讓使用者輸入資料,傳送給客戶端

memset

(buf,

0x00

,1024);

//清空buf中的資料

scanf

("%s"

, buf)

;//通過sockfd將buf中的資料傳送到cliaddr客戶端

ret =

sendto

(sockfd, buf,

strlen

(buf),0

,(struct sockaddr*

)&cliaddr, len);if

(ret <0)

}close

(sockfd)

;//關閉套接字

}

UDP 客戶端伺服器

udp 客戶端 include include include include include define size 100 define ip 127.0.0.1 define port 10086 int main struct sockaddr in addr 建立socket udp so...

實現簡單UDP伺服器客戶端模型

udp是無連線的,在資料的傳送之前不需要連線,只需要知道要發資料給誰,然後將資料發出即可,可以直接接收到其他人發來的資料,不必呼叫listen 和accept 函式。所以udp中建立好套接字後,就可以直接進行資料的傳輸。基於udp的接收和傳送函式 include include ssize t se...

伺服器與客戶端

建立socket操作,建立流式套接字,返回套接字型大小socksrv socket socket int af,int type,int protocol 第乙個引數,指定位址簇 tcp ip只能是af inet,也可寫成pf inet socket socksrv socket af inet,s...