_beginthreadex并接受 [英] _beginthreadex and accept
本文介绍了_beginthreadex并接受的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
主要功能:
main function:
#include <iostream>
#include <cstdlib>
#include "server.h"
#include <windows.h>
using namespace std;
int main()
{
Object_server a;
Sleep(10000);
return 0;
}
这是server.h:
this is server.h:
#ifndef SERVER_H_INCLUDED
#define SERVER_H_INCLUDED
#include <winsock2.h>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <process.h>
#include <windows.h>
#include <stdio.h>
using namespace std;
class Object_server
{
private:
bool bool_server_flag;
WSADATA wsaData;
int socket_counter;
struct Object_socket
{
SOCKET socket_Local;
SOCKET *socket_Remote;
};
struct Object_socketaddr
{
struct sockaddr_in sockaddr_Local;
struct sockaddr_in *sockaddr_Remote;
};
struct Object_Data_transmission
{
int int_counter;
int total;
vector <int> int_target;//-1 server -2NULL
vector <string> str_Data;
};
Object_socket O_socket;
Object_socketaddr O_sockaddr;
Object_Data_transmission *O_Data_transmission;
bool server_on(int int_port=11111)
{
int int_flag;
if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
{
return false;
}
O_socket.socket_Local=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(O_socket.socket_Local==INVALID_SOCKET)
{
return false;
}
O_sockaddr.sockaddr_Local.sin_family=AF_INET;
//O_sockaddr.sockaddr_Local.sin_addr.s_addr=inet_addr(PC_DATA.get_Ip());
O_sockaddr.sockaddr_Local.sin_addr.s_addr=inet_addr("127.0.0.1");
O_sockaddr.sockaddr_Local.sin_port=htons(int_port);
//O_sockaddr.sockaddr_Local.sin_zero=NULL;
int_flag=bind(O_socket.socket_Local,(struct sockaddr *)&O_sockaddr.sockaddr_Local,sizeof(O_sockaddr.sockaddr_Local));
if(int_flag!=0)
{
return false;
}
int_flag=listen(O_socket.socket_Local,128);
if(int_flag!=0)
{
return false;
}
O_socket.socket_Remote=new SOCKET[128];
O_sockaddr.sockaddr_Remote=new sockaddr_in[128];
O_Data_transmission=new Object_Data_transmission[128];
socket_counter=0;
bool_server_flag=true;
//_beginthread(Object_server::accept_thread,0,(void *)this);
unsigned threadID;
int_flag=_beginthreadex(NULL,0,Object_server::accept_thread,(void *)this,CREATE_SUSPENDED,&threadID);
//cout<<int_flag;
//accept_thread((void *)this);
return true;
}
static unsigned __stdcall accept_thread(void *ptr)
{
static_cast<Object_server *>(ptr)->accept_f();
return 0;
}
void accept_f()
{
int sockaddr_size;
while(bool_server_flag)
{
sockaddr_size=sizeof(O_sockaddr.sockaddr_Remote[socket_counter]);
O_socket.socket_Remote[socket_counter]=accept(O_socket.socket_Local,(struct sockaddr *)&O_sockaddr.sockaddr_Remote[socket_counter],&sockaddr_size);
if(O_socket.socket_Remote[socket_counter]!=INVALID_SOCKET)
{
++socket_counter;
cout<<"connect : "<<socket_counter<<'\n';
}
else
{
cout<<"connect failed"<<'\n';
}
}
}
public:
Object_server()
{
bool_server_flag=false;
while(server_on())
{
}
}
Object_server(int int_port)
{
bool_server_flag=false;
while(server_on(int_port))
{
}
}
~Object_server()
{
delete []O_socket.socket_Remote;
delete []O_sockaddr.sockaddr_Remote;
delete []O_Data_transmission;
}
};
#endif // SERVER_H_INCLUDED
有些东西是异常的
如果我使用线程(_beginthreadex或_beginthread)
函数accept_f运行奇怪
1.all函数coutdidn在屏幕上显示
2. socket_counter还没有添加
3.客户端没有连接但它没有暂停功能接受
甚至它就像那样运行但是客户端可以连接到服务器
客户端代码>
>#define IP_ADDRESS "127.0.0.1"
using namespace std;
int PORT=11111;
WSADATA wsd;
SOCKET cClient;
int ret;
struct sockaddr_in server;
hostent *host=NULL;
int main()
{
//cin>>PORT;
if( WSAStartup(MAKEWORD(2,0),&wsd) )
{
return 0;
}
cClient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if( cClient == INVALID_SOCKET)
{
return 0;
}
server.sin_family = AF_INET;
server.sin_port = htons(PORT);
server.sin_addr.s_addr = inet_addr(IP_ADDRESS);
if(server.sin_addr.s_addr == INADDR_NONE)
{
return 0;
}
connect(cClient,(struct sockaddr *)&server,sizeof(server));
printf("start to connect!\n")
推荐答案
此调用;
This call;
int_flag=_beginthreadex(NULL, 0, Object_server::accept_thread, (void *)this, CREATE_SUSPENDED, &threadID);
在暂停状态下创建接受线程,你要么必须开始在此之后通过调用 ResumeThread
手动线程,或者将 CREATE_SUSPENDED
更改为 0
,像这样;
Creates the accept thread in suspended state, you'll either have to start the thread manually by calling ResumeThread
after that or, change the CREATE_SUSPENDED
to 0
, like this;
int_flag=_beginthreadex(NULL, 0, Object_server::accept_thread, (void *)this, 0, &threadID);
这应该至少让你开始r接受线程,你会看到来自服务器的 cout
打印。
希望这有帮助,
/ Fredrik
That should at least start your accept thread and you will see the cout
prints from the server.
Hope this helps,
/Fredrik
这篇关于_beginthreadex并接受的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文