Linux -- UDP Socket

1、服务端源代码

//==================================
//   FileName : udp_server.c
//   Date     : 2019/08/14
//   Author   : 柚子树
//==================================

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

int main(int argc, char* argv[])
{
	if(argc!=3)
	{
		printf("error args,请输入命令行参数ip和port:\n");
		return -1;
	}
	int sfd;
	sfd=socket(AF_INET,SOCK_DGRAM,0);//服务器生成一个socket描述符sfd,采用ipv4和udp协议通信
	if(-1==sfd)
	{
		perror("socket");
		return -1;
	}
	struct sockaddr_in ser;//定义服务器的socket地址结构ser,指明服务器的通信协议、ip地址,端口号
	memset(&ser,0,sizeof(ser));//清空地址结构
	ser.sin_family=AF_INET;//采用ipv4协议
	ser.sin_port=htons(atoi(argv[2]));//端口号,将主机字节序的port转换为网络字节序的port
	ser.sin_addr.s_addr=inet_addr(argv[1]);//ip,将点分十进制的主机字节序的ip转换为32位二进制数值的网络字节序的ip
	int ret;
	ret=bind(sfd,(struct sockaddr*)&ser,sizeof(ser));//udp进行bind后,端口就打开;将生成的sfd与服务器的socket信息数据绑定
	if(-1==ret)
	{
		perror("bind");
		return -1;
	}
	char buf[128]={0};
	struct sockaddr_in cli;//定义客户端的socket地址结构,用于接收客户端的ip和port信息
	int len;
	while(1)
	{
		memset(&buf,0,sizeof(buf));
		memset(&cli,0,sizeof(cli));
		len=sizeof(cli);
		ret=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cli,&len);
		if(-1==ret)
		{
			perror("recvfrom");
			return -1;
		}
		printf("UDP Server:客户端发来的信息是%s\n",buf);
	}
	close(sfd);
	return 0;
}

2、客户端源代码

//==================================
//   FileName : udp_client.c
//   Date     : 2019/08/14
//   Author   : 柚子树
//==================================

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

int main(int argc, char* argv[])
{
	if(argc!=3)
	{
		printf("error args,请输入命令行参数ip和port:\n");
		return -1;
	}
	int sfd;
	sfd=socket(AF_INET,SOCK_DGRAM,0);//客户端生成一个socket描述符sfd,采用ipv4和udp协议通信
	if(-1==sfd)
	{
		perror("socket");
		return -1;
	}
	struct sockaddr_in ser;//定义服务器的socket地址结构ser,指明服务器的通信协议、ip地址,端口号
	memset(&ser,0,sizeof(ser));//清空地址结构
	ser.sin_family=AF_INET;//采用ipv4协议
	ser.sin_port=htons(atoi(argv[2]));//端口号,将主机字节序的port转换为网络字节序的port
	ser.sin_addr.s_addr=inet_addr(argv[1]);//ip,将点分十进制的主机字节序的ip转换为32位二进制数值的网络字节序的ip
	int ret;
	int len=sizeof(ser);
	ret=sendto(sfd,"I am udpclient",14,0,(struct sockaddr*)&ser,len);
	if(-1==ret)
	{
		perror("sendto");
		return -1;
	}
	printf("Client:已成功连接到服务器,请向服务器发送信息:\n");
	char buf[128]={0};
	//struct sockaddr_in cli;
	//memset(&cli,0,sizeof(cli));
	while(1)
	{
		memset(&buf,0,sizeof(buf));
		read(0,buf,sizeof(buf));
		ret=sendto(sfd,buf,strlen(buf)-1,0,(struct sockaddr*)&ser,len);
		//ret=recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr*)&cli,&len);
		if(-1==ret)
		{
			perror("sendto");
			return -1;
		}
	}
	close(sfd);
	return 0;
}

3、测试示例

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值