c++ socket 创建线程

我在mfc编写个socket工具能接收客户端发来的信息,能将信息发送出去。现在面前创建绑定监听等程序已经写好,现在想创建两个线程,做发送和接收用。请大家帮忙告诉我怎么建,... 我在mfc 编写个socket工具 能接收客户端发来的信息,能将信息发送出去。现在面前创建 绑定监听等程序已经写好,现在想创建两个线程,做发送和接收用。请大家帮忙告诉我怎么建,要有代码 ,谢谢!! 展开
 我来答
阿尔迈凡
2016-01-05 · TA获得超过8460个赞
知道大有可为答主
回答量:5744
采纳率:14%
帮助的人:2007万
展开全部

线程的使用在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中使用线程和其它应用中使用线程是没有任何区别的

1062665477
2014-07-31 · TA获得超过553个赞
知道小有建树答主
回答量:166
采纳率:0%
帮助的人:230万
展开全部
看你的意思,你是想些服务器。你是想用一个线程收数据,另一个线程发送数据么?这样其实没啥意义。如果你是简单的想把数据返回回去,只需要在recv后在send回去就行了,这两个函数默认都是阻塞的。如果是两个线程反而会出现多线程问题。如果你实在要这么弄,你只需要在你的两个线程中弄两个死循环,然后一个死循环里掉recv,另一个掉send就行了。你这其实是一种很低效的并发服务器方案(并发服务器用来解决顺序服务器不能及时响应的问题,也就是你说的主界面等卡死的问题)。你可以去网上百度一下 “网络服务器模型”,上面又很多改良方案。自己去学习吧,代码应该都有。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友2d35d16
2014-07-31 · 超过10用户采纳过TA的回答
知道答主
回答量:59
采纳率:0%
帮助的人:29.6万
展开全部
只要创建一个线程就可以发送和接收了,就调用下recv和read
追问
一个线程 界面不会卡吗?主要代码我不会下,提供下代码啊
追答
单独开一个线程接收消息不会卡的,代码百度下很多的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式