当前位置:  技术问答>linux和unix

Linux下Socket得多线程问题,比较特殊,高手请进!

    来源: 互联网  发布时间:2015-12-21

    本文导语:  主程序中需要使用Socket通讯,同时还要干其他工作。所以对Socket通讯开一个线程,同时其他工作开一个线程。但是Socket要同时处理多个客户端的连接要求,所以Socket也要开多个线程。简单的说,就是Socket这个线程内部...

主程序中需要使用Socket通讯,同时还要干其他工作。所以对Socket通讯开一个线程,同时其他工作开一个线程。但是Socket要同时处理多个客户端的连接要求,所以Socket也要开多个线程。简单的说,就是Socket这个线程内部,又开了多个线程,请问这种实现方式能行么?谢谢!

高手能否给个例子或者给写个大体的程序框架,谢谢,马上送分!

|
void thread(void)
{
 int i;
 printf("This is a pthread.n");
  ret=pthread_create(&id,NULL,(void *) socket_pro,NULL);
}

int main(void)
{
 pthread_t id;
 int i,ret;
 ret=pthread_create(&id,NULL,(void *) thread,NULL);
 if(ret!=0){
  printf ("Create pthread error!n");
  exit (1);
 }

 printf("This is the main process");
 pthread_join(id,NULL);
 return (0);
}

void socket_pro(void)
{
 int i;
 printf("This is socket_pro"); 

           SOCKET  socketfd;  
           socketfd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);  
           
           //bind  a  socket  
           ............................
 
           if(bind(socketfd,(SOCKADDR*)&service,sizeof(service))==SOCKET_ERROR)  
           ........................................
           //listen  on  a  socket  
           if(listen(socketfd,20)==SOCKET_ERROR)  
               printf("Error  .n");  
           else  
                printf("listening  ok.n");  
 
           //accept  a  connection  
            while(1)  
           {  
                       ..................................
                       accept............
                         
                       printf("Client  Connected.n");  
                      {
                         CreateThread
                      }
           }
}
大概是这样,另外所有线程之间要互斥的,尤其是你做其他工作和socket client 之间。
http://man.lupaworld.com/content/develop/joyfire/system/11.html#I260 可以去看看

|
楼主说:Socket要同时处理多个客户端的连接要求,所以Socket也要开多个线程.
我觉得服务端socket一直处于监听状态.在有客户端连接以后(及服务器端accept之后)
pthread_create比较好!

|
你参考一下: 这是用进程去处理链入得客户端业务得:
一个循环TCP服务源代码(因为用fork进行多进程服务了,所以这种服务现实中也有用)如下: 
[CODE] 
/*----------------------源代码开始--------------------------------------------*/ 
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#include  
/********************************************************************* 
*filename: cycletcpserver.c 
*purpose: 循环tcp服务端程序 
*tidied by: zhoulifa(zhoulifa@163.com) 周立发(http://zhoulifa.bokee.com) 
Linux爱好者 Linux知识传播者 SOHO族 开发者 最擅长C语言 
*date time:2006-07-04 22:00:00 
*Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途 
* 但请遵循GPL 
*Thanks to: Google.com 
*********************************************************************/ 
int main(int argc, char ** argv) 

    int sockfd,new_fd; /* 监听socket: sock_fd,数据传输socket: new_fd */ 
    struct sockaddr_in my_addr; /* 本机地址信息 */ 
    struct sockaddr_in their_addr; /* 客户地址信息 */ 
    unsigned int sin_size, myport, lisnum; 

    if(argv[1])  myport = atoi(argv[1]); 
    else myport = 7838; 

    if(argv[2])  lisnum = atoi(argv[2]); 
    else lisnum = 2; 

    if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) { 
        perror("socket"); 
        exit(1); 
    } 
    my_addr.sin_family=PF_INET; 
    my_addr.sin_port=htons(myport); 
    my_addr.sin_addr.s_addr = INADDR_ANY; 
    bzero(&(my_addr.sin_zero), 0); 
    if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1) { 
        perror("bind"); 
        exit(1); 
    } 

    if (listen(sockfd, lisnum) == -1) { 
        perror("listen"); 
        exit(1); 
    } 
    while(1) { 
        sin_size = sizeof(struct sockaddr_in); 
        if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) { 
            perror("accept"); 
            continue; 
        } 
        printf("server: got connection from %sn",inet_ntoa(their_addr.sin_addr)); 
        if (!fork()) { /* 子进程代码段 */ 
            if (send(new_fd, "Hello, world!n", 14, 0) == -1) { 
                perror("send"); 
                close(new_fd); 
                exit(0); 
            } 
        } 
        close(new_fd); /*父进程不再需要该socket*/ 
        waitpid(-1,NULL,WNOHANG);/*等待子进程结束,清除子进程所占用资源*/ 
    } 


|
送你个多线程处理的服务器端范例:
int main(int argc,char *argv[]) //需要一个参数 端口号
{
    int listenfd, //监听套接字sock
       connectfd; //accept 收到的 新套接字
    struct sockaddr_in servAddr, //服务器地址
                cliAddr; //客户端地址
    socklen_t adrlen; //sockaddr地址长度
    int servPort; //服务器监听端口号
    pid_t  pid; /*进程ID,多进程程序使用*/
    /*struct packagehead *packhead;*/ //数据包头,下面是多线程所要所用到的变量
    ARG  *arg;
    int rc;
    pthread_t id;


    //获得服务器监听的端口号
    if(argc!=2) 
    { 
        printf("Usage:%s portnumberan",argv[0]); 
        return 1; 
    }
    if((servPort=atoi(argv[1]))client);

delete arg;
pthread_exit(NULL);
}

    
 
 

您可能感兴趣的文章:

  • Windows和Linux下C++类成员方法作为线程函数方法介绍
  • 请问Linux核心支持多线程吗?开发库有线程库吗?线程好用吗?(稳定?)
  • Linux下GCC内置原子操作函数(多线程资源访问)介绍
  • 求个linux多线程编程的例子,要有线程池的 通用些更好
  • 请问Linux下线程开销为什么这么大?一个线程要占用近10M内存
  • Linux多线程时一些线程分不到时间片
  • 说说windows线程和linux线程的区别?
  • linux 下多线程 每个线程能否使用alarm来处理,信号是否会乱呢?
  • linux下,如何在多线程中每个线程设置一个定时器,在线等,急。。。谢谢
  • 在创建linux线程时为什么会多一个线程?
  • linux如何主动将线程放入到线程调度队列中重新排队?
  • 在linux RH73下为什么单进程只能开1021个线程线程.
  • Linux下如何让主线程挂起一个指定的时间段而子线程继续运行?谢谢
  • LINUX下有没有线程概念,和WIN下线程概念有什么不同,谢谢.
  • linux线程编程问题
  • linux线程最大数,奇怪,怎么只有300?而且线程是用完就没了,不是同时300啊!
  • 跪求:linux下pthread 双线程计算和单线程的运行时间完全相同是为什么?
  • linux线程与进程的问题
  • linux 下子线程不能执行的问题?
  • linux多线程编程的问题
  • linux多线程编程
  • 请问高手在linux中用什么命令可以做linux的启动盘???在等待高手??
  • 关于我对linux高手用yum,非高手用源码的理由
  • 真正的linux高手,请看过来,看你符合高手标准不?
  • Linux安装问题 (不是Linux的高手,很难回答的 @_@ )
  • red hat linux与windows 2000 server相连,2000 关机后linux自动启动!问高手怎么回事?
  • 请教linux高手,在Linux
  • Linux下自动执行命令的问题,哪位Linux高手帮帮我.
  • 我一直用WINDOWS,想转到Linux/Unix,各位Linux/Unix高手可以介绍点吗?
  • 求高手指点,arm-linux
  • 请linux高手指教
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • linux c/c++ IP字符串转换成可比较大小的数字
  • arm-linux-gcc 在哪下载比较好,历史版本比较齐?
  • 大家推荐一下有关LINUX7有关的网络编程的书。最好是比较全面的!比较经典的。
  • 请大家帮忙推荐几款linux下比较好用的看jpeg图和看mpeg4比较好用的软件!
  • 请各位说说,在linux下,c的什么编译器比较好用比较经典一些?推荐一下
  • 本人想学习linux,请问哪里有比较小的linux版本
  • 搞了几年软件开发,Linux没有摸过,请问安装Linux什么版本比较好
  • 大家认为国产Linux好不好,和国外有什么差距!国产Linux哪一家的比较好点?
  • CSS属性参考手册 iis7站长之家
  • 在linux下做C程序,用哪个版本的LINUX比较好?
  • 请问哪一本LINUX源代码分析的书比较经典?
  • 请问现在安装什么版本的Linux比较好?
  • 初学linux,请问《Unix环境高级编程》和《Linux程序设计》哪本书比较适合先看?
  • linux程序开发,哪些书比较好
  • 那个LINUX比较好
  • 为什么比较freebsd和linux的源代码,觉得linux的代码十分的庞大。。
  • 企业界用的比较多的REDHAT LINUX是什么版本的?
  • linux那个版本的比较好,请高手们指教
  • 想研究linux系统,看哪本书比较好呢?
  • linux内核方面看什么书比较好?
  • 请问国内有没有比较大型的Linux网站?
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • secureCRT下Linux终端汉字乱码解决方法
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • Linux c字符串中不可打印字符转换成16进制
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • linux命令大全详细分类介绍及常用linux命令文档手册下载
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3