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)
%.o: %.c
$(CC) -c -o $@ $<
udp_server:udp_server.o
$(CC) $(CFLAGS) -o $@ $<
udp_client:udp_client.o
$(CC) $(CFLAGS) -o $@ $<
clean:
rm -f $(target) *.o
result
![result](https://i-blog.csdnimg.cn/direct/2a0e0bf74da64594b8de2ed08575d6b8.png#pic_center)