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

服务器代码:

#include

#include

#include

#include

#include

#include

#include

#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

This is title

\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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值