Linux下echo与time服务的程序实现(3)

/* Bind the socket */
    if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0)
    errexit("can't bind to %s port: %s\n", service,
    strerror(errno));
    if (type == SOCK_STREAM && listen(s, qlen) < 0)
    errexit("can't listen on %s port: %s\n", service,
    strerror(errno));
    return s;
}
int passiveTCP(const char *service,int qlen){
    return passivesock(service,"tcp",qlen);
}

三、针对TIME服务的UDP客户软件的实现

1.网络拓扑结构:

Linux下echo与time服务的程序实现

2.源码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <time.h>
#include <errno.h>

#define BUFSIZE 64
#define UNIXEPOCH 2208988800UL
#define MSG "what time is it?\n"
extern int errno;

int errexit(const char *format,...);
int connectsock(const char *host, const char *service, const char *transport );
int connectUDP(const char *host, const char *service);

int main(int argc, char *argv[]){
    char *host= "localhost";
    char *service= "time";
    time_t now;
    int s,n;

switch(argc){
case 1:
    host = "localhost";
    break;
case 3:
    service = argv[2];
case 2:
    host=argv[1];
    break;
default:
    fprintf(stderr,"usage: UDPtime[host[port]]\n");
    exit(1);
    }

s=connectUDP(host,service);
    (void)write(s,MSG,strlen(MSG));

n=read(s,(char *)&now,sizeof(now));
    if(n<0)    errexit("read failed: %s\n",strerror(errno));
    now=ntohl((unsigned long)now);
    now-=UNIXEPOCH;
    printf("%s",ctime(&now));
    exit(0);
}
int errexit(const char *format,...){
    va_list arg;
    va_start(arg, format);
    vfprintf(stderr,format,arg);
    va_end(arg);
    exit(1);
}
int connectsock(const char *host, const char *service, const char *transport )
/*
 * Arguments:
 *      host      - name of host to which connection is desired
 *      service  - service associated with the desired port
 *      transport - name of transport protocol to use ("tcp" or "udp")
 */
{
    struct hostent  *phe;  /* pointer to host information entry    */
    struct servent  *pse;  /* pointer to service information entry */
    struct protoent *ppe;  /* pointer to protocol information entry*/
    struct sockaddr_in sin; /* an Internet endpoint address    */
    int s, type;    /* socket descriptor and socket type    */


    memset(&sin, 0, sizeof(sin));
    sin.sin_family = AF_INET;

/* Map service name to port number */
    if ( pse = getservbyname(service, transport) )
        sin.sin_port = pse->s_port;
    else if ((sin.sin_port=htons((unsigned short)atoi(service))) == 0)
        errexit("can't get \"%s\" service entry\n", service);

/* Map host name to IP address, allowing for dotted decimal */
    if ( phe = gethostbyname(host) )
        memcpy(&sin.sin_addr, phe->h_addr, phe->h_length);
    else if ( (sin.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE )
        errexit("can't get \"%s\" host entry\n", host);

/* Map transport protocol name to protocol number */
    if ( (ppe = getprotobyname(transport)) == 0)
        errexit("can't get \"%s\" protocol entry\n", transport);

/* Use protocol to choose a socket type */
    if (strcmp(transport, "udp") == 0)
        type = SOCK_DGRAM;
    else
        type = SOCK_STREAM;

/* Allocate a socket */
    s = socket(PF_INET, type, ppe->p_proto);
    if (s < 0)
        errexit("can't create socket: %s\n", strerror(errno));

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/1ef64ff84b615e7cf29d5face359158a.html