今天学习网络编程,做了一个小练习,但是这个程序会自动退出,其原因还在思考当中,现在记录下来,以便学习和复习。源代码如下:
/* ********************************** * Filename: web_server.c * Description: * Version: 1.0 * Created: 2013 * Revision: none * Compiler: gcc * Author: YOUR NAME (), * Company: * *********************************/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <arpa/inet.h>#include <netinet/in.h>#include <sys/socket.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <pthread.h>#define WAIT_LINE 20typedef struct _BROWSE_MSG{ int connfd; struct in_addr cli_addr;}BROWSE_MSG;void * server_process(void * arg){ char server_send_buf[1024] = ""; char browse_analy[1024] = ""; char filename[100] = "html/"; char client_ip[INET_ADDRSTRLEN] = ""; int len = 0; char head[]="HTTP/1.1 200 OK\r\n" \ "Content-Type:text/html\r\n" \ "\r\n"; char err[]= "HTTP/1.1404NotFound\r\n" \ "Content-Type:text/html\r\n" \ "\r\n" \ "<HTML><BODY>Filenotfound</BODY></HTML>";// printf("err = %s\n",err); BROWSE_MSG * browse_send; browse_send = (BROWSE_MSG *)arg;// printf("browse_send->connfd = %d\n",browse_send->connfd); recv(browse_send->connfd, browse_analy, sizeof(browse_analy), 0); sscanf(browse_analy,"GET /%[^ ]",(filename+5)); if ( 0 == filename[5]) { strcpy(filename,"html/index.html"); } printf("filename = %s\n",filename); int fd = open(filename, O_RDONLY); if (fd < 0) { perror("open error!\n"); send(browse_send->connfd,err,strlen(err),0); close(browse_send->connfd); return NULL; } send(browse_send->connfd, head, strlen(head), 0); while ( ( len = read(fd, server_send_buf, sizeof(server_send_buf) ) ) > 0 ) { send(browse_send->connfd, server_send_buf, len, 0); } close(fd); close(browse_send->connfd); inet_ntop(AF_INET, &browse_send->cli_addr, client_ip, INET_ADDRSTRLEN); printf("browse ip = %s\n",client_ip); free(browse_send); return NULL;}int main(int argc, char *argv[]){ int sockfd = 0; /*定义通信套接字*/ int connfd = 0; /*定义已连接套接字*/ struct sockaddr_in server_addr;/*定义服务器套接字地址*/ unsigned short port = 8000;/*定义套接字端口*/ pthread_t thread_id;/*定义线程ID*/ bzero(&server_addr, sizeof(server_addr));/*清零*/ server_addr.sin_family = AF_INET;/*IPV4*/ server_addr.sin_port = htons(port); server_addr.sin_addr.s_addr = htonl(INADDR_ANY); if (argc > 1) { port = atoi(argv[1]); } printf("TCP Server started at port %d\n",port); sockfd = socket(AF_INET, SOCK_STREAM,0);/*创建套接字*/ if (sockfd < 0) { perror("socket error"); exit(-1); } printf("Binding server to port %d\n",port); int ret = bind(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr));/*绑定172.20.223.180*/ if (0 != ret ) { perror("bind error!\n"); close(sockfd); exit(-1); } ret = listen(sockfd, WAIT_LINE);/*监听*/ if (0 != ret ) { perror("listen error!\n"); close(sockfd); exit(-1); } printf("Waiting browser...\n"); while (1) { char client_ip[INET_ADDRSTRLEN] = "";/*保存客户端IP地址*/ struct sockaddr_in client_addr;/*定义客户端套接字地址*/ socklen_t cliaddr_len = sizeof(client_addr);/*套接字地址长度*/ BROWSE_MSG * BRO_MSG = (BROWSE_MSG *)malloc(sizeof(BROWSE_MSG)); connfd = accept(sockfd, (struct sockaddr *)&client_addr, &cliaddr_len); if (connfd < 0) { perror("accept error!\n"); close(sockfd); exit(-1); } inet_ntop(AF_INET, &client_addr.sin_addr, client_ip, INET_ADDRSTRLEN); printf("client ip is %s\n",client_ip); BRO_MSG->connfd = connfd; BRO_MSG->cli_addr = client_addr.sin_addr; if (connfd > 0) { pthread_create(&thread_id, NULL, (void *)server_process, (void *)BRO_MSG); pthread_detach(thread_id); } } close(sockfd); return 0;}