基于UDP编程_udp详解(基于是什么意思)
生活随笔
收集整理的這篇文章主要介紹了
基于UDP编程_udp详解(基于是什么意思)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
基于UDP編程
1 UDP是數(shù)據(jù)報協(xié)議,無連接的,不可靠,追求傳輸效率的一種通信協(xié)議數(shù)據(jù)的發(fā)送和接收是同步的.在進行通信之前,不需要建立連接.其傳輸效率比TCP高.對其服務器而言,并沒有三次握手的過程.因此和TCP相比,少了被動監(jiān)聽(listen)和(accept).只需要創(chuàng)建通信設備,綁定IP地址和端口號.然后進行數(shù)據(jù)的收發(fā).
1.服務器端的編程模型
- 創(chuàng)建一個socket端點,返回該端點的文件描述符fd socket(2)
2 )將fd和本地地址綁定 bind(2)
while(1){
3) 阻塞等待客戶端消息 recvfrom(2)
4 )處理客戶消息
5 )將處理結果發(fā)送給客戶端 sendto(2)
}
2 客戶端的編程模型
1 創(chuàng)建一個socket端點 socket(2)
2 使用fd設備向服務器發(fā)送消息 sendto(2)
3 阻塞等待服務器的響應消息 recvfrom(2)
4 處理響應消息
4 關閉fd設備 close(2)
編程實現(xiàn)
服務器端
#include <stdio.h>
#include <t_net.h>
#include <errno.h>
#include <ctype.h>
#include <string.h>
int main(void){
SA4 cli;
char buf[128];
socklen_t len;
int fd = bind_sock(AF_INET,SOCK_DGRAM,8000);
if(fd == -1){
printf("%s\n",strerror(errno));
return -1;
}
while(1){
len = sizeof(cli);
int recv = recvfrom(fd,buf,128,0,(SA*)&cli,&len);
if(recv == -1){
printf("%s\n",strerror(errno));
return -1;
}
for(int i = 0;i < recv;i++){
buf[i] = toupper(buf[i]);
}
sendto(fd,buf,recv,0,(SA*)&cli,sizeof(cli));
}
return 0;
} ``
關于t_net.h,參見博主上一篇博客:TCP并發(fā)服務的實現(xiàn)
客戶端
#include <stdio.h>
#include <errno.h>
#include <t_net.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>
int main(int argc,char* argv[]){
char msg[128];
char buf[128];
int fd = socket(AF_INET,SOCK_DGRAM,0);
if(fd == -1){
printf("%s\n",strerror(errno));
return 0;
}
SA4 serv;
serv.sin_family = AF_INET;
serv.sin_port = htons(8000);
inet_pton(AF_INET,argv[1],&serv.sin_addr);
while(1){
gets(msg);
//printf("%d\n",sizeof(msg));
sendto(fd,msg,strlen(msg) + 1,0,(SA*)&serv,sizeof(serv));
int recv = recvfrom(fd,buf,sizeof(buf),0,NULL,NULL);
if(recv > 0){
//write(1,buf,recv);
printf("%s\n",buf);
if(strcmp(buf,"BYEBYE") == 0) break;
}
}
close(fd);
return 0;
}
總結
以上是生活随笔為你收集整理的基于UDP编程_udp详解(基于是什么意思)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SAP Spartacus Set Ac
- 下一篇: SAP Spartacus产品转盘页面(