【问题标题】:Creating a socket inside a thread C++在线程 C++ 中创建套接字
【发布时间】:2020-02-22 21:40:59
【问题描述】:

我有一个问题要解决...这是怎么回事:

我需要编写两个程序,客户端和服务器。

我的客户端程序将执行一些琐碎的任务 X,它会创建一个大小为 N 的队列。

然后客户端程序会创建N个线程,这些子线程会各自创建一个socket,并将一些关于X的信息发送给服务器。

服务器然后从客户端接收此信息,并创建子进程以进一步处理此信息,并将其发送回客户端。

我的主要问题是如何在线程内创建套接字。

#include <pthread.h>
#include <stdio.h>

#define NTHREADS 5

void *process_X(void *x_void_ptr)
{
    //random
    //do i create the socket here?
    return NULL;
}

int main()
{
static int x = 0;
pthread_t tid[NTHREADS];

for(int i=0;i<NTHREADS;i++)
{
    if(pthread_create(&tid[i], NULL, inc_x, &x)) 
    {
        fprintf(stderr, "Error creating thread\n");
        return 1;

    }       
}
// Wait for the other threads to finish.
 for (int i = 0; i < NTHREADS; i++)
        pthread_join(tid[i], NULL);
 return 0;
}

此外,在我获得的有关创建套接字的信息中,我将从命令行输入主机名和端口号。所以我也需要使用 argv[],所以我不知道该怎么做,如果它不在 main 函数中。

非常感谢任何帮助...

【问题讨论】:

  • 在任何其他上下文中创建任何其他套接字的方式相同。

标签: c++ multithreading sockets


【解决方案1】:

我的主要问题是如何在线程内创建套接字。

process_X 函数中的所有内容都发生在新线程中。因此,您确实创建了注释指示的套接字。

所以我也需要使用 argv[],所以我不知道该怎么做,如果它不在 main 函数中。

pthread_create 的最后一个参数被传递到process_X,这就是x_void_ptr。您可以简单地将x_void_ptr 转换为您需要的任何类型。

我建议在 main 函数中解析 CLI 参数,并将数据安排在 struct 中,然后通过 pthread_create 传递到 process_X

【讨论】:

  • 这正是我希望得到的答复。您介意为答案的最后一部分写一些..伪代码吗?将 cli 参数解析为 main 函数?
  • argv 将包含字符串。您可能可以将主机名用作字符串(我对 BSD 套接字有点生疏)来创建套接字,但这不适用于端口。要将字符串转换为整数,可以使用 cstdlib 中的 atoi
  • 我相信我的套接字代码我将拥有以下内容:port_number = atoi(argv[2]);服务器 = gethostbyname(argv[1]);你是说我应该创建一个包含这两个的结构来通过 pthread_create?
  • 是的,pthread_create 只允许您传递一个参数,而不是多个。因此,我们需要一个结构体作为解决方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多