本节将讲解一个read函数读取数据的实例。在程序中,监听一个端口,如果有客户端连接这个端口则接受这个连接,然后用read函数读取远程主机发送的数据,输出这些数据以后结束这个程序。程序的代码如下所示。
代码17-6 read函数接收数据:/源文件/17/17.24.c
#include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<unistd.h> /*包含头文件。*/ #define PORT 6677 /*定义一个端口号。*/ main() { int sockfd,newsockfd,fd; /*定义相关的变量。*/ struct sockaddr_in addr; int addr_len = sizeof(struct sockaddr_in); fd_set myreadfds; char msgbuffer[256]; char msg[] ="This is the message from server.Connected./n"; if ((sockfd = socket(AF_INET,SOCK_STREAM,0))<0) /*建立一个socket。*/ { perror("socket"); exit(1); } else { printf("socket created ./n"); /*socket建立成功。*/ printf("socked id: %d /n",sockfd); } bzero(&addr,sizeof(addr)); /*清空zero所在的内存。*/ addr.sin_family =AF_INET; addr.sin_port = htons(PORT); addr.sin_addr.s_addr = htonl(INADDR_ANY); if(bind(sockfd,&addr,sizeof(addr))<0) /*绑定IP端口。*/ { perror("connect"); exit(1); } else { printf("connected./n"); printf("local port:%d/n",PORT) ; } if(listen(sockfd,3)<0) /*监听一个端口号。*/ { perror("listen"); exit(1); } else { printf("listenning....../n"); } if((newsockfd = accept (sockfd,&addr,&addr_len))<0) /*接受一个连接。*/ { perror("accept"); } else /*输出结果。*/ { printf("cnnect from %s/n",inet_ntoa(addr.sin_addr)); if(read(newsockfd,msgbuffer,sizeof(msgbuffer))<=0) /*接收信息。*/ { perror("accept"); } else { printf("message:/n%s /n",msgbuffer); /*输出接收到的信息。*/ } } }
输入下面的命令,编译这个程序。
输入下面的命令,对这个程序添加可执行权限。
输入下面的命令,运行这个程序。
程序的运行结果如下所示。结果表明这个程序正在监听本地计算机的6677号端口。
socket created . socked id: 3 connected. local port:6677 listenning......
打开浏览器,在浏览器中输入下面的网址,然后按“Enter”键,使浏览器访问本地计算机的6677号端口。
浏览器显示无法打开网页。在终端中显示了下面的代码,这些代码是浏览器向本机的6677号端口请求打开网页的数据报。
cnnect from 127.0.0.1 message: GET / HTTP/1.1 Host: 127.0.0.1:6677 User-Agent: Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.8.1.8) Gecko/20071030 Fedora/2.0.0.8-2. fc8 Firefox/2.0.0.8 Accept: text/xml,application/xml,application/ xhtml+xml,text/html;q=0.9,text/ plain;q=0.8,image/png,*/*