问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c++ socket 创建线程

发布网友 发布时间:2022-08-30 13:26

我来回答

3个回答

热心网友 时间:2023-12-05 16:31

线程的使用在socket应用还是非socket应用是都是相同的

没有什么区别

只需要在应用中需要使用线程的地方创建线程就可以了


一般socket服务器线程模型是指在服务器接收到新的链接时

会创建一个线程来与该链接进行数据交流

在accept成功返回后就立即创建一个线程,并将一些与之链接相关的私有数据传递给该线程后

服务器会继续等待新的链接

而之前的链接则交由新创建的线程来服务

一个简单的模型类型于这样


1、等待链接

2、链接成功,创建一个新线程,并将相关数据传递给该线程

3、再回到1


下面以linux下的一个简单的echo服务器(回显服务,回显任何接收到的数据)为例(socket编程的方法大致都是相通的,linux和windows都大相径庭,只是稍有不同而已,在线程模型上都是一样的)说明socket的多线程服务器模型

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

#define PORT htons(8888)

typedef struct sockaddr SA;
typedef struct sockaddr_in SA_IN;

typedef struct
{
    int sockfd;
    SA_IN addr;
}DATA;

void err_quit(const char *msg)
{
    perror(msg);
    exit(-1);
}

void echo(DATA *data)
{
    char buf[1024];
    size_t n;

    printf("new thread %s\n",inet_ntoa(data->addr.sin_addr));

    while((n=recv(data->sockfd,buf,sizeof(buf)-1,0)) > 0)
    {
        if(strncmp(buf,"exit",4) == 0)
            break;

        send(data->sockfd,buf,n,0);
    }

    close(data->sockfd);
    free(data);

    pthread_exit(NULL);
}

int main(int argc,char **argv)
{
    int sockfd,newfd;
    SA_IN addr,serv;
    DATA *data;

    sockfd=socket(AF_INET,SOCK_STREAM,0);

    if(sockfd == -1)
        err_quit("socket");

    bzero(&serv,sizeof(SA_IN));
    serv.sin_family=AF_INET;
    serv.sin_port=PORT;
    serv.sin_addr.s_addr=INADDR_ANY;

    if(bind(sockfd,(SA *)&serv,sizeof(SA)) == -1)
        err_quit("bind");
    if(listen(sockfd,20) == -1)
        err_quit("listen");

    while(1)
    {
        socklen_t addrlen;
        pthread_t id;

        bzero(&addr,sizeof(SA_IN));
        newfd=accept(sockfd,(SA *)&addr,&addrlen);
        if(newfd == -1)
        {
            perror("accept");
            continue;
        }

        data=malloc(sizeof(DATA));
        if(data == NULL)
        {
            close(newfd);
            continue;
        }

        data->sockfd=newfd;
        memcpy(&data->addr,&addr,sizeof(SA_IN));

        pthread_create(&id,NULL,(void *)echo,data); //创建一个工作线程
    }

    return 0;
}


由此可见,在socket中使用线程和其它应用中使用线程是没有任何区别的

热心网友 时间:2023-12-05 16:31

看你的意思,你是想些服务器。你是想用一个线程收数据,另一个线程发送数据么?这样其实没啥意义。如果你是简单的想把数据返回回去,只需要在recv后在send回去就行了,这两个函数默认都是阻塞的。如果是两个线程反而会出现多线程问题。如果你实在要这么弄,你只需要在你的两个线程中弄两个死循环,然后一个死循环里掉recv,另一个掉send就行了。你这其实是一种很低效的并发服务器方案(并发服务器用来解决顺序服务器不能及时响应的问题,也就是你说的主界面等卡死的问题)。你可以去网上百度一下 “网络服务器模型”,上面又很多改良方案。自己去学习吧,代码应该都有。

热心网友 时间:2023-12-05 16:32

只要创建一个线程就可以发送和接收了,就调用下recv和read追问一个线程 界面不会卡吗?主要代码我不会下,提供下代码啊

追答单独开一个线程接收消息不会卡的,代码百度下很多的

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 使用puppeteer实现将htmll转成pdf 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档 【译】将HTML转为PDF的几种实现方案 变形金刚08动画怎么样 变形金刚08动画的问题 变形金刚08动画日语版剧情介绍 请教一个多线程编程中socket自动关闭的问题。 socket多线程编程处理工单,输出日志会有交叉现象,于是想实现给处理每... C# winForm Socket 多线程 编程 关闭问题 new3dsll跟3dsll区别大吗,在哪,new系列的主机破解了吗 NEW3DSLL和3DSLL有什么区别?听说3DSLL破解了 为什么3Dmax弯曲两头一起弯,怎么才能只弯一头 中国第一个夺得奥运田径金牌的是谁??? 电脑充电器发热怎么回事,在充电时特别热,怎么回事啊 二年级学生阅读的书籍推荐 二年级必读课外书 小学二年级必看10本课外书推荐 二年级必读的课外书籍推荐 go wrong的用法和例句。 用go wrong 和be angry with 和strange 各造2个句子 不要太难的 我现 ... 用go wrong造句(不要太长,15个单词左右或更少, ...of,on the air,owe...to...,go wrong造句子谢谢了,大神帮忙啊_百度... 不假思索造句? 红米2手机设置屏幕亮时间管理 无论炖鲜鸡冻鸡,切记不要焯水,大厨教你一招,肉鲜嫩味道更好 不假思索造句50字 2012临沂市三支一扶什么时候报名 ...报考2015年临沂市的三支一扶,现场报名确认的时候要用就业推荐表吗... 2010临沂市三支一扶招幕实施方案出来了没?怎么报名确认啊? 山东临沂市2010年三支一扶报名条件 用C#画图,怎么移动所画的图形,请教高手指点!! iQOOz5内屏进价多少钱? 简短的爱情祝福语 Can you run fast英语教案及教学反思 准备去健身房健身,有什么好的装备推荐? 群星维持现状不占地 群星改革政府选哪些 群星1.2版本政体怎么选择 1.2版本政体选择心得 《群星》道德政体属性及强力搭配推荐 什么政体好 群星道德政体搭配推荐 道德和政体怎么搭配好 碧欧泉水动力洁面乳味道咋样啊? 去健身房需要准备些什么吗? 英语读书的名言警句 读书的英文励志名言 做微商早安心语正能量带图片 碧欧泉水动力适合男15到18岁的皮肤使用吗?