UDP回射程序

服务器端:

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

#define SERV_PORT 9877
#define SA struct sockaddr

int main(int argc, char**argv)
{
    int sockfd;
    struct sockaddr_in servaddr, cliaddr;

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    bzero(&servaddr, sizeof(servaddr));

    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(SERV_PORT);
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

    bind(sockfd, (SA*)&servaddr, sizeof(servaddr));

    dg_echo(sockfd, (SA*)&cliaddr, sizeof(cliaddr));

    return 0;
}

客户端:

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

#define SERV_PORT 9877
#define SA struct sockaddr

int main(int argc, char** argv)
{
    int sockfd;
    struct sockaddr_in servaddr;

    if(argc != 2)
    {
        err_quit("usage: udpcli <IPaddress>");
    }
    
    bzero(&servaddr, sizeof(servaddr));

    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(SERV_PORT);
    inet_pton(AF_INET, argv[1], &servaddr.sin_addr);

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    dg_cli(stdin, sockfd, (SA*)&servaddr, sizeof(servaddr));

    return 0;
}

dg_cli.c

#include <unistd.h>
#include <stdio.h>
#include <string.h>

#ifndef MAXLINE
#define MAXLINE 4096
#endif

#define SA struct sockaddr

void dg_cli(FILE* fp, int sockfd, const SA* pservaddr, socklen_t servlen)
{
    int n;
    char sendline[MAXLINE], recvline[MAXLINE+1];

    while(fgets(sendline, MAXLINE, fp) != NULL)
    {
        sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);

        n = recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);

        recvline[n] = 0;
        fputs(recvline, stdout);
    }
}

dg_echo.c

#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>

#ifndef MAXLINE
#define MAXLINE 4096
#endif

#define SA struct sockaddr

void dg_echo(int sockfd, SA* pcliaddr, socklen_t clilen)
{
    int n;
    socklen_t len;

    char mesg[MAXLINE];

    for(; ;)
    {
        len = clilen;

        n = recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);

        sendto(sockfd, mesg, n, 0, pcliaddr, len);
    }
}

error.h

#ifndef ERROR_H
#define ERROR_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <unistd.h>
#include <syslog.h>
#include <errno.h>
#include "constant.h"

static void err_doit(int, int, const char *, va_list);

void err_ret(const char *fmt, ...);
void err_sys(const char *fmt, ...);
void err_dump(const char *fmt, ...);
void err_msg(const char *fmt, ...);
void err_quit(const char *fmt, ...);

#endif

error.c

#include "error.h"

int daemon_proc;        /* set nonzero by daemon_init() */

static void err_doit(int, int, const char *, va_list);

/* Nonfatal error related to system call
 *  * Print message and return */

void err_ret(const char *fmt, ...)
{
    va_list ap;

    va_start(ap, fmt);
    err_doit(1, LOG_INFO, fmt, ap);
    va_end(ap);
    return;
}

/* Fatal error related to system call
 *  * Print message and terminate */

void err_sys(const char *fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    err_doit(1, LOG_ERR, fmt, ap);
    va_end(ap);
    exit(1);
}

/* Fatal error related to system call
 *  * Print message, dump core, and terminate */

void err_dump(const char *fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    
    err_doit(1, LOG_ERR, fmt, ap);
    
    va_end(ap);
    
    abort();        /* dump core and terminate */
    
    exit(1);        /* shouldn't get here */
}
/* Fatal error unrelated to system call
 *  * Print message and terminate */

void err_quit(const char *fmt, ...)
{
    va_list ap;
    va_start(ap, fmt);
    
    err_doit(0, LOG_ERR, fmt, ap);
    
    va_end(ap);
    
    exit(1);
}

/* Print message and return to caller
 *  * Caller specifies "errnoflag" and "level" */

static void err_doit(int errnoflag, int level, const char *fmt, va_list ap)
{
    int errno_save,n;
    char buf[MAXLINE + 1];
    errno_save = errno;        /* value caller might want printed */
#ifdef HAVE_VSNPRINTF
    vsnprintf(buf, MAXLINE, fmt, ap);    /* safe */
#else
    vsprintf(buf, fmt, ap);                    /* not safe */
#endif
    n = strlen(buf);
    if (errnoflag)
        snprintf(buf + n, MAXLINE - n, ": %s", strerror(errno_save));
    strcat(buf, "\n");
    
    if (daemon_proc) {
        syslog(level, buf);
    }
    else 
    {
        fflush(stdout);        /* in case stdout and stderr are the same */

        fputs(buf, stderr);
        fflush(stderr);
    }
    return;
}

constant.h

#ifndef Constant_H
#define Constant_H

#ifndef MAXLINE
#define MAXLINE 4096
#endif

#ifndef LISTENQ
#define LISTENQ 1024
#endif

#ifndef BUFFSIZE
#define BUFFSIZE 8092
#endif

#endif


makefile

bins = udpserv udpcli
objs = udpserv.o udpcli.o dg_echo.o dg_cli.o error.o
srcs = udpserv.c udpcli.c dg_echo.c dg_cli.c error.c error.h

$(bins):$(objs)
	gcc -o udpserv udpserv.o dg_echo.o
	gcc -o udpcli udpcli.o dg_cli.o error.o

$(objs):$(srcs)
	gcc -c udpserv.c
	gcc -c udpcli.c
	gcc -c dg_echo.c
	gcc -c dg_cli.c
	gcc -c error.c error.h

clean:
	rm -rf $(bins) *.o *.h.gch

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值