使用udp_client或者udp_connect和udp_server 的时间获取函数

udp_client.c函数代码:

/* include udp_client */

#include "unp.h"

int udp_client(const char *host, const char *serv, SA **saptr, socklen_t *lenp)

{

int sockfd, n;

struct addrinfo hints, *res, *ressave;


bzero(&hints, sizeof(struct addrinfo));

hints.ai_family = AF_UNSPEC;

hints.ai_socktype = SOCK_DGRAM;


if ( (n = getaddrinfo(host, serv, &hints, &res)) != 0)

err_quit("udp_client error for %s, %s: %s",

host, serv, gai_strerror(n));

ressave = res;

do {

sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);

if (sockfd >= 0)

break; /* success */

} while ( (res = res->ai_next) != NULL);


if (res == NULL) /* errno set from final socket() */

err_sys("udp_client error for %s, %s", host, serv);

*saptr = Malloc(res->ai_addrlen);

memcpy(*saptr, res->ai_addr, res->ai_addrlen);

*lenp = res->ai_addrlen;

freeaddrinfo(ressave);

return(sockfd);

}

/* end udp_client */

int Udp_client(const char *host, const char *serv, SA **saptr, socklen_t *lenptr)

{

return(udp_client(host, serv, saptr, lenptr));

}


daytimeupdcli1.c客户端代码:(使用udp_client.c)

#include "unp.h"

int main(int argc, char **argv)

{

int sockfd, n;

char recvline[MAXLINE + 1];

socklen_t salen;

struct sockaddr *sa;


if (argc != 3)

err_quit("usage: daytimeudpcli1 <hostname/IPaddress> <service/port#>");


sockfd = Udp_client(argv[1], argv[2], (void **) &sa, &salen);


printf("sending to %s\n", Sock_ntop_host(sa, salen));


Sendto(sockfd, "", 1, 0, sa, salen); /* send 1-byte datagram */


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

recvline[n] = '\0'; /* null terminate */

Fputs(recvline, stdout);


exit(0);

}


或者:
udp_connect.c代码:

/* include udp_connect */

#include "unp.h"

int udp_connect(const char *host, const char *serv)

{

int sockfd, n;

struct addrinfo hints, *res, *ressave;


bzero(&hints, sizeof(struct addrinfo));

hints.ai_family = AF_UNSPEC;

hints.ai_socktype = SOCK_DGRAM;


if ( (n = getaddrinfo(host, serv, &hints, &res)) != 0)

err_quit("udp_connect error for %s, %s: %s",

host, serv, gai_strerror(n));

ressave = res;


do {

sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);

if (sockfd < 0)

continue; /* ignore this one */


if (connect(sockfd, res->ai_addr, res->ai_addrlen) == 0)

break; /* success */


Close(sockfd); /* ignore this one */

} while ( (res = res->ai_next) != NULL);


if (res == NULL) /* errno set from final connect() */

err_sys("udp_connect error for %s, %s", host, serv);

freeaddrinfo(ressave);

return(sockfd);

}

/* end udp_connect */

int Udp_connect(const char *host, const char *serv)

{

int n;

if ( (n = udp_connect(host, serv)) < 0) {

err_quit("udp_connect error for %s, %s: %s",

host, serv, gai_strerror(-n));

}

return(n);

}



daytimeupdcli2.c(使用udp_connect.c):

#include "unp.h"

int main(int argc, char **argv)

{

int sockfd, n;

char recvline[MAXLINE + 1];


if (argc != 3)

err_quit("usage: daytimeudpcli2 <hostname/IPaddress> <service/port#>");


sockfd = Udp_connect(argv[1], argv[2]);


Write(sockfd, "", 1); /* send 1-byte datagram */


n = Read(sockfd, recvline, MAXLINE);

recvline[n] = '\0'; /* null terminate */

Fputs(recvline, stdout);


exit(0);

}



udp_server.c代码:

/* include udp_server */

#include "unp.h"

int udp_server(const char *host, const char *serv, socklen_t *addrlenp)

{

int sockfd, n;

struct addrinfo hints, *res, *ressave;


bzero(&hints, sizeof(struct addrinfo));

hints.ai_flags = AI_PASSIVE;

hints.ai_family = AF_UNSPEC;

hints.ai_socktype = SOCK_DGRAM;


if ( (n = getaddrinfo(host, serv, &hints, &res)) != 0)

err_quit("udp_server error for %s, %s: %s",

host, serv, gai_strerror(n));

ressave = res;


do {

sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);

if (sockfd < 0)

continue; /* error - try next one */


if (bind(sockfd, res->ai_addr, res->ai_addrlen) == 0)

break; /* success */


Close(sockfd); /* bind error - close and try next one */

} while ( (res = res->ai_next) != NULL);


if (res == NULL) /* errno from final socket() or bind() */

err_sys("udp_server error for %s, %s", host, serv);

if (addrlenp)

*addrlenp = res->ai_addrlen; /* return size of protocol address */

freeaddrinfo(ressave);

return(sockfd);

}

/* end udp_server */


int Udp_server(const char *host, const char *serv, socklen_t *addrlenp)

{

return(udp_server(host, serv, addrlenp));

}



daitimeupdsrv2.c代码:

#include "unp.h"

#include <time.h>

int main(int argc, char **argv)

{

int sockfd;

ssize_t n;

char buff[MAXLINE];

time_t ticks;

socklen_t len;

struct sockaddr_storage cliaddr;


if (argc == 2)

sockfd = Udp_server(NULL, argv[1], NULL);

else if (argc == 3)

sockfd = Udp_server(argv[1], argv[2], NULL);

else

err_quit("usage: daytimeudpsrv [ <host> ] <service or port>");


for ( ; ; ) {

len = sizeof(cliaddr);

n = Recvfrom(sockfd, buff, MAXLINE, 0, (SA *)&cliaddr, &len);

printf("datagram from %s\n", Sock_ntop((SA *)&cliaddr, len));


ticks = time(NULL);

snprintf(buff, sizeof(buff), "%.24s\r\n", ctime(&ticks));

Sendto(sockfd, buff, strlen(buff), 0, (SA *)&cliaddr, len);

}

}



运行结果:
服务器:

➜  names  ./daytimeudpsrv2 1399

datagram from 127.0.0.1:52995

datagram from 127.0.0.1:50425



客户端:

➜  names  ./daytimeudpcli1 127.0.0.1 1399

sending to 127.0.0.1

Tue May  5 10:05:58 2015

➜  names  ./daytimeudpcli2 127.0.0.1 1399

Tue May  5 10:06:04 2015




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值