【Linux网络编程】基于TCP的多线程(pthread)版本最简陋的HTTP服务器

来源:互联网 发布:mac镜像文件dmg下载 编辑:程序博客网 时间:2024/06/11 12:45



服务器代码:


#include <stdio.h>#include <stdlib.h>#include <string.h>#include <pthread.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#define SOCK_FAIL 1#define BIND_FAIL 2#define LISTEN_FAIL 3#define USE_ERROR 4#define ACCPET_FAIL 5// 使用说明static void Usage(const char* arg) {printf("Usage:%s  [server_ip] [server_port]\n", arg);}int startup(const char* ip, int port){// 1. new socket int sock = socket(AF_INET, SOCK_STREAM, 0 );if(sock < 0){perror("socket ---");exit(SOCK_FAIL);}// 2. bind socketstruct sockaddr_in local;local.sin_family = AF_INET;local.sin_addr.s_addr = inet_addr(ip);local.sin_port = htons(port);int opt = 1;setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));if( bind(sock, (struct sockaddr*)&local, sizeof(local)) < 0){perror("bind ---");exit(BIND_FAIL);}// 3. listen socketif( listen(sock, 5) < 0){perror("listen ---");exit(LISTEN_FAIL);}return sock;}void* handler(void *arg){int sock = (int)arg;char buf[10240];while(1){ssize_t s = read(sock, buf, sizeof(buf)-1);if(s < 0){perror("Read");exit(-1);}else if (s > 0){const char* msg = "HTTP/1.1 200 OK\r\n\r\n<html><h1>This is title</h1></html>\r\n";buf[s] = '\0';printf("- message: %s \n", buf);write(sock, msg, strlen(msg));break;}else break;}printf("quit\n");}int main(int argc, char* argv[]){if(argc != 3){Usage(argv[0]);return USE_ERROR;}int listen_sock = startup(argv[1], atoi(argv[2])); // ip portstruct sockaddr_in peer;socklen_t len = sizeof(peer);printf("listen .... \n");while(1){int new_sock = accept(listen_sock, (struct sockaddr*)&peer, &len);if( new_sock < 0){perror("accept --- ");continue;}printf("connect sucess ! client : ip %s prot %d \n", inet_ntoa(peer.sin_addr), ntohs(peer.sin_port));pthread_t tid;pthread_create(&tid, NULL, handler, (void*)new_sock);pthread_detach(tid);}return 0;}



原创粉丝点击