LinuxC——UDP通讯(客户端与服务器端示例代码)

创建两个文件,udp_client.c模拟客户端,udp_server.c模拟服务器端。

步骤在代码中已注释,代码如下:

头文件:

#ifndef _NET_H_
#define _NET_H_

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

#endif

 客户端:

//程序功能:实现UDP通讯,此为客户端
#include "./net.h"

int main(int argc, const char *argv[])
{
	//1、创建数据报套接字 socket
	//2、发送数据	sendto
	//3、接收数据	recvfrom
	//4、关闭socket
	
	//创建socket
	int udp_socket = 0;
	udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
	if(udp_socket < 0)
	{
		perror("socket error");
		return -1;
	}
	printf("socket ok!\n");

	//发送数据
	//定义一个结构体,用于存放服务器端的ip和port
	struct sockaddr_in server;
	server.sin_family = AF_INET;
	server.sin_addr.s_addr = inet_addr(argv[1]);
	server.sin_port = htons(atoi(argv[2]));

	char buf[20] = {'\0'};
	while(1)
	{
		memset(buf, '\0', sizeof(buf));
		printf("请输入要发送的数据:");
		fgets(buf, sizeof(buf), stdin);
		//发送数据
		sendto(udp_socket, buf, strlen(buf), 0, (struct sockaddr *)&server,sizeof(server));
		memset(buf, '\0', sizeof(buf));
		//接收数据
		recvfrom(udp_socket, buf,sizeof(buf), 0, NULL, NULL);
		printf("接收到服务器的数据为:%s",buf);
	}
	//关闭socket
	close(udp_socket);

	return 0;
}

服务器端:

//程序功能:实现UDP通讯,此为服务器端
#include <stdio.h>
#include "./net.h"

int main(int argc, const char *argv[])
{
	//1、创建数据报socket
	//2、绑定自己的ip和port
	//4、发送数据
	//5、关闭socket
	
	//创建socket
	int udp_socket = 0;
	udp_socket = socket(AF_INET, SOCK_DGRAM, 0);
	if(udp_socket < 0)
	{
		perror("socket error");
		return -1;
	}
	printf("socket ok!\n");
	
	//创建一个结构体,用于存放自己的ip和port
	struct sockaddr_in server;
	server.sin_family = AF_INET;
	server.sin_addr.s_addr = INADDR_ANY;
	server.sin_port = htons(atoi(argv[1]));

	//绑定自己的ip和port
	if(bind(udp_socket, (struct sockaddr *)&server, sizeof(server)) < 0)
	{
		perror("bind error");
		return -1;
	}
	printf("bind ok!\n");

	//接收和发送数据
	char buf[20] = {'\0'};
	//创建一个结构体,用于存放连接上的客户端的ip和port
	struct sockaddr_in client;
	while(1)
	{
		memset(&client, '\0', sizeof(client));
		//接收数据
		int len = sizeof(client);
		recvfrom(udp_socket, buf, sizeof(buf), 0, (struct sockaddr *)&client, &len);
		printf("client	ip=%s	port=%d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
		printf("接收到客户端的数据为:%s", buf);
		//发送数据
		memset(buf, '\0', sizeof(buf));
		printf("请输入要发送的数据:");
		fgets(buf ,sizeof(buf), stdin);
		sendto(udp_socket, buf, strlen(buf), 0, (struct sockaddr *)&client, len);
	}
	//关闭socket
	close(udp_socket);
	return 0;
}

运行结果如下:

uc为客户端运行后的可执行文件,us为服务器端运行后的可执行文件,通过main函数传参的形式传入ip和port。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值