代码如下:
thread_server.c
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<pthread.h>
#include<arpa/inet.h>
#include<unistd.h>
void usage(char* proc)
{
printf("%s [ip][port]\n",proc);
}
int startup(char* ip,int port)
{
int sock=socket(AF_INET,SOCK_STREAM,0);
if(sock<0)
{
perror("socket");
return 2;
}
struct sockaddr_in local;
local.sin_family=AF_INET;
local.sin_port=htons(port);
local.sin_addr.s_addr=inet_addr(ip);
int opt=1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
if((bind(sock,(struct sockaddr*)&local,sizeof(local)))<0)
{
perror("bing");
return 3;
}
if(listen(sock,10)<0)
{
perror("listen");
close(sock);
exit(4);
}
return sock;
}
void handler(char* arg)
{
int sock=(int)arg;
char buff[1024];
while(1)
{
ssize_t s = read(sock,buff,sizeof(buff));
if(s >0)
{
buff[s] = '\0';
printf("client:#%s",buff);
const char* msg = "HTTP/1.1 200 OK\r\n\r\n<html><h1>This is title</h1></html>\r\n";
write(sock,msg,strlen(msg));
}
if(s==0)
{
break;
}
}
printf("client quit!\n");
fflush(stdout);
}
int main(int argc,char* argv[])
{
if(argc<3)
{
usage(argv[0]);
return 1;
}
int listen_sock=startup(argv[1],atoi(argv[2]));
struct sockaddr_in client_addr;
socklen_t len=sizeof(client_addr);
while(1)
{
int new_sock=accept(listen_sock,(struct sockaddr *)&client_addr,&len);
if(new_sock<0)
{
perror("accept");
return 5;
}
char ipbuff[INET_ADDRSTRLEN];
memset(ipbuff,'\0',sizeof(ipbuff));
inet_ntop(AF_INET,&client_addr.sin_addr,ipbuff,sizeof(ipbuff));
printf("get connect,ip is %s,port is %d\n",ipbuff,ntohs(client_addr.sin_port));
pthread_t tid;
pthread_create(&tid, NULL, handler, (void*)new_sock); //创建线程执行handler
pthread_detach(tid);//将子线程与主线程分离
}
close(listen_sock);
return 0;
}
与tcp和tcp多进程服务器端差别不大,原来是交给一个进程处理,现在是交给一个线程,都类似,不做多的解释,客户端还是看最开始版本tcp客户端,不在这里多写,代码都一样。
实验效果图:
服务器端:
客户端1:
客户端2:
欢迎评论