端口号分3段:
1.well-known ports (0-1023) 由IANA分配和控制
2.registered ports (1024-49151) 不受IANA控制,但由IANA登记
3.ephemeral ports (49152-65535) 临时端口
注意:所有小于1024的端口为unix保留端口。因此分配给这些端口的服务器启动时必须具有超级用户特权
看下面的取系统时间的服务器客户端程序:
/*server*/
#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);//socket,bind,listen 准备连接(被动连接)
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
", ctime(&ticks));
Write(connfd, buff, strlen(buff)); //确认返回请求数据
Close(connfd);//关闭连接
}
}
/*client*/
#include "unp.h"
int
main(int argc, char **argv)
{
int sockfd, n;
char recvline[MAXLINE + 1];
struct sockaddr_in servaddr;
if (argc != 2)
err_quit("usage: a.out <IPaddress>");
if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
err_sys("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)
err_quit("inet_pton error for %s", argv[1]);
if (connect(sockfd, (SA *) &servaddr, sizeof(servaddr)) < 0) //主动打开连接
err_sys("connect error");
while ( (n = read(sockfd, recvline, MAXLINE)) > 0) { //read发送请求 获得服务器响应数据
recvline[n] = 0; /* null terminate */
if (fputs(recvline, stdout) == EOF)
err_sys("fputs error");
}
if (n < 0)
err_sys("read error");
exit(0);//连接关闭
}
在server端必须以 root用户启动服务:
[root]./a
在client 察看结果:
[user]./a 127.0.0.1
得到的结果是:Wed Dec 7 09:35:48 2005