UDP 提供不可靠的非连接型传输层服务,它允许在源和目的地之间传送数据,而不必在传送数据之前建立对话。它主要用于那些非连接型的应用程序,如:视频点播
UDP流程图:
服务器代码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#define PORTNUM 3333
int main()
{
int sock_fd;
struct sockaddr_in my_addr;
struct sockaddr_in fromaddr;
int addrlen = sizeof(struct sockaddr);
struct sockaddr_in addr_client;
char buf[1024];
//1.socket
sock_fd = socket(AF_INET,SOCK_DGRAM,0);
if(sock_fd < 0)
{
printf("socket error\n");
exit(1);
}
//2.bind
bzero(&my_addr,sizeof(struct sockaddr_in));
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(PORTNUM);
my_addr.sin_addr.s_addr = INADDR_ANY;
//my_addr.sin_addr.s_addr = inet_addr("192.168.1.11");
if(bind(sock_fd,(struct sockaddr *)(&my_addr),addrlen) < 0)
{
printf("bind error\n");
close(sock_fd);
exit(1);
}
while(1)
{
bzero(buf,sizeof(buf));
bzero(&fromaddr,sizeof(fromaddr));
//3.recv
if(recvfrom(sock_fd,buf,1024,0,(struct sockaddr *)(&fromaddr),&addrlen) > 0)
{
printf("buf = %s\n",buf);
}
if(sendto(sock_fd,"ok",1024,0,(struct sockaddr *)(&fromaddr),sizeof(struct sockaddr)) < 0)
{
printf("send error\n");
}
if(strncmp(buf,"quit",4) == 0)
{
break;
}
}
//4.close
close(sock_fd);
return 0;
}
客户端:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#define PORTNUM 3333
int main()
{
int sock_fd;
struct sockaddr_in toaddr;
struct sockaddr_in fromaddr;
char buf[1024];
int addrlen = sizeof(struct sockaddr);
//1.socket
sock_fd = socket(AF_INET,SOCK_DGRAM,0);
if(sock_fd < 0)
{
printf("socket error\n");
exit(1);
}
//2.send
bzero(&toaddr,sizeof(toaddr));
toaddr.sin_family = AF_INET;
toaddr.sin_port = htons(PORTNUM);
toaddr.sin_addr.s_addr = inet_addr("192.168.1.11");
printf("please input buf:");
scanf("%s",buf);
if(sendto(sock_fd,(void *)buf,1024,0,(struct sockaddr *)(&toaddr),sizeof(struct sockaddr)) < 0)
{
printf("send error\n");
}
bzero(&fromaddr,sizeof(fromaddr));
if(recvfrom(sock_fd,buf,1024,0,(struct sockaddr *)(&fromaddr),&addrlen) > 0)
{
printf("buf = %s\n",buf);
}
//3.close
close(sock_fd);
return 0;
}