簡介
- udp協(xié)議
- udp通信流程
- 示例
udp協(xié)議
中文叫用戶數(shù)據(jù)報(bào)協(xié)議茂卦,屬于傳輸層。UDP是面向非連接的協(xié)議譬巫,它不與對方建立連接咖楣,而是直接把我要發(fā)的數(shù)據(jù)報(bào)發(fā)給對方。所以UDP適用于一次傳輸數(shù)據(jù)量很少缕题、對可靠性要求不高的或?qū)?shí)時(shí)性要求高的應(yīng)用場景截歉。正因?yàn)閁DP無需建立類如三次握手的連接,而使得通信效率很高烟零。
udp通信流程
示例
- 運(yùn)行服務(wù)端
- 運(yùn)行客戶端瘪松,客戶端等待用戶輸入,回車后锨阿,消息發(fā)出到服務(wù)端宵睦,服務(wù)端接受數(shù)據(jù)并打印。
- 客戶端輸入 exit后自動退出墅诡。
server
#include <iostream>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
using namespace std;
#define BUFF_LEN 1024
int main(){
int sock=socket(AF_INET,SOCK_DGRAM,0);
int ret=0;
sockaddr_in addr;
addr.sin_family=AF_INET;
//本地Ip
addr.sin_addr.s_addr=htonl(INADDR_ANY);
addr.sin_port=8888;
ret=bind(sock,(sockaddr*)&addr,sizeof(addr));
if(ret<0) {
cout<<"bind failed"<<endl;
}
char buf[BUFF_LEN]; //接收緩沖區(qū)壳嚎,1024字節(jié)
int recvRet;
sockaddr_in clientAddr;
socklen_t len=sizeof(clientAddr);
char clientIp[16]={0};
while (true) {
/* code */
memset(buf,0,BUFF_LEN);
//0表示對方關(guān)閉,-1為發(fā)生錯(cuò)誤末早。
recvRet=recvfrom(sock,buf,BUFF_LEN,NULL,(sockaddr *)&clientAddr,&len);
if(recvRet<=0) {
cout<<"receive failed"<<endl;
break;
}else{
memset(clientIp,0,sizeof(clientIp));
int clientPort=ntohs(clientAddr.sin_port);
inet_ntop(AF_INET,(void *)&clientAddr.sin_addr,clientIp,16);
cout<<"receive data from "<<clientIp<<":"<<clientPort<<endl;
cout<<buf<<endl;
}
}
if(sock>0) {
close(sock);
}
return 0;
}
client
#include <iostream>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
using namespace std;
#define BUFF_LEN 1024
int main(){
int sock=socket(AF_INET,SOCK_DGRAM,0);
int ret=0;
sockaddr_in addr;
addr.sin_family=AF_INET;
//INADDR_ANY為本地Ip
addr.sin_addr.s_addr=htonl(INADDR_ANY);
addr.sin_port=8888;
char buf[BUFF_LEN]={0};
int recvRet;
//0表示對方關(guān)閉烟馅,-1為發(fā)生錯(cuò)誤。
while (true) {
//標(biāo)準(zhǔn)輸入然磷,會帶上'\n'
fgets(buf,BUFF_LEN,stdin);
if(string(buf)=="exit\n") {
break;
}else{
recvRet=sendto(sock,buf,strlen(buf),NULL,(sockaddr *)&addr,sizeof(addr));
if(recvRet<=0) {
cout<<"receive failed"<<endl;
}
}
}
if(sock>0) {
close(sock);
sock=-1;
}
return 0;
}