在C

时间:2017-07-09 19:27:08

标签: c multithreading sockets

所以我试图用线程实现一个基本的客户端 - 服务器计算器。我能够实现cliente-server与套接字之间的通信,但是当我尝试向代码添加线程时,我感到很茫然。 这是我第一次使用这个论坛所以请抱歉,如果我正在提出一个愚蠢的问题,但我已经搜索了一些答案,我找不到任何有用的东西:( 我现在可以上传我的整个代码,我认为这就足够了:

在main中创建一个主题:

  while(cliente_socket_fd  = accept(socket_fd,(struct sockaddr*)&name_cliente,(socklen_t*)&cliente_name_len))
  {
      pthread_t thread;
      new_sock = malloc(1);
      *new_sock = cliente_socket_fd;
      if(i <= nThreads) // nThreads is the maximum of threads permitted
      {
          if(pthread_create(&thread, NULL, connectionSocket, (void*)new_sock) < 0)
          {
              perror("Error");
              return 1;
          }    
          i++;
      }    
     }

从创建线程中获取信息的函数:

 void *connectionSocket(void *sockR)
    {
        int sock = *(int*)sockR;
        int x;
        char buffer[1024];
        do{
           x = strlen(buffer) + 1;
           read(sock,buffer, x);

           readSocket(sock, buffer);
           }while(1 || strcmp(buffer,"end") != 0);

        close(sock);
        return 0;
    }

服务器读取套接字功能:

int readSocket(int sock, const char* buffer)
{
   //char buffer[1024];
   //char message[1024] ;
   int ssize;

   ssize = strlen(buffer);
   if(ssize == 0)
      return 0;
   char* message = (char*) malloc(ssize);


   //memset(buffer, 0, sizeof buffer);
   memset(message, 0, sizeof message);

   strcat(message, buffer);
...
   writeSocket(sock, message);
...

在套接字中写入的函数:

void writeSocket(int sock, const char* mensagem)
{
   int ssize = strlen(message) + 1;

   write(sock, &ssize, sizeof(ssize));
   write(sock, message, ssize);
}

再次对不起,如果我是一个菜鸟或要求太多,但非常感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:0)

函数中的

:connectionSocket()

这一行

x = strlen(buffer) + 1;

是垃圾,因为strlen()在找到NUL字节时会停止。

但是,buffer尚未设置为已知条件,因此缓冲区中可能存在也可能不存在NUL字节。 I.E.未定义的行为。

发生错误时accept()函数返回-1,但是发布的代码会盲目地继续进入循环体

建议写下类似于:

的行
while( 1 )
{
    cliente_socket_fd  = accept(socket_fd,(struct sockaddr*)&name_cliente, (socklen_t*)&cliente_name_len) );
    if( -1 == cliente_socket_fd )
    {
        perror( "accept failed" );
        break;  // exit loop
    }

    // implied else, accept successful

然后,为了能够访问这些线程,稍后,这一行:

if(pthread_create(&thread, NULL, connectionSocket, (void*)new_sock) < 0)

应该设置一个'唯一''线程'而不是唯一的'线程'建议:

pthread_t thread[ nThreads ] = {0};

if(pthread_create(&thread[i], NULL, connectionSocket, (void*)new_sock) < 0)

然后,套接字(实际上)是一个整数,取决于底层硬件架构是4或8字节所以这一行:

new_sock = malloc(1);  

没有分配足够的字节,应该是:

new_sock = malloc( sizeof( int ) );
if( !new_sock )
{ // then, malloc failed
    perror( "malloc failed" );
    break;  // exit loop
}

// implied else, malloc successful

*new_sock = cliente_socket_fd;

这一行:

}while(1 || strcmp(buffer,"end") != 0);

永远不会退出循环。建议:

}while( strcmp(buffer,"end") != 0 );

这一行:

read(sock,buffer, x);

将尝试读取一些随机数字节,因为“x”中的值无效。推荐;

read(sock,buffer, sizeof( buffer ));

以上是发布代码中最明显的问题。如果您发布了一个干净的编译,简短的示例,可以运行并仍然显示问题,我可以帮助您更多。