UDP通信简单实现

server

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

#define len 1024
#define handle_error(msg) \
    do { perror(msg); exit(EXIT_FAILURE);}while(0)

int main (int argc, char *argv[]) {
    if(argc != 3)
    {
        printf("usage: %s <ip> <port>\n",argv[0]);
        exit(EXIT_FAILURE);
    }
    char buff[len]={0};
    int sfd = socket(AF_INET,SOCK_DGRAM,0);
    if(sfd == -1)
    {
        handle_error("socket");
    }
    struct sockaddr_in servaddr;
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(atoi(argv[2]));
    if(inet_aton(argv[1], &servaddr.sin_addr)==0)
    {
        close(sfd);
        handle_error("inet_aton");
    }
    if(bind(sfd,(struct sockaddr *)&servaddr,sizeof(servaddr))==-1)
    {
        close(sfd);
        handle_error("bind");
    }
    while(1)
    {
        memset(buff,0,len);
        if(recvfrom(sfd,buff,len,0,NULL,NULL)==-1)
        {
            close(sfd);
            handle_error("recvfrom");
        }
        printf("recvfrom:%s",buff);
    }
    close(sfd);
}

client

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

#define handle_error(msg) \
    do { perror(msg); exit(EXIT_FAILURE); } while (0)
#define len 1024
void Send(char* argv[]);
int main(int argc, char* argv[])
{
	if(argc != 3)
    {
        fprintf(stderr, "Usage: %s <IP> <port>\n", argv[0]);
        exit(EXIT_FAILURE);
    }
	Send(argv);
	return 0;
}

void Send(char* argv[])
{
    char buff[len] = {0};	
	struct sockaddr_in cliaddr;
	socklen_t addrlen = sizeof(cliaddr);

	int sfd = socket(AF_INET, SOCK_DGRAM,0);
	if(sfd == -1)
	{
		handle_error("socket");
	}
	
	cliaddr.sin_family = AF_INET;
	cliaddr.sin_port = htons(atoi(argv[2]));
	if(inet_aton(argv[1], &cliaddr.sin_addr) == 0)
	{
		close(sfd);
		handle_error("inet_aton");
	}  
	while(1)
	{
		memset(buff, 0, len);
		fgets(buff,len,stdin);
		sendto(sfd, buff,strlen(buff),0,(struct sockaddr *)&cliaddr,addrlen);
	}
	close(sfd);
}

Makefile

CC = gcc
CFLAGS = -Wall -Wextra -Werror -fstack-protector -O2

target = udp_server udp_client

all: $(target)

# 隐式规则:为所有的.c文件生成.o目标文件
%.o: %.c
	$(CC) -c -o $@ $<
# 显式规则:编译链接目标程序
udp_server:udp_server.o
	$(CC) $(CFLAGS) -o $@ $<

udp_client:udp_client.o
	$(CC) $(CFLAGS) -o $@ $<

# 添加一个清理目标clean,用于安全清理编译产物
clean:
	rm -f $(target) *.o

result

result

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值