intmain(int argc, ...">
美文网首页
unix上简单的网络服务程序的解释-C语言

unix上简单的网络服务程序的解释-C语言

作者: 半步江南 | 来源:发表于2018-12-14 17:04 被阅读5次

    include "unp.h"

    include <time.h>

    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_port = 80;
    servaddr.sin_addr.s_addr = htonl(0xC0A80104);
    printf("listening at %#X\n",servaddr.sin_addr.s_addr);
    servaddr.sin_port = htons(13); /
    daytime server */
    Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
    Listen(listenfd, LISTENQ);
    printf("%d\n",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);
    }
    }
    上面是unix 网络编程一书中的1.5例。
    listenfd:socket的标识符
    buff[MAXLINE]:缓冲区

    listenfd = Socket(AF_INET, SOCK_STREAM, 0);
    

    向Socket()函数传入三个参数,
    AF_INET :IPV4协议
    SOCK_STREAM:流传输,在AF_INET 为IPV4时,对应着TCP
    第三个参数为0,代表使用前两个参数组合后指定的协议,在这个例子中时TCP协议

    bzero(&servaddr, sizeof(servaddr));
    

    bzero()函数将servaddr结构清零。

    servaddr.sin_family      = AF_INET
        servaddr.sin_addr.s_addr = htonl(0xC0A80104);
            printf("listening at %#X\n",servaddr.sin_addr.s_addr);
        servaddr.sin_port        = htons(13);   /* daytime server */
    

    为servaddr中的变量赋值。
    注意,这个0xC0A80104值是小端的IP地址的值,它的值是192.168.1.4。
    经过htonl (host to net),字节序从小端转为大端,注意只是字节序被改变,字节内的bit序仍然是小端序。这个知识点比较绕,需要适应。

    Bind(listenfd, (SA *) &servaddr, sizeof(servaddr));
    

    Bind()函数将socket的标识符与地址结构对应在一起,当客户端访问服务端的地址时,会使用由此socket的标识符对应的协议。

    Listen(listenfd, LISTENQ);
    

    Listen()函数会监听上面的标识符对应的消息。LISTENQ=1024,代表最大连接数。

    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);
        }
    

    进入死循环,不断的轮询是否有connect,有就传输时间文本。

    相关文章

      网友评论

          本文标题:unix上简单的网络服务程序的解释-C语言

          本文链接:https://www.haomeiwen.com/subject/abughqtx.html