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,有就传输时间文本。
网友评论