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

2018-12-14  本文已影响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,有就传输时间文本。

上一篇下一篇

猜你喜欢

热点阅读