
- 源端口:发送方的端口号(需要对方回信是选用,不用时可全为0)
- 目的端口:终点交付报文时使用(把报文交给谁)
- UDP长度:UDP用户数据报的长度,最小值8(仅有首部)
- 校验和:检测UDP用户数据报在传输中是否有错
UDP
特点
- 无连接的
- 尽最大努力交付,即不保证可靠交付
- 面向报文的
- 没有拥塞控制
- 支持一对一、一对多、多对多的交互通信
- 首部开销小,只有8个字节
UDP套接字(不需要监听和连接)
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>
void usage(const char* proc)
{
printf("usage:%s [local_ip] [local_port]\n",proc);
}
int main(int argc,char*argv[])
{
if(argc != 3)
{
usage(argv[0]);
return 1;
}
int sk = socket(AF_INET,SOCK_DGRAM,0);
if(sk < 0)
{
perror("socket");
return 2;
}
struct sockaddr_in local;
local.sin_family = PF_INET;
local.sin_port = htons(atoi(argv[2]));
local.sin_addr.s_addr =inet_addr(argv[1]);
if(bind(sk,(struct sockaddr*)&local,sizeof(local))<0)
{
perror("bind");
return 3;
}
while(1)
{
char buf[1024];
struct sockaddr_in client;
socklen_t len = sizeof(client);
ssize_t s = recvfrom(sk,buf,sizeof(buf)-1,0,(struct sockaddr*)&client,&len);
if(s > 0)
{
buf[s] = 0;
printf("client# %s\n",buf);
sendto(sk,buf,strlen(buf),0,(struct sockaddr*)&client,len);
}
else
{
close(sk);
printf("client quit...\n");
break;
}
}
return 0;
}
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdlib.h>
void usage(const char* proc)
{
printf("usage:%s [local_ip] [local_port]\n",proc);
}
int main(int argc,char*argv[])
{
if(argc != 3)
{
usage(argv[0]);
return 1;
}
int sk = socket(AF_INET,SOCK_DGRAM,0);
if(sk < 0)
{
perror("socket");
return 2;
}
char buf[1024];
struct sockaddr_in server;
server.sin_family = PF_INET;
server.sin_port = htons(atoi(argv[2]));
server.sin_addr.s_addr = inet_addr(argv[1]);
socklen_t len = sizeof(server);
while(1)
{
printf("Please Enter#:");
fflush(stdout);
ssize_t s = read(0,buf,sizeof(buf)-1);
if(s > 0)
{
buf[s-1] = 0;
sendto(sk,buf,sizeof(buf)-1,0,(struct sockaddr*)&server,len);
s = recvfrom(sk,buf,sizeof(buf)-1,0,(struct sockaddr*)&server,&len);
if(s>0)
{
buf[s] = 0;
printf("server echo#: %s\n",buf);
}
}
}
}
//makefile
.PHONY:all
all:udp_server udp_client
udp_client:udp_client.c
gcc -o $@ $^
udp_server:udp_server.c
gcc -o $@ $^
.PHONY:clean
clean:
rm -f udp_server udp_client