linux网络编程 -- 并发服务器

1、头文件

2、多进程实现

#include "tcp_fun.h"
#define IP "192.168.200.134"//本机地址
#define PORT 2233 //自定义端口
int main() {
    //socket bind listen
    int sock_fd = tcp_server_init(IP,PORT);
    int new_fd;

    printf("listening...\n");
    while (1) {
        new_fd = tcp_accept(sock_fd);
        if (new_fd < 0)
            break;
        if(fork() == 0){
            /*子进程*/
            tcp_server_chat(new_fd);//循环接收客户端消息
            close(new_fd);
        } else{
            /*父进程*/
            close(new_fd);//关闭客户端套接字,继续监听
        }
    }
    close(sock_fd);
}

在这里插入图片描述多进程开销大,且父子进程相互独立,不好通信,在并发服务器用的很少

3、线程实现

#include "tcp_fun.h"
#include <pthread.h>

#define IP "192.168.200.134"//本机地址
#define PORT 2233

static void* tcp_chat(void *arg);
int main() {
    //socket bind listen
    pthread_t id;
    int sock_fd = tcp_server_init(IP,PORT);
    int new_fd;

    printf("listening...\n");
    while (1) {
        new_fd = tcp_accept(sock_fd);
        if (new_fd < 0)
            break;
        //tcp_server_chat(new_fd);
        pthread_create(&id,NULL,tcp_chat,&new_fd);
    }
    close(sock_fd);
}

static void* tcp_chat(void *arg){
    char buf[2048];
    unsigned int ret;

    int *tmp = (int *)arg;
    int new_fd = *tmp;

    // 循环接收,接收一条聊天信息
    memset(buf, 0, sizeof(buf));
    ret = recv(new_fd, buf, sizeof(buf) - 1, 0);
    while (ret) {
        if (ret < 0) {
            perror("recv error");
            break;
        }
        buf[ret] = 0;           // 由于是消息,所以对空间做尾部处理
        printf("receive msg is %s.\n", buf);

        // 再次等待接收客户端的消息
        memset(buf, 0, sizeof(buf));
        ret = recv(new_fd, buf, sizeof(buf) - 1, 0);
    }
    printf("client close!\n");
    close(new_fd);
    pthread_exit(NULL);
}

在这里插入图片描述线程相较于多进程开销小,也很容易通信(可共享全局变量),适合做一个简易的聊天程序

4、多路IO复用

在书中还看过fcntl函数将sock_fd非阻塞来实现并发,但我没做出来

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值