Tuesday, June 1, 2010

get datetime and listen 13 port server

原来看TCP/IP详解的书的时候,TCP/IP的知识比较缺乏,第一个程序始终得不到任何响应。使用的是send和recvfrom函数。

后来,看UNIX网络编程,使用了第一个程序,然后使用其后附带的ip206.168.112.96,很快就等到了一个日期字符串。
在其后还有一个提供日期服务的程序,在本机上运行了一个。然后直接调用本机的日期服务,很快就得到数据。
下面这个是监听程序。编译后运行在本机,由于其有一个无限循环函数,会一直运行。
/*
 * =====================================================================================
 *
 *       Filename:  time_server.c
 *
 *    Description:  listen 13 port,and supply date time info
 *
 *        Version:  1.0
 *        Created:  06/02/2010 12:53:54 PM
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  YOUR NAME (),
 *        Company:
 *
 * =====================================================================================
 */
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <stdio.h>
//#include    <netinet/in.h>    /* sockaddr_in{} and other Internet defns */
#include    <arpa/inet.h>    /* inet(3) functions */
#include    <fcntl.h>        /* for nonblocking */
#include    <netdb.h>
#include    <signal.h>
#include    <stdio.h>
#include    <stdlib.h>
#include    <string.h>
#include    <sys/stat.h>    /* for S_xxx file mode constants */
#include    <sys/uio.h>        /* for iovec{} and readv/writev */
#include    <unistd.h>
#include    <sys/wait.h>
#include    <sys/un.h>        /* for Unix domain sockets */
#include    <time.h>
#define MAXLINE 256

#define    SA    struct sockaddr
#define    LISTENQ        1024    /* 2nd argument to listen() */
int main(int argc,char** argv)
{
    int                    listenfd,connfd;
    struct sockaddr_in    servaddr;
    char                buff[MAXLINE];
    time_t                ticks;
    listenfd=socket(AF_INET,SOCK_STREAM,0);
    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family=AF_INET;
    servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
    servaddr.sin_port=htons(13);/* daytime server */
    bind(listenfd,(SA*)&servaddr,sizeof(servaddr));
    listen(listenfd,LISTENQ);
    for(;;){
        connfd=accept(listenfd,(SA*)NULL,NULL);
        ticks=time(NULL);
        snprintf(buff,sizeof(buff),"%.24s\r\n",ctime(&ticks));
        write(connfd,buff,strlen(buff));
        close(connfd);
    }

}
//////////////////////////////////////////////////////////////////////
这个获得数据的代码,编译为a.ou后,./a.out localhost就可以得到上面的程序的输出。
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <stdio.h>
//#include    <netinet/in.h>    /* sockaddr_in{} and other Internet defns */
#include    <arpa/inet.h>    /* inet(3) functions */
#include    <fcntl.h>        /* for nonblocking */
#include    <netdb.h>
#include    <signal.h>
#include    <stdio.h>
#include    <stdlib.h>
#include    <string.h>
#include    <sys/stat.h>    /* for S_xxx file mode constants */
#include    <sys/uio.h>        /* for iovec{} and readv/writev */
#include    <unistd.h>
#include    <sys/wait.h>
#include    <sys/un.h>        /* for Unix domain sockets */


#define MAXLINE 256
 int
 main(int argc, char **argv)
 {
        int     sockfd,n;
        char    recvline[MAXLINE + 1];
        struct sockaddr_in servaddr;
        if (argc != 2)
             printf("usage: a.out <IPaddress>");
        if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
             printf("socket error");
         bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(13); /* daytime server */
         if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr)<=0)
             printf("inet_pton error for %s", argv[1]);
            if (connect(sockfd, /*  (sockaddr *)*/ &servaddr, sizeof(servaddr)) < 0)
             printf("connect error");
        while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
             recvline[n] = 0;                /* null terminate */
             if (fputs(recvline, stdout) == EOF)
                    printf("fputs error");
        }
if (n < 0)
             printf("read error");
        exit(0);
}

ps。WTO又在为我们做好事( 为什么关心�朝屁民的永远的帝国主义呢),希望不久的将来能看到blogspot解封,我就能亲眼看一看我自己的博客长什么样了。



从远程服务器获得日期数据

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <stdio.h>
//#include    <netinet/in.h>    /* sockaddr_in{} and other Internet defns */
#include    <arpa/inet.h>    /* inet(3) functions */
#include    <fcntl.h>        /* for nonblocking */
#include    <netdb.h>
#include    <signal.h>
#include    <stdio.h>
#include    <stdlib.h>
#include    <string.h>
#include    <sys/stat.h>    /* for S_xxx file mode constants */
#include    <sys/uio.h>        /* for iovec{} and readv/writev */
#include    <unistd.h>
#include    <sys/wait.h>
#include    <sys/un.h>        /* for Unix domain sockets */


#define MAXLINE 256
 int
 main(int argc, char **argv)
 {
        int     sockfd,n;
        char    recvline[MAXLINE + 1];
        struct sockaddr_in servaddr;
        if (argc != 2)
             printf("usage: a.out <IPaddress>");
        if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
             printf("socket error");
         bzero(&servaddr, sizeof(servaddr));
        servaddr.sin_family = AF_INET;
        servaddr.sin_port = htons(13); /* daytime server */
         if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr)<=0)
             printf("inet_pton error for %s", argv[1]);
            if (connect(sockfd, /*  (sockaddr *)*/ &servaddr, sizeof(servaddr)) < 0)
             printf("connect error");
        while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {
             recvline[n] = 0;                /* null terminate */
             if (fputs(recvline, stdout) == EOF)
                    printf("fputs error");
        }
if (n < 0)
             printf("read error");
        exit(0);
}

编译为get_data后,使用./getdata 206.168.114.96,可以得到该服务器送出的日期数据。