UDP协议浅析

UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是属于TCP/IP协议族中的一种,位于TCP/IP模型中的传输层。

TCP/IP模型:

UDP数据报格式:

通过UDP协议实现C/S模型:

 服务端  server.c

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<netinet/in.h>
#include<unistd.h>
#include<ctype.h>

#define SERVER_PORT 8000
#define MAXLINE 1500
int main()
{
	int sockfd, i = 0;
	ssize_t len;
	struct sockaddr_in serveraddr, clientaddr;
	
	char ipstr[128];  
	socklen_t clientlen;

	char buf[MAXLINE];

	/* 构造用于UDP通信的套接字*/
	sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    //对socketaddr初始化
	bzero(&serveraddr, sizeof(serveraddr));
	
     //初始化serveraddr结构体数据
	serveraddr.sin_family = AF_INET; /* IPV4 */
	serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); /*本地任意IP* INADDR_ANY = 0*/
	serveraddr.sin_port = htons(SERVER_PORT);
	
    //绑定IP和端口号
	bind(sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
	
	while(1)
	{
    	clientlen = sizeof(clientaddr);
    	len = recvfrom(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&clientaddr, &clientlen);
    	
        //打印客户端ip地址和端口号
    	printf("client IP %s \t PORT %d\n",
    			inet_ntop(AF_INET, &clientaddr.sin_addr, ipstr, sizeof(ipstr)), 
    			ntohs(clientaddr.sin_port)
    			);

        //将客户端数据进行大写转换
    	i = 0;
    	while(i < len)
    	{
    		buf[i] = toupper(buf[i]);
    		i++;
    	}
    	buf[i] = '\0';
     
    	sendto(sockfd, buf, len, 0, (struct sockaddr *)&clientaddr, sizeof(clientaddr));	
	}
    //关闭套接字
	close(sockfd);

	return 0;
}

 客户端client.c

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<string.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<unistd.h>


#define MAXLINE 80
#define SERVER_PORT 8000
int main(int argc, char *argv[])
{
	struct sockaddr_in serveraddr;
	int confd;
	ssize_t len;
	char ipstr[] = "192.168.188.133";
	char buf[MAXLINE];


	if(argc != 2)
	{
		fputs("usage: ./client message\n", stderr);
		exit(1);
	
	}

	//1: 创建一个socket
	confd = socket(AF_INET, SOCK_DGRAM, 0);

	//2: 初始化服务器地址
	bzero(&serveraddr, sizeof(serveraddr));
	serveraddr.sin_family = AF_INET;
	
	//192.168.188.133 
	inet_pton(AF_INET, ipstr, &serveraddr.sin_addr.s_addr);
	
	serveraddr.sin_port = htons(SERVER_PORT);


	while(1)
	{
		//3: 向服务器处理数据
		sendto(confd, argv[1], strlen(argv[1]), 0, (struct sockaddr*)&serveraddr, sizeof(serveraddr));

		len = recvfrom(confd, buf, sizeof(buf), 0,  NULL, 0);
		write(STDOUT_FILENO, buf, len);
		printf("\n");
		sleep(2);

	}

	//关闭socket
	close(confd);

	return 0;
}

结果如下:

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值