【Linux网络编程】基于TCP的多线程(pthread)版本最简陋的HTTP服务器
2017-06-01 17:44
531 查看
服务器代码:
#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 socket struct 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 socket if( 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 port struct 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; }
相关文章推荐
- 【Linux网络编程】基于TCP的线程池(pthread_pool)版本HTTP服务器
- Linux网络编程【三】:TCP服务器多进程和多线程(http访问)版本
- 【Linux网络编程】基于TCP单进程版本阻塞式客户端/服务器
- Linux网络编程 基于tcp的多线程的服务器
- 【Linux网络编程】基于TCP多进程(fork)版本客户端/服务器
- Linux下的基于Pthread的多线程Socket编程
- 基于Linux的TCP网络编程
- 基于Linux的TCP网络编程实例
- Linux网络编程:基于TCP的程序开发(1)
- TCP网络编程中多线程的客户端实现(linux下)
- Linux Socket 网络编程 基于GTK+ 的多线程实现的局域网通信软件
- Linux C: 基于C/S的多线程网络编程 2 (多客户端)
- Linux网络编程:基于TCP的程序开发回顾篇《转》
- 基于Linux的TCP网络编程
- Linux网络编程:基于TCP的程序开发回顾篇
- 基于Linux的TCP网络编程
- linux网络编程之TCP/IP基础(五):分析一帧基于UDP的TFTP协议帧
- 基于Linux的TCP网络编程
- linux网络编程之用epoll实现io复用(基于tcp)
- 基于TCP的服务器端/客户端(二)---------网络编程(Linux----C)