HERRCODE ChatClient::logout() { SockStream stream; stream.writeInt(net::kCommandType_Logout); stream.writeInt(0); stream.writeString(email_); stream.flushSize(); auto ret = ::send(sock_, stream.getBuf(), stream.getSize(), 0); if (ret == SOCKET_ERROR) { return H_NETWORK_ERROR; } quit(true); return H_OK; }
HERRCODE ChatClient::loginImpl(int type, const std::wstring& username, const std::wstring& credential) { sockaddr_in addr = { 0 }; addr.sin_port = htons(serverPort_); addr.sin_family = AF_INET; IN_ADDR in_addr; InetPton(AF_INET, serverAddr_.c_str(), &in_addr); addr.sin_addr = in_addr; if (::connect(sock_, (const sockaddr*)&addr, sizeof(sockaddr_in)) != 0) { return H_NETWORK_ERROR; } SockStream stream; stream.writeInt(net::kCommandType_Login); stream.writeInt(0); stream.writeInt(type); stream.writeString(username); stream.writeString(credential); stream.flushSize(); auto ret = ::send(sock_, stream.getBuf(), stream.getSize(), 0); if (ret == SOCKET_ERROR) { return H_NETWORK_ERROR; } buffer buf(200); int rc = ::recv(sock_, buf.data(), buf.size(), 0); if (rc) { SockStream ss(buf.data(), rc); assert(net::kCommandType_LoginAck == ss.getInt()); auto size = ss.getInt(); auto ack = ss.getInt(); if (ack == net::kLoginAck_Succeeded) { email_ = username; authKey_ = ss.getString(); auto hr = initSocks(sock_); if (hr != H_OK) return hr; return H_OK; } else { return H_AUTH_FAILED; } } else { return H_NETWORK_ERROR; } }