目录
UDP
?UDP编程流程
代码实现
UDP
UDP提供的是无连接,不可靠,数据报服务。
“无连接”是指UDP不同于TCP协议,UDP不用建立连接。因此客户端每次发送数据都要明确指定接收端的地址;
“不可靠”,意味着UDP协议无法保证数据从发送端正确地传送到目的端。如果数据在中途丢失,或者因为校验错误被丢弃,UDP只是简单的通知应用程序发送失败;
基于数据报的服务,指每个UDP数据都要有一个长度,接收端读取时必须设置不小于该长度的单位并一次性读出,否则会导致数据缺失,在下一个数据报发来时,上一个数据就会被截断。
?关于TCP和UDP的对比从下图可以直观的看出:
?UDP编程流程
关于这些函数的具体介绍可以参考TCP编程那一篇博客。
代码实现
服务端:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
int main()
{
int sockfd = socket(AF_INET ,SOCK_DGRAM,0);
assert(sockfd != -1);
struct sockaddr_in saddr,caddr;
memset(&saddr,0,sizeof (saddr)) ;
saddr.sin_family = AF_INET;
saddr.sin_port = htons(6000);
saddr.sin_addr.s_addr = inet_addr( "127.0.0.1" );
int res = bind (sockfd,(struct sockaddr*)&saddr,sizeof(saddr));
assert(res != -1 );
while( 1 )
{
int len = sizeof (caddr);
char buff [128] = {0};
recvfrom( sockfd,buff,127,0, (struct sockaddr*)&caddr,&len);
printf ( "buff=%s \n" , buff );
sendto( sockfd ,"ok",2,0, (struct sockaddr*)&caddr,sizeof( caddr));
}
}
客户端:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
int main()
{
int sockfd = socket(AF_INET,SOCK_DGRAM,0);
assert( sockfd != -1 );
struct sockaddr_in saddr,caddr;
memset (&saddr,0,sizeof(saddr));
saddr.sin_family = AF_INET;
saddr.sin_port = htons(6000);
saddr.sin_addr.s_addr = inet_addr("127.0.0.1");
while(1)
{
char buff[128] = {0};
printf("input:\n");
fgets (buff,128,stdin);
if (strncmp(buff,"end",3) == 0)
{
break;
}
sendto(sockfd,buff,strlen(buff)-1,0,(struct sockaddr*)&saddr,sizeof(saddr));
memset(buff,0,128);
int len = sizeof(caddr);
recvfrom(sockfd,buff,127,0,(struct sockaddr*)&saddr,&len);
printf("buff=%s\n",buff);
}
}
|