您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页TCP/IP之UDP通信

TCP/IP之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

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务