#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/socket.h>
#include <sys/fcntl.h>
#include <arpa/inet.h>
#include <net/if.h>
#define PORT 8989
int main()
{
int ret=0;
int len=0;
char buf[1024];
socklen_t slt=0;
int fd_sock=0;
struct sockaddr_in s_addr;
struct sockaddr_in c_addr;
pid_t pid=fork();
if(-1==pid)
{
perror("fork");
exit(-1);
}
if(0==pid)
{
fd_sock=socket(AF_INET,SOCK_DGRAM,0);
if(-1==fd_sock)
{
perror("soscket");
exit(-1);
}
bzero(&s_addr,sizeof(s_addr));
s_addr.sin_family=AF_INET;
s_addr.sin_addr.s_addr=htonl(INADDR_ANY);
s_addr.sin_port=htons(PORT);
for(;;)
{
printf("enter 'exit' to close!\n>");
bzero(buf,sizeof(buf));
scanf("%s",buf);
len=sendto(fd_sock,buf,strlen(buf),0,(struct sockaddr*)&s_addr,sizeof(s_addr));
if(-1==len)
{
printf("send message failed!\n");
perror("sendto");
}else{
printf("send successful!\n");
}
if(0==strcmp(buf,"exit"))
{
close(fd_sock);
printf("client closed!\n");
break;
}
bzero(buf,sizeof(buf));
len=recvfrom(fd_sock,buf,sizeof(buf),0,(struct sockaddr*)&s_addr,&slt);
if(-1==len)
{
perror("recvfrom");
}else{
printf("recv message from server!\ndata:%s\n",buf);
}
}
}else{
int fd=0;
fd_sock=socket(AF_INET,SOCK_DGRAM,0);
if(-1==fd_sock)
{
perror("socket");
exit(-1);
}
bzero(&s_addr,sizeof(s_addr));
s_addr.sin_family=AF_INET;
s_addr.sin_addr.s_addr=htonl(INADDR_ANY);
s_addr.sin_port=htons(PORT);
ret=bind(fd_sock,(struct sockaddr*)&s_addr,sizeof(s_addr));
if(-1==ret)
{
perror("bind");
exit(-1);
}
for(;;)
{
bzero(&c_addr,sizeof(c_addr));
slt=sizeof(c_addr);
bzero(buf,sizeof(buf));
len=recvfrom(fd_sock,buf,sizeof(buf),0,(struct sockaddr*)&c_addr,&slt);
if(-1==len)
{
perror("recvfrom");
}else
{
if(0==strcmp(buf,"exit"))
{
close(fd_sock);
printf("[SERVER]:closed!\n");
break;
}
fd=open(buf,O_RDONLY);
if(-1==fd)
{
char *error_msg=strerror(errno);
bzero(buf,sizeof(buf));
strcpy(buf,error_msg);
}else{
bzero(buf,sizeof(buf));
read(fd,buf,sizeof(buf));
}
sendto(fd_sock,buf,strlen(buf),0,(struct sockaddr*)&c_addr,sizeof(c_addr));
close(fd);
}
}
}
}
makefile
CC=gcc
udp:udp.c
${CC} udp.c -o udp
clean:
rm -rf udp
演示截图: