加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C多线程TCP服务器问题

发布时间:2020-12-16 07:01:45 所属栏目:百科 来源:网络整理
导读:我正在写一个简单的TCP服务器.我所使用的模型是服务器接受主线程中的客户端连接并将它们交给另一个线程,以便服务器可以再次侦听连接.我使用的代码的相关部分发布如下: 接受连接: void startServer () { int serverSideSocket = 0; int clientSideSocket =
我正在写一个简单的TCP服务器.我所使用的模型是服务器接受主线程中的客户端连接并将它们交给另一个线程,以便服务器可以再次侦听连接.我使用的代码的相关部分发布如下:

接受连接:

void startServer () {

    int serverSideSocket = 0;
    int clientSideSocket = 0;

    serverSideSocket = socket(AF_INET,SOCK_STREAM,0);
    if (serverSideSocket < 0) {
        error("ERROR opening socket");
        exit(1);
    }

    clientAddressLength = sizeof(clientAddress);
    memset((char *) &serverAddress,sizeof(serverAddress));
    memset((char *) &clientAddress,clientAddressLength);

    serverAddress.sin_family = AF_INET;
    serverAddress.sin_addr.s_addr = INADDR_ANY;
    serverAddress.sin_port = htons(32000);

    if (bind(serverSideSocket,(struct sockaddr *) &serverAddress,sizeof(serverAddress)) < 0) {
        error("ERROR on binding");
        exit(1);
    }      

    listen(serverSideSocket,SOMAXCONN);

    while(true) {
        clientSideSocket = accept(serverSideSocket,(struct sockaddr *) &clientAddress,&clientAddressLength);

    if (clientSideSocket < 0)
            error("ERROR on accept");

        processingThreadGroup->create_thread(boost::bind(process,clientSideSocket,this));
    }

}

这里,processingThreadGroup是一个boost :: thread_group实例.在流程方法中:

void process (int clientSideSocket,DataCollector* collector) {

int numberOfCharactersRead = 0;
string buffer;

do {
      char msgBuffer[1000];
      numberOfCharactersRead = recv(clientSideSocket,msgBuffer,(1000 - 1),0);
      if (numberOfCharactersRead < 0) {
          //display error
          close(clientSideSocket);
      }
      else if (numberOfCharactersRead == 0)
          close(clientSideSocket);
      else {
          printf("%s",msgBuffer);
          memset(msgBuffer,1000);
      }
   } while (numberOfCharactersRead > 0); 
}

但是,当我调试代码时,我看到当调用处理线程时,主线程不再接受连接.仅在process()方法内读取数据.主线程似乎不再运行了.我采取的方法有什么问题,有什么建议可以纠正吗?

编辑:我想我在这里找到了问题,并将其更新为答案.自从我回答自己的问题以来,我不会接受它.谢谢大家的帮助!

解决方法

我想我发现了这个问题.我使用它作为服务器来接受系统日志消息.我用于syslog消息生成器的代码如下:

openlog ("MyProgram",LOG_CONS | LOG_PID | LOG_NDELAY,LOG_LOCAL0);
cout << "opened the log" << endl;
for (int i = 0 ; i < 10 ; i++) 
{
    syslog (LOG_INFO,"Program started by User %d n",getuid ());
    syslog (LOG_WARNING,"Beware of the WARNING! n");
    syslog (LOG_ERR,"fatal ERROR! n");
}   
closelog ();
cout << "closed the log" << endl;

我在rsyslog.conf文件中使用一个条目来指示所有syslog LOG_LOCAL0应用程序流量被发送到服务器正在侦听的相关TCP端口.不知何故,syslog只允许一个连接,而不是多个连接.因此,它只在一个线程中使用一个连接.如果该连接已关闭,则会建立新连接.

我检查了一个普通的tcp客户端.这工作正常,为每个接受的连接生成多个线程.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读