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()); } }
ListenSocket::ListenSocket() : m_sock( -1 ) { #ifdef _WIN32 InitWinSock(); #endif }
Socket::Socket() { #if defined(WIN32) InitWinSock(); #endif fd_ = -1; timeout_ = 0; err_ = 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(); }
Socket::Socket() : m_sock( -1 ) , m_buf( (char*)tracy_malloc( BufSize ) ) , m_bufPtr( nullptr ) , m_bufLeft( 0 ) { #ifdef _WIN32 InitWinSock(); #endif }
CTCPSocket::CTCPSocket() : m_socket(-1), m_bListening(false) { #ifdef WIN32 InitWinSock(); #endif }
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; }
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(); }