socket 编程——我是服务器

来源:互联网 发布:ie浏览器不能上淘宝网 编辑:程序博客网 时间:2024/06/05 11:16
今天学习网络编程,做了一个小练习,但是这个程序会自动退出,其原因还在思考当中,现在记录下来,以便学习和复习。源代码如下:
/* ********************************** *       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;}