サーバーを構築しようとしていますが、accept() 関数にバグがあります。問題は、空の接続を受け入れ (どこからのものかわかりません)、それらから空のものを受け取ることです。
ここに私の Server.cpp クラスがあります
#include "Server.h"
#include <thread>
Server::Server()
{
usercount = 0;
int RetVal=0;
WSAData wsaData;
WORD DllVersion=MAKEWORD(2,1);
RetVal=WSAStartup(DllVersion,&wsaData);
if( RetVal != 0 )
{
MessageBoxA(NULL,"WinSocket startup failed","Error",MB_OK | MB_ICONERROR );
exit(1);
}
}
bool Server::ServerStartUp()
{
sListen = socket(AF_INET, SOCK_STREAM, NULL);
sConnect = socket(AF_INET, SOCK_STREAM, NULL);
addr.sin_addr.s_addr = inet_addr("192.168.0.100");
addr.sin_port = htons(69);
addr.sin_family = AF_INET;
bind(sListen, (SOCKADDR*)&addr,sizeof(addr));
listen(sListen,64);
// CreateThread(0,0,&Server::ServerThread,0,0,0);
std::thread t1(&Server::ServerThread,this);
t1.join();
return true;
}
void Server::ServerThread()
{
int addrlen = sizeof(addr);
for(;;Sleep(10))
{
if( sConnect = accept( sListen, (SOCKADDR*)&addr, &addrlen ))
{
cout << " FUTU ";
char* UserName = new char[256];
ZeroMemory(UserName,256);
recv(sConnect,UserName,256,0);
char* Password = new char[256];
ZeroMemory(Password,256);
recv(sConnect,Password,256,0);
users[ ++usercount ] = new Client(UserName,Password,sConnect);
if( users[usercount] ->GetLogInSuccesful() )
send(sConnect,"0x0001",6,0);
else
send(sConnect,"0x0002",6,0);
}
}
}
私はまた、ほぼ同じ構造の実際の例を持っているので、どこで何を間違っているのかわかりません...
作業例:
int ReturnValue = 0;
ReturnValue = InitWinSocket();
if(ReturnValue != 0)
{
MessageBoxA(NULL,"WinSocket startup failed","Error",MB_OK | MB_ICONERROR );
exit(1);
}
users = new User[64];
sListen = socket(AF_INET, SOCK_STREAM, NULL);
sConnect = socket(AF_INET, SOCK_STREAM, NULL);
addr.sin_addr.s_addr = inet_addr("192.168.0.100");
addr.sin_port = htons(1234);
addr.sin_family = AF_INET;
bind(sListen, (SOCKADDR*)&addr,sizeof(addr));
listen(sListen,64);
int addrlen = sizeof(addr);
for(;;)
{
if(sConnect = accept(sListen , (SOCKADDR*)&addr,&addrlen))
{
int SuccesfulLogIn = 0;
SuccesfulLogIn = CheckLogInInformation();
if(SuccesfulLogIn == 0)
{
send(sConnect,"0x0002",6,0);
}
else
{
users[++ConnectionsCounter].UserConnection = sConnect;
users[ConnectionsCounter].ID = ConnectionsCounter;
users[ConnectionsCounter].IsUserInGame = false;
cout<<"Smb Connected";
send(sConnect,"0x0001",6,0);
char* Id = new char[20];
_itoa ( users[ConnectionsCounter].ID,Id,10 );
send(sConnect,Id,sizeof(Id),0);
UserThreadHandler[ConnectionsCounter] = CreateThread(0,0,(LPTHREAD_START_ROUTINE)UserThread,(LPVOID)ConnectionsCounter,0,0);
}
}
}
2 番目の例では、適切な接続のみを受け入れ、accept() にヒットすると、接続が見つかるまで実際に待機します。
私は何が間違っているのか知りたいです。
コメントによる編集:
実際に動作しないのはバインド機能であることがわかりました。これを修正するにはどうすればよいですか?