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

SOCKET多线程编程问题,大家帮忙看看

    来源: 互联网  发布时间:2015-08-02

    本文导语:  //server.cpp #include "server.h" #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  #include  static int curThreadid; static int connnum=0; void * threadList[12000...

//server.cpp
#include "server.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
static int curThreadid;
static int connnum=0;
void * threadList[12000];
int sock[10240];
void InitSock(void)
{
    int trycount=0;
    memset(sock,0,sizeof(sock));
    memset(threadList,0,sizeof(threadList));
    int sockfd;
    struct sockaddr_in dest;
    sockfd = socket(PF_INET, SOCK_STREAM, 0);
    int opt = 1;
    int len11 = sizeof(opt);
    bzero(&dest, sizeof(dest));
    dest.sin_family = AF_INET;
    dest.sin_port = htons(1054);
    dest.sin_addr.s_addr=htonl(INADDR_ANY);
    bzero(&(dest.sin_zero),8);
    bind(sockfd, (struct sockaddr*)&dest, sizeof(dest));
    listen(sockfd, 10240);
    int clientfd;
    struct sockaddr_in client_addr;
    int addrlen = sizeof(client_addr);    
    char Buf[120];
    int ret;
    pthread_t id;
    socklen_t mylen;
    int Count=0;
    while(true){
        Count=Count+1;
        printf("wait for client...rn");
        try{
    clientfd = accept(sockfd, (struct sockaddr*)&client_addr, (socklen_t*)&addrlen);
            if(connnum>=10240)
                connnum=0;
            sock[connnum]=clientfd;
    connnum++;
            printf("client fd is %d.rn",clientfd);
        }
        catch(...){
            printf("accept error,continue.");
            close(sockfd);
            continue;
        }
        printf("client is connect,socket id:%d.rn",clientfd);
        try{
            while(1)
    {
                ret=pthread_create(&id,NULL,RunService,((void *)&clientfd));
                if(ret!=0){
                    printf("create client thread error,return value is not 0.rn");
try
{
sprintf(Buf,"error.rn");
break;
}
catch(...){;}
                    continue;
                }
else
    break;
      }
            curThreadid=id;
        }
        catch(...){
             printf("create client thread error,unknow error,continue.rn");
             continue;
        }
        printf("process client thread id is %d.rn",id);
        threadList[connnum]=&id;
        usleep(50);
printf("count : %d .rn",Count);
    }
    close(sockfd);
}
void *RunService(void *Psock_fd)
{
    int Index=connnum;
    int ThreadID=curThreadid;
    int sock_fd;
    sock_fd=sock[connnum-1];
    char Buf[120];
    int Count=0;
    char cmd=0;
    bool Isloop=true;
    printf("proc thread id is %d.rn",ThreadID);
    while(Isloop){
        usleep(50);
        cmd=0;
        Count++;
        memset(Buf,0,sizeof(Buf));
        try
        {
            read(sock_fd,&cmd,1);
}
catch(...)
{
printf("rec error.rn");
}
        switch(cmd){
            case 1:
                sprintf(Buf,"server is read %drn",Count);
                try{
                    printf("case 1,command is:=%crn",cmd);
                    write(sock_fd,Buf,120);
                }
                catch(...){
                    printf("send data is error,exit proc thread id %d.rn",ThreadID);
                    Isloop=false;
                }
                break;
            case 110:
                sprintf(Buf,"socket id is :%drn",sock_fd);
                try{
                    printf("case 110,command is:=%crn",cmd);
                    write(sock_fd,Buf,120);
                }
                catch(...){
                    printf("send data is error,exit proc thread id %d.rn",ThreadID);
                    Isloop=false;
                }
                break;
            case 254:
                sprintf(Buf,"rec quit command,quit thread :%d .rn",ThreadID);
                try{
                    printf("case 254,command is:=%crn",cmd);
                    write(sock_fd,Buf,120);
                    Isloop=false;
                }
                catch(...){
                    printf("send data is error,exit proc thread id %d.rn",ThreadID);
                    Isloop=false;
                }
                break;
        }
    }
    printf("quiting thread id:%d.rn",ThreadID);
    try
    {
        close(sock_fd);
    }
    catch(...)
    {
        printf("close socket error.rn");
    }
    printf("wait 2s.");
    usleep(2000);
    printf("thread id:%d id down.rn",ThreadID);
    threadList[Index]=NULL;
    pthread_exit(NULL);
    return NULL;
}
int main()
{
    InitSock();
    printf("main thread exit.");
    return 0;
}

|
让thread detach
调用pthread_detach()

|
创造的线程没有释放,楼上说得对,用pthread_detach可以使线程变成可脱离的,线程终止后资源自动释放,不过一般要用pthread_join来等待线程结束,以确保程序运行的准确和稳定。

    
 
 

您可能感兴趣的文章:

  • 线程间可否通过管道传递SOCKET句柄?还有其他方式传递SOCKET么?
  • 如果两个线程操作同一个Socket,一个线程recv,另一个send。这样会不会导致程序莫名其妙的退出
  • 多线程socket申请有无可能产生冲突?
  • socket 多线程编程
  • 多线程和socket结合
  • 请教:多线程使用同一个socket进行数据收发会出现什么问题?
  • socket实现多文件并发传输,求助多线程实现问题?
  • 请问关于多线程SOCKET的问题
  • 多线程socket程序莫名其妙接收到SIGALRM信号问题。
  • 多线程中socket的问题
  • socket read阻塞:一个线程关闭另一个线程错误
  • 请问关于socket客户端因事件启动新线程的问题.高手请进
  • 一个关于socket线程池问题
  • 多线程close() socket套接字的问题
  • socket+多进程+多线程
  • 请问可以在一个Servlet里使用多线程和SOCKET吗?
  • 关于linux下多线程socket通讯的问题
  • Unix domain socket可用于同一个进程中的不同线程么?
  • 多余SOCKET服务器来说,用哪种线程安全锁性能最高?
  • socket通讯时如何为线程池分配Recv任务?
  • 大家帮忙推荐一本linux socket编程的入门书,我刚接触socket,谢谢!!
  • sco unix下socket编程的问题,请大家帮忙
  • 请教一个socket编程问题 iis7站长之家
  • socket的接受。大家帮帮忙!
  • socket出错,大家帮忙检查一下
  • Socket高手帮忙看一下,来者有分
  • 我在写一个socket类的时候遇到一个问题,帮忙看看!!
  • liunx 下的socket编程问题,帮帮忙!
  • 各位高手,怎么在J2ME中进行socket传输呀?请帮忙给个提示。
  • 在Applet上使用socket遇到的一个奇怪问题?请帮忙!!
  • socket问题,请有linux开发经验者帮忙
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • andriod下java socket网络编程:java socket客户端服务端代码示例
  • re socket编程中 ACCEPT返回的socket与原socket(他参数中的)端口号一样吗?
  • IOS开发之socket网络编程(基于SimpleNetworkStreams的c/s程序)
  • socket 编程时,write的写入的数据大于socket缓冲区,会有什么结果??
  • Linux c socket编程:简单的客户端(client)和服务端(server)实现
  • Linux下使用openssl api编程socket编程,为什么要编译啊?
  • 关于文件操作和Socket网络编程!
  • linux下socket编程问题!
  • socket编程 中的bind问题
  • socket编程--htons
  • 急!!请教关于linux socket编程的一个问题!!
  • 急!关于SOCKET编程,在线等待!
  • socket编程 通过man socket, 没有找到socket函数的第一参数该填什么 怎样利用man手册
  • 多进程socket编程问题
  • 问一个socket编程问题,急~~~
  • 求教!为何在socket编程中调recv函数无法阻塞?
  • 请教一个socket编程问题
  • 求助!!linux下socket编程
  • socket编程,使用recvfrom()函数监听问题。
  • socket编程中的问题,请各位大侠指教!
  • socket 编程两问,请大家指教?
  • java命名空间java.net类socket的类成员方法: socket定义及介绍
  • libevent2需要从socket读一段数据写入一个socket中,同时发送给另一个socket
  • java命名空间java.nio.channels类socketchannel的类成员方法: socket定义及介绍
  • vc做的的socket应用和unix下socket?
  • java命名空间java.nio.channels类serversocketchannel的类成员方法: socket定义及介绍
  • QSocketDevice ( int socket, Type type )中那个 int socket 是哪里来得?
  • java命名空间java.nio.channels类datagramchannel的类成员方法: socket定义及介绍
  • [FreeBSD] 大神,求解,control socket : can‘t to any socket
  • java命名空间java.net类socket的类成员方法: getsendbuffersize定义及介绍
  • 两个 Socket 互相通信,其中一个如何判断另一个 Socket 是否已经意外断开了连接?


  • 站内导航:


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

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

    浙ICP备11055608号-3