栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

文章目录
    • 1、头文件
    • 2、多进程实现
    • 3、线程实现
    • 4、多路IO复用

1、头文件
  • tcp_fun.h/.c:tcp通信的简单实现
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 

#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复用
  • 多路复用可做高性能高并发的服务器
  • 主要有select函数,该函数较为复杂,暂时还在学习中
  • 与之类似函数的还有poll、epoll

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

暑期编程PK赛 得CSDN机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1017271.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号