Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中用套接字实现线程_C_Multithreading_Sockets - Fatal编程技术网

在C中用套接字实现线程

在C中用套接字实现线程,c,multithreading,sockets,C,Multithreading,Sockets,因此,我尝试用线程实现一个基本的客户机-服务器计算器。我能够用套接字实现客户端服务器之间的通信,但当我试图向代码中添加线程时,我就不知所措了。 这是我第一次使用此论坛,如果我提出了一个愚蠢的问题,请道歉,但我已经搜索了一些答案,但我找不到任何有帮助的:( 我现在可以上传我的全部代码,我想这就足够了: 在main中创建线程: while(cliente_socket_fd = accept(socket_fd,(struct sockaddr*)&name_cliente,(sock

因此,我尝试用线程实现一个基本的客户机-服务器计算器。我能够用套接字实现客户端服务器之间的通信,但当我试图向代码中添加线程时,我就不知所措了。 这是我第一次使用此论坛,如果我提出了一个愚蠢的问题,请道歉,但我已经搜索了一些答案,但我找不到任何有帮助的:( 我现在可以上传我的全部代码,我想这就足够了:

在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++;
      }    
     }
服务器读取套接字功能:

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);
}

再次抱歉,如果我是一个noob或要求太多,但非常感谢任何帮助。谢谢。

函数:connectionSocket()

这条线

x = strlen(buffer) + 1;
是垃圾,因为
strlen()
在找到NUL字节时停止

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


当发生错误时,
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)
new_sock = malloc(1);  
}while(1 || strcmp(buffer,"end") != 0);
read(sock,buffer, x);
未分配足够的字节,应为:

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;

这一行:

if(pthread_create(&thread, NULL, connectionSocket, (void*)new_sock) < 0)
new_sock = malloc(1);  
}while(1 || strcmp(buffer,"end") != 0);
read(sock,buffer, x);
将永远不会退出循环。建议:

pthread_t thread[ nThreads ] = {0};

if(pthread_create(&thread[i], NULL, connectionSocket, (void*)new_sock) < 0)
}while( strcmp(buffer,"end") != 0 );

这一行:

if(pthread_create(&thread, NULL, connectionSocket, (void*)new_sock) < 0)
new_sock = malloc(1);  
}while(1 || strcmp(buffer,"end") != 0);
read(sock,buffer, x);
将尝试读取一些随机数目的字节,因为“x”中的值无效。建议

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


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

在函数中:connectionSocket()

这条线

x = strlen(buffer) + 1;
是垃圾,因为
strlen()
在找到NUL字节时停止

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


当发生错误时,
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)
new_sock = malloc(1);  
}while(1 || strcmp(buffer,"end") != 0);
read(sock,buffer, x);
未分配足够的字节,应为:

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;

这一行:

if(pthread_create(&thread, NULL, connectionSocket, (void*)new_sock) < 0)
new_sock = malloc(1);  
}while(1 || strcmp(buffer,"end") != 0);
read(sock,buffer, x);
将永远不会退出循环。建议:

pthread_t thread[ nThreads ] = {0};

if(pthread_create(&thread[i], NULL, connectionSocket, (void*)new_sock) < 0)
}while( strcmp(buffer,"end") != 0 );

这一行:

if(pthread_create(&thread, NULL, connectionSocket, (void*)new_sock) < 0)
new_sock = malloc(1);  
}while(1 || strcmp(buffer,"end") != 0);
read(sock,buffer, x);
将尝试读取一些随机数目的字节,因为“x”中的值无效。建议

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


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

这里的实际问题是什么?一件事:“while(cliente_socket_fd=accept());”为什么该表达式是真的?哦..和“new_sock=malloc(1)“;”-不够大。“readSocket()”不读取套接字。您需要使用调试器检查所有代码。您有太多严重的错误和太多丢失/误导性的代码/数据,我们无法提供太多帮助。这里的实际问题是什么?一件事:“while(cliente_socket_fd=accept())“为什么这个表达式是真的?哦..还有‘new_sock=malloc(1);’-不够大。”readSocket()'不读取套接字。您需要使用调试器检查所有代码。您有太多严重的错误和太多丢失/误导性的代码/数据,我们无法提供太多帮助。谢谢,我将尝试研究您的建议,看看是否解决了问题或找到了更具体的问题。谢谢,我将尝试研究您的建议和建议看看我是解决了问题还是找到了更具体的问题。