一、UDP通信
TCP:傳輸控制協(xié)議,面向連接的,穩(wěn)定的,可靠的,安全的數(shù)據(jù)集流傳遞
穩(wěn)定和可靠:丟包重傳
數(shù)據(jù)有序:序號和確認序號
流量控制:穩(wěn)定窗口
UDP:用戶數(shù)據(jù)報協(xié)議
面向無連接的,不穩(wěn)定的,不可靠,不安全的數(shù)據(jù)報傳遞=---更像是收發(fā)短信,UDP傳輸不需要建立連接,傳輸效率更高,在穩(wěn)定的局域網(wǎng)內(nèi)部環(huán)境相對可靠
UDP通信相關(guān)函數(shù)介紹
接收信息函數(shù)
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
結(jié)構(gòu) sockaddr *src_addr, socklen_t *addrlen);
函數(shù)說明: 接收消息
參數(shù)說明:
sockfd 套接字
buf 要接受的緩沖區(qū)
len 緩沖區(qū)的長度
flags 標志位 一般填0
src_addr 原地址 傳出參數(shù)
addrlen 發(fā)送方地址長度
返回值
成功: 返回讀到的字節(jié)數(shù)
失?。?返回 -1 設(shè)置errno
調(diào)用該函數(shù)相當于TCP通信的recv+accept函數(shù)
發(fā)送數(shù)據(jù)函數(shù)
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
函數(shù)說明: 發(fā)送數(shù)據(jù)
參數(shù)說明:
sockfd 套接字
dest_addr 目的地址
addrlen 目的地址長度
返回值
成功: 返回寫入的字節(jié)數(shù)
失敗: 返回-1,設(shè)置errno
二、UDP服務(wù)端和客戶端開發(fā)流程
1.服務(wù)端開發(fā)流程
(1) 創(chuàng)建socket (man 7 udp)
udp_socket = 套接字(AF_INET,SOCK_DGRAM,0);
SOCK_DGRAM:面向無連接,不安全,不可靠,的數(shù)據(jù)報傳輸
(2) 綁定-綁定
(3) 而 (1)
{
讀取數(shù)據(jù)
n = recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr *) &client,&len);
發(fā)送數(shù)據(jù)
sendto(cfd,buf,n,0,(struct sockaddr *)&client,len);
}
(4)//關(guān)閉文件描述符
平倉(CFD)
2.客戶端開發(fā)流程
(1) 創(chuàng)建socket (man 7 udp)
udp_socket = 套接字(AF_INET,SOCK_DGRAM,0);
(2) 而 (1)
? ? ?{
? ? ? ? ? ? ? //發(fā)送數(shù)據(jù)
? ? ? ? ? ? ? sendto(cfd,buf,n,0,(struct sockaddr *) &client,&len);
? ? ? ? ? ? ? //讀取數(shù)據(jù)
? ? ? ? ? ? ??n = recvfrom(cfd,buf,sizeof(buf),0,(struct sockaddr *) &client,&len);
? ? ? }
(3)關(guān)閉socket套接字
close(cfd)
三、客戶端和服務(wù)端代碼開發(fā)案例
1.UDP服務(wù)端代碼開發(fā)
代碼
//udp服務(wù)端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <ctype.h>
int main()
{
int cfd = socket(AF_INET,SOCK_DGRAM,0);
if(cfd < 0)
{
perror("sock error");
return -1;
}
struct sockaddr_in serv;
struct sockaddr_in client;
bzero(&serv,sizeof(serv));
serv.sin_family = AF_INET;
serv.sin_port = htons(8888);
serv.sin_addr.s_addr = htonl(INADDR_ANY);
bind(cfd,(struct sockaddr *)&serv,sizeof(serv));
int i;
int n;
socklen_t len;
char buf[1024];
while(1)
{
memset(buf,0x00,sizeof(buf));
len = sizeof(client);
n = recvfrom(cfd, buf,sizeof(buf),0,(struct sockaddr *)&client,&len);
for(i = 0;i < n;i ++)
{
buf[i] = toupper(buf[i]);
}
printf("[%d]: n == [%d],buf == [%s]\n",ntohs(client.sin_port),n,buf);
sendto(cfd, buf,n,0,(struct sockaddr *)&client,len);
}
close(cfd);
return 0;
}
效果展示
運行服務(wù)端
?使用nc -u 127.1 8888 進行連接到服務(wù)端
?所有網(wǎng)絡(luò)連接和進程的命令,并過濾結(jié)果以僅顯示與端口8888相關(guān)的連接或進程
2.UDP客戶端代碼開發(fā)
代碼
//udp服務(wù)端
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <ctype.h>
int main()
{
//創(chuàng)建socket
int cfd = socket(AF_INET, SOCK_DGRAM, 0);
if(cfd<0)
{
perror("socket error");
return -1;
}
//綁定
struct sockaddr_in serv;
serv.sin_family = AF_INET;
serv.sin_port = htons(8888);
inet_pton(AF_INET, "127.0.0.1", &serv.sin_addr.s_addr);
int n;
char buf[1024];
while(1)
{
//讀取標準輸入
memset(buf, 0x00, sizeof(buf));
n = read(STDIN_FILENO,buf,sizeof(buf));
//發(fā)送數(shù)據(jù)
sendto(cfd, buf, n, 0, (struct sockaddr *)&serv, sizeof(serv));
//讀取數(shù)據(jù)
memset(buf, 0x00, sizeof(buf));
n = recvfrom(cfd, buf, sizeof(buf), 0, NULL, NULL);
printf("n==[%d], buf==[%s]\n", n, buf);
}
//關(guān)閉套接字
close(cfd);
return 0;
}
運行結(jié)果文章來源:http://www.zghlxwxcb.cn/news/detail-742325.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-742325.html
到了這里,關(guān)于UDP服務(wù)端和客戶端通信代碼開發(fā)流程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!