您的位置:首页 > 理论基础 > 计算机网络

实现TCP并发服务器之二(多线程)

2012-07-04 08:07 363 查看
通过多线程来实现TCP服务器端和多进程类似,客户端代码同上一篇博客,下面只粘贴服务器端的代码。

编译方法:gcc server.c -o server.out -lpthread

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<pthread.h>

#define MAX_LISTEN 5
#define PORT 1987
#define IP "127.0.0.1"

void serve_proc(int conn_fd)
{
int recv_num;
int send_num;
char recv_buf[100];
char send_buf[100];

pid_t pid = pthread_self();

printf("client %d started\n", pid);

while (1) {
//receive
recv_num = recv(conn_fd, recv_buf, sizeof(recv_buf), 0);
if (recv_num <= 0) {
close(conn_fd);
break;
}
recv_buf[recv_num] = '\0';
printf("thread proc %d got : %s\n", pid, recv_buf);

if (strcmp(recv_buf,"quit") == 0) {
printf("thread proc %d quit\n", pid);
break;
}

//send
sprintf(send_buf, "server proc got %d bytes\n", recv_num);
send_num = send(conn_fd, send_buf, strlen(send_buf), 0);
if (send_num <= 0) {
close(conn_fd);
break;
}
printf("thread proc %d sent : %s\n", pid, send_buf);
}

close(conn_fd);
}

int main()
{
int ret;
pthread_t id;

int conn_fd;
int sock_fd = socket(AF_INET,SOCK_STREAM,0);
if (sock_fd < 0) {
perror("create socket failed");
exit(1);
}

struct sockaddr_in addr_client;
int client_size = sizeof(struct sockaddr_in);

struct sockaddr_in addr_serv;
memset(&addr_serv, 0, sizeof(addr_serv));
addr_serv.sin_family = AF_INET;
addr_serv.sin_port = htons(PORT);
addr_serv.sin_addr.s_addr = inet_addr(IP);

if (bind(sock_fd,(struct sockaddr *)&addr_serv,sizeof(struct sockaddr_in)) < 0) {
perror("bind error");
exit(1);
}

if (listen(sock_fd,MAX_LISTEN) < 0) {
perror("listen failed");
exit(1);
}

while (1) {
conn_fd = accept(sock_fd, (struct sockaddr *)&addr_client, &client_size);
if (conn_fd < 0) {
perror("accept failed");
exit(1);
}

ret = pthread_create(&id, NULL, (void *)&serve_proc, (void *)conn_fd);

if (ret != 0) {
perror("create thread error!");
}
}

close(sock_fd);
return 0;
}


从上面看出主要的改动也就是从创建进程响应请求变成了创建线程响应请求,我这里也只是做个简单的示例,如果要考虑访问全局变量的话,就需要增加锁,互斥信号等方式保证程序的顺利运行,则要复杂得多了。

和多进程相比也有一些不同,比如程序出错不能随便exit,否则主进程也会被关闭。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: