//客戶端模組
#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...