文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C/S架构学习之多线程实现TCP并发服务器

2023-10-24 19:41

关注
int sockfd = socket(AF_INET,SOCK_STREAM,0); //通信域选择IPV4、套接字类型选择流式
struct sockaddr_in serveraddr; //定义网络信息结构体变量    socklen_t serveraddrlen = sizeof(serveraddr);//求出结构体变量的内存空间大小    memset(&serveraddr,0,serveraddrlen); //结构体清零    serveraddr.sin_family = AF_INET;  //使用IPV4网络协议    serveraddr.sin_addr.s_addr = inet_addr(argv[1]);  //IP地址    serveraddr.sin_port = htons(atoi(argv[2]));//网络字节序的端口号
int ret = bind(sockfd,(struct sockaddr *)&serveraddr,serveraddrlen);
int ret1 = listen(sockfd, 5);
if(-1 == (info.accept_fd = accept(sockfd,(struct sockaddr *)&(info.clientaddr),&clientaddr_len)))        {            perror("accept error");            exit(-1);        }
if(0 != (ret1 = pthread_create(&thread_id,NULL,message_handling,&info)))        {            printf("pthread_create error : errno = [%d] errstr = [%s]\n",ret1,strerror(ret1));            exit(EXIT_FAILURE);        }
        if(0 != (ret2 = pthread_detach(thread_id)))        {            printf("pthread_create error : errno = [%d] errstr = [%s]\n",ret2,strerror(ret2));            exit(EXIT_FAILURE);        }
//线程处理函数void *message_handling(void *arg);int nbytes = recv(acceptfd,buf,sizeof(buf),0);printf("客户端发来数据[%s]\n",buf);strcat(buf,"----k"); //组装应答消息int ret2 = send(acceptfd,buf,sizeof(buf),0);
close(info.accept_fd);    pthread_exit(NULL);
//多线程实现TCP并发服务器#include #include #include #include #include #include #include #include #include #include #include typedef struct INFO{    int accept_fd;    struct sockaddr_in clientaddr;}info_t;//线程处理函数void *message_handling(void *arg);int main(int argc, char const *argv[]){    //入参合理性检查    if(3 != argc)    {        printf("Usage : %s  \n",argv[0]);        exit(-1);    }    //创建套接字    int sockfd = socket(AF_INET,SOCK_STREAM,0);    if(-1 == sockfd)    {        perror("socket error");        exit(-1);    }    //填充服务器网络信息结构体    struct sockaddr_in serveraddr;    socklen_t serveraddr_len = sizeof(serveraddr);    memset(&serveraddr,0,serveraddr_len);    serveraddr.sin_family = AF_INET;    serveraddr.sin_addr.s_addr = inet_addr(argv[1]);    serveraddr.sin_port = htons(atoi(argv[2]));    //将套接字与服务器网络信息结构体绑定    if(-1 == bind(sockfd,(struct sockaddr *)&serveraddr,serveraddr_len))    {        perror("bind error");        exit(-1);    }    //将套接字设置成被监听状态    if(-1 == listen(sockfd,5))    {        perror("listen error");        exit(-1);    }    info_t info;    pthread_t thread_id;    int ret1 = 0;    int ret2 = 0;    socklen_t clientaddr_len = sizeof(info.clientaddr);    while(true)    {                //等待客户端连接        if(-1 == (info.accept_fd = accept(sockfd,(struct sockaddr *)&(info.clientaddr),&clientaddr_len)))        {            perror("accept error");            exit(-1);        }        //若有客户端连接成功,就创建线程,专门用来和该客户端通信        if(0 != (ret1 = pthread_create(&thread_id,NULL,message_handling,&info)))        {            printf("pthread_create error : errno = [%d] errstr = [%s]\n",ret1,strerror(ret1));            exit(EXIT_FAILURE);        }        //将线程设置成分离属性,线程结束后由操作系统回收资源        if(0 != (ret2 = pthread_detach(thread_id)))        {            printf("pthread_create error : errno = [%d] errstr = [%s]\n",ret2,strerror(ret2));            exit(EXIT_FAILURE);        }    }    close(sockfd);        return 0;}void *message_handling(void *arg){    info_t info = *(info_t *)arg;    printf("客户端[%s : %d]连接到服务器\n",inet_ntoa(info.clientaddr.sin_addr),ntohs(info.clientaddr.sin_port));    //接收客户端数据,并作出应答    int nbytes = 0;    char buf[128] = {0};    while(true)    {        memset(buf,0,sizeof(buf));        //接收消息        if(-1 == (nbytes = recv(info.accept_fd,buf,sizeof(buf),0)))        {            perror("recv error");            break;        }else if(0 == nbytes){            printf("客户端[%s : %d]断开了连接\n",inet_ntoa(info.clientaddr.sin_addr),ntohs(info.clientaddr.sin_port));            break;        }        if(!strcmp(buf,"quit"))        {            printf("客户端[%s : %d]退出了\n",inet_ntoa(info.clientaddr.sin_addr),ntohs(info.clientaddr.sin_port));            break;        }        printf("客户端[%s : %d]发来消息[%s]\n",inet_ntoa(info.clientaddr.sin_addr),ntohs(info.clientaddr.sin_port),buf);        //组装应答        strcat(buf,"------k");        //发送应答        if(-1 == send(info.accept_fd,buf,sizeof(buf),0))        {            perror("send error");            break;        }    }    close(info.accept_fd);    pthread_exit(NULL);    }

来源地址:https://blog.csdn.net/qq_41878292/article/details/133689780

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-服务器
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯