Esempio n. 1
0
void TcpServer::init(){
	try{
		InitWinSock();

		tcpSocket = mksock(SOCK_STREAM);

		sockaddr_in local;
		local.sin_family=AF_INET;
		local.sin_port= htons(SERVER_PORT); 
		local.sin_addr.s_addr = htonl(INADDR_ANY);
		int nResult=bind(tcpSocket,(sockaddr*)&local,sizeof(sockaddr));
		if(nResult==SOCKET_ERROR)
			throw Exception("bind error");
		listen(tcpSocket,10);

		//一下代码获得IP和计算机名  
		char name[255];  
		char* ip = NULL;  
		PHOSTENT hostInfo;  
		if (gethostname(name,sizeof(name)) == 0)  
		{  
			if (hostInfo = gethostbyname(name))  
			{  
				ip = inet_ntoa(*(in_addr*)*(hostInfo->h_addr_list));  
			}  
		}  
		printf("%s:%d--%s\n",ip,SERVER_PORT,name);
		HANDLE threadhandle = CreateThread(NULL, 0, waitForConnect, (LPVOID)this, NULL, NULL);
		CloseHandle(threadhandle);
	}
	catch(Exception &e)
	{
		printf(e.GetMessage());
	}
}
Esempio n. 2
0
ListenSocket::ListenSocket()
    : m_sock( -1 )
{
#ifdef _WIN32
    InitWinSock();
#endif
}
Esempio n. 3
0
Socket::Socket()
{
#if defined(WIN32)
    InitWinSock();
#endif
    fd_ = -1;
    timeout_ = 0;
    err_ = 0;
}
Esempio n. 4
0
void main()
{
	InitWinSock();
	primarySock = mksocket();
	sockaddr_in service;
	service.sin_family = AF_INET;
	service.sin_addr.s_addr = htonl(INADDR_ANY);
	service.sin_port = htons(SERVER_PORT);

	 if (bind( primarySock, (SOCKADDR*) &service, sizeof(service)) == SOCKET_ERROR) 
	 {
		printf("bind() failed.\n");
		closesocket(primarySock);
		return;
	  }

	 sockaddr_in sender;
	 int senderlen = sizeof(sender);
	 stMessage recvMessage;

	 cout <<"recving..."<<endl;
	 for(;;)
	 {
		 int iret = recvfrom(primarySock,(char*)&recvMessage,sizeof(stMessage),0,(SOCKADDR *)&sender,&senderlen);
		 if(iret < 0)
		 {
			 cout << "recv data error!"<<endl;
		 }else
		 {
			 int type = recvMessage.iMessageType;
			 switch(type)
			 {
			case LOGIN:
				clientLogin(&recvMessage,&sender);
				getUserList(sender);
				break;
			case LOGOUT:
				removeUser(recvMessage.message.loginoutMessage.stUserName);
				break;
			case GETUSERLIST:
				{
					stP2PMessage command;
					command.iMessageType = GETUSERLIST;
					sendto(primarySock,(const char *)&command,sizeof(stP2PMessage),0,(const SOCKADDR *)&sender,senderlen);
					getUserList(sender);
					break;
				}
			case P2PTRAN:
				P2PTran(recvMessage.message.translateMessage.stUserName,primarySock,sender);
				break;
			 }
		 }
	 }

	getchar();
}
Esempio n. 5
0
Socket::Socket()
    : m_sock( -1 )
    , m_buf( (char*)tracy_malloc( BufSize ) )
    , m_bufPtr( nullptr )
    , m_bufLeft( 0 )
{
#ifdef _WIN32
    InitWinSock();
#endif
}
Esempio n. 6
0
CTCPSocket::CTCPSocket() : m_socket(-1), m_bListening(false)
{
#ifdef WIN32
	InitWinSock();
#endif
}
Esempio n. 7
0
int main(int argc, char* argv[])
{
	try{
		InitWinSock();
		
		SOCKET PrimaryUDP;
		PrimaryUDP = mksock(SOCK_DGRAM);

		sockaddr_in local;
		local.sin_family=AF_INET;
		local.sin_port= htons(SERVER_PORT); 
		local.sin_addr.s_addr = htonl(INADDR_ANY);
		int nResult=bind(PrimaryUDP,(sockaddr*)&local,sizeof(sockaddr));
		if(nResult==SOCKET_ERROR)
			throw Exception("bind error");

		sockaddr_in sender;
		stMessage recvbuf;
		memset(&recvbuf,0,sizeof(stMessage));

		// 开始主循环.
		// 主循环负责下面几件事情:
		// 一:读取客户端登陆和登出消息,记录客户列表
		// 二:转发客户p2p请求
		for(;;)
		{
			int dwSender = sizeof(sender);
			int ret = recvfrom(PrimaryUDP, (char *)&recvbuf, sizeof(stMessage), 0, (sockaddr *)&sender, &dwSender);
			if(ret <= 0)
			{
				printf("recv error");
				continue;
			}
			else
			{
				int messageType = recvbuf.iMessageType;
				switch(messageType){
				case LOGIN:
					{
						//  将这个用户的信息记录到用户列表中
						printf("has a user login : %s\n", recvbuf.message.loginmember.userName);
						stUserListNode *currentuser = new stUserListNode();
						strcpy(currentuser->userName, recvbuf.message.loginmember.userName);
						currentuser->ip = ntohl(sender.sin_addr.S_un.S_addr);
						currentuser->port = ntohs(sender.sin_port);
						
						ClientList.push_back(currentuser);
						
						// 发送已经登陆的客户信息
						int nodecount = (int)ClientList.size();
						sendto(PrimaryUDP, (const char*)&nodecount, sizeof(int), 0, (const sockaddr*)&sender, sizeof(sender));
						for(UserList::iterator UserIterator=ClientList.begin();
								UserIterator!=ClientList.end();
								++UserIterator)
						{
							sendto(PrimaryUDP, (const char*)(*UserIterator), sizeof(stUserListNode), 0, (const sockaddr*)&sender, sizeof(sender)); 
						}

						break;
					}
				case LOGOUT:
					{
						// 将此客户信息删除
						printf("has a user logout : %s\n", recvbuf.message.logoutmember.userName);
						UserList::iterator removeiterator = NULL;
						for(UserList::iterator UserIterator=ClientList.begin();
							UserIterator!=ClientList.end();
							++UserIterator)
						{
							if( strcmp( ((*UserIterator)->userName), recvbuf.message.logoutmember.userName) == 0 )
							{
								removeiterator = UserIterator;
								break;
							}
						}
						if(removeiterator != NULL)
							ClientList.remove(*removeiterator);
						break;
					}
				case P2PTRANS:
					{
						// 某个客户希望服务端向另外一个客户发送一个打洞消息
						printf("%s wants to p2p %s\n",inet_ntoa(sender.sin_addr),recvbuf.message.translatemessage.userName);
						stUserListNode node = GetUser(recvbuf.message.translatemessage.userName);
						sockaddr_in remote;
						remote.sin_family=AF_INET;
						remote.sin_port= htons(node.port); 
						remote.sin_addr.s_addr = htonl(node.ip);

						in_addr tmp;
						tmp.S_un.S_addr = htonl(node.ip);
						printf("the address is %s,and port is %d\n",inet_ntoa(tmp), node.port);

						stP2PMessage transMessage;
						transMessage.iMessageType = P2PSOMEONEWANTTOCALLYOU;
						transMessage.iStringLen = ntohl(sender.sin_addr.S_un.S_addr);
						transMessage.Port = ntohs(sender.sin_port);
                        
						sendto(PrimaryUDP,(const char*)&transMessage, sizeof(transMessage), 0, (const sockaddr *)&remote, sizeof(remote));

						break;
					}
				
				case GETALLUSER:
					{
						int command = GETALLUSER;
						sendto(PrimaryUDP, (const char*)&command, sizeof(int), 0, (const sockaddr*)&sender, sizeof(sender));

						int nodecount = (int)ClientList.size();
						sendto(PrimaryUDP, (const char*)&nodecount, sizeof(int), 0, (const sockaddr*)&sender, sizeof(sender));

						for(UserList::iterator UserIterator=ClientList.begin();
								UserIterator!=ClientList.end();
								++UserIterator)
						{
							sendto(PrimaryUDP, (const char*)(*UserIterator), sizeof(stUserListNode), 0, (const sockaddr*)&sender, sizeof(sender)); 
						}
						break;
					}
				}
			}
		}

	}
	catch(Exception &e)
	{
		printf(e.GetMessage());
		return 1;
	}

	return 0;
}
Esempio n. 8
0
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
	{
	MSG msg;
	HACCEL hAccelTable;
	CServer* server;
	try
		{
		hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_CONSOLE_HOST);
		InitWinSock();
		server = CServer::New(hInstance);
		}
	catch (TException aException)
		{
		LPCTSTR errorTitle = TEXT("Remote Console Server Initialization Error");
		LPCTSTR errorText = NULL;
		switch (aException)
			{
			case KExceptionNoMemory:
				errorText = TEXT("Not enough memory to initialize server.");
				break;
			case KExceptionWindowConstructFailed:
				errorText = TEXT("Failed to construct server window.");
				break;
			case KExceptionWinSockStartupFailed:
				errorText = TEXT("Failed to initialize WINSOCK.");
				break;
			case KExceptionWinSockVersionInvalid:
				errorText = TEXT("Invalid WINSOCK version.");
				break;
			case KExceptionSocketConstructFailed:
				errorText = TEXT("Failed to construct server socket.");
				break;
			default:
				errorText = TEXT("Unknown error.");
				break;
			}
		MessageBox(NULL, errorText, errorTitle, MB_OK);
		WSACleanup();
		return 0;
		}

	while (GetMessage(&msg, NULL, 0, 0)) 
		{
		try
			{
			if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) 
				{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
				}
			}
		catch (TException aException)
			{
			server->HandleException(aException);
			}
		}

	delete server;
	WSACleanup();

	return msg.wParam;
	}
	void SimpleStreamEchoServer_ImplementedWithSocket(unsigned short port)
	{
		if (InitWinSock())
		{
			return;
		}

		std::cout << "Hello World!" << std::endl;
		
		PackageFactory::getInstance().registerPackage(0, []() { return new PackableClass; });

		SocketAddress bindAddress = SocketAddressFactory::Create("0.0.0.0", port);
		StreamSocket socket;
		if (!socket.Init(bindAddress->GetFamily()))
		{
			std::cout << "Error initializing socket" << std::endl;
			socket.Close();
			ShutdownWinSock();
			return;
		}

		if (!socket.Bind(bindAddress))
		{
			std::cout << "Error binding socket" << std::endl;
			socket.Close();
			ShutdownWinSock();
			return;
		}

		if (!socket.Listen())
		{
			std::cout << "Error listening on socket" << std::endl;
			socket.Close();
			ShutdownWinSock();
			return;
		}

		std::cout << "Waiting to accept a client" << std::endl;

		StreamConnection client;
		client = socket.Accept();
		if (!client.IsConnected())
		{
			std::cout << "Error accepting client" << std::endl;
			socket.Close();
			ShutdownWinSock();
			return;
		}
		//No longer need server socket
		socket.Close();

		std::cout << "Client connected: " << client.GetSocket().GetSocket() << std::endl;

		int result = 0;
		do
		{
			auto package = client.RecvAll();
			if (package->getId() >= 0)
			{
				std::cout << "Bytes received: " << result << std::endl;

				auto person = dynamic_cast<PackableClass*>(package.get());
				person->print();

				result = client.SendAll(*person);
				if (result == SOCKET_ERROR)
				{
					std::cout << "Send failed with error: " << WSAGetLastError() << std::endl;
				}
				else
				{
					std::cout << "Bytes send: " << result << std::endl;
				}
			}
			else
			{
				auto errorPackage = dynamic_cast<ErrorPackage*>(package.get());
				std::cout << "Recv failed with error: " << errorPackage->getErrorCode() << std::endl;
				std::cout << "StreamConnection closing..." << std::endl;
				client.Disconnect();
			}

		} while (result > 0);

		client.Disconnect();
		ShutdownWinSock();
	}