用udp實現乙個回顯伺服器

2021-09-24 10:52:34 字數 3383 閱讀 4787

1.ip

2.埠號
3.udp協議
4.網路位元組序
記憶體中的多位元組資料相對於記憶體位址有大端和小端之分, 磁碟檔案中的多位元組資料相對於檔案中的偏 移位址也有大端小端之分,網路資料流同樣有大端小端之分

c語言庫函式 網路位元組序和主機位元組序的轉換

#include

uint32_t htonl

(uint32_t hostlong)

;//,h表示host,n表示network,

uint16_t htons

(uint16_t hostshort)

;uint32_t ntohl

(uint32_t netlong)

;uint16_t ntohs

(uint16_t netshort)

;

5.基於socket api編寫乙個udp回顯伺服器
server.cc

#include

#include

#include

#include

#include

#include

//udp版本的伺服器

//伺服器的基本工作流程

//1.初始化(伺服器啟動)

//2.進入乙個主迴圈

// a.讀取客戶端發來的"請求"(request)

// b.根據請求內容,計算生成"響應(response)內容最核心

// c.把響應資料返回客戶端

intmain()

//2.把當前的socket繫結到乙個ip + 埠號

sockaddr_in addr;

//是乙個結構體 存放 ip+埠號

addr.sin_family = af_inet;

//ipv4協議

addr.sin_addr.s_addr =

inet_addr

("0.0.0.0");

//ip位址,函式自己轉換了網路位元組序

addr.sin_port =

htons

(9090);

//埠號必須得先轉換成網路位元組序

int ret =

bind

(sock,

(sockaddr*

)&addr,

sizeof

(addr));

//繫結到socket

if(ret <0)

printf

("server start ok!\n");

//3.處理伺服器收到的請求

while(1

);//接受客戶端訊息 peer來獲取客戶端的ip以及埠號,buf存訊息

ssize_t n =

recvfrom

(sock,buf,

sizeof

(buf)-1

,0,(sockaddr*

)&peer,

&len);if

(n <0)

buf[n]

='\0'

;//顯示客戶端發來的訊息

printf

("[%s:%d] buf: %s\n"

,inet_ntoa

(peer.sin_addr)

,ntohs

(peer.sin_port)

, buf)

;//b)根據請求計算響應

//todo 業務邏輯

//c)把響應寫回客戶端

n =sendto

(sock,buf,

strlen

(buf),0

,(sockaddr*

)&peer,len);if

(n <0)

//netstat -anp |grep 9090

}close

(sock)

;//關閉

return0;

}

client.cc

#include

#include

#include

#include

#include

#include

intmain

(int argc,

char

* ar**)

//客戶端一般不需要bind

//如果沒有bind,作業系統會隨機分配乙個埠號

//如果是伺服器程式不去bind就會導致每次啟動服務埠號不一樣

//客戶端不知道伺服器端口而導致無法連線

//客戶端bind的話會出問題

//乙個埠號只能bind乙個程序

//2.準備好伺服器的sockeaddr_in結構

sockaddr_in server_addr;

server_addr.sin_family = af_inet;

server_addr.sin_addr.s_addr =

inet_addr

(ar**[1]

);//引數輸入ip

server_addr.sin_port =

htons

(9090);

//3.客戶端直接傳送資料即可

while(1

);scanf

("%s"

,buf)

;//向客戶端傳送資料

ssize_t n =

sendto

(sock,buf,

strlen

(buf),0

,(sockaddr*

)&server_addr,

sizeof

(server_addr));

if(n <0)

//接收伺服器發回來的訊息

Socket程式設計實踐 迭代回顯伺服器 UDP版

建立socket套接字的api 函式原型 引數說明 繫結埠號的api 函式原型 引數說明 這個函式的第二個引數在傳參的時候,我們通常是定義乙個sockaddr in型別的結構體,初始化後,強制型別轉換為sockaddr型別的。sockaddr in結構體成員說明 struct sockaddr in...

乙個基於UDP的回顯C S 二

解決問題 通過connect,使伺服器端意外崩潰,重啟,客戶端能通過read函式而得知 伺服器端 vi s4.c include include include include include include include define serv port 9877 define maxline ...

基於UDP的回顯伺服器預備知識(網路程式設計一站到底)

要寫出基於udp的回顯伺服器我們要先了解一些預備知識如 ip位址有兩個版本,ipv4與ipv6在這裡我們預設ipv4 ip位址是在 ip協議中 來標識 絡中不同主機的位址 對於 ipv4 來說,ip 位址是 個4位元組 32 位的整數 我們通常也使 點分 進製 的字串表 ip位址 例如 192.16...