2010年10月19日星期二

《GNU/LINUX环境编程》-套接字编程的一个注解

书籍:《GNU/LINUX环境编程》(第二版)

出版社:清华大学出版社

备注:中文版

原书第157-158页代码:
源代码如下:

#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <unistd.h>

#define MAX_BUFFER 128
#define DAYTIME_SERVER_PORT 13

int main(void)
{
int serverFD,connetctionFD;
struct sockaddr_in servaddr;
char timebuffer[MAX_BUFFER+1];
time_t currentTime;

serverFD = socket ( AF_INET, SOCK_STREAM, 0 );

memset( &servaddr, 0, sizeof(servaddr) );
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htons(DAYTIME_SERVER_PORT);

bind( serverFD, (struct sockaddr *)&servaddr, sizeof(servaddr) );

listen( serverFD, 5 );

while(1) {
connetctionFD = accept( serverFD, (struct sockaddr *)NULL, NULL );

if (connetctionFD >= 0) {
currentTime = time( NULL );
snprintf( timebuffer, MAX_BUFFER, "%s \n", ctime( &currentTime) );
write( connetctionFD, timebuffer, strlen(timebuffer));
close( connetctionFD );
}
}
}

按照书上的讲解,使用的端口为13,

但是运行的效果是:
hello@world:~$ telnet localhost 13
Trying ::1...
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
hello@world:~$

很显然这个端口是被占用的了。

所以为了能够有效运行,将宏定义中的端口改为1024之后的不常用的端口,就可以了。
如果还是不行的话,就更换端口。(或者事先用工具扫描已经使用的端口,分配端口时,避开就可以了)

没有评论:

发表评论