• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Shenzhen Kaihong Digital Industry Development Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include <iostream>
17 #include <netinet/in.h>
18 #include <sstream>
19 #include <sys/socket.h>
20 #include <thread>
21 #include <unistd.h>
22 #include <vector>
23 #include "common/sharing_log.h"
24 #include "network/interfaces/inetwork_session_callback.h"
25 #include "network/interfaces/iserver_callback.h"
26 #include "network/network_factory.h"
27 #include "safe_map.h"
28 #include "utils/utils.h"
29 
30 using namespace OHOS::Sharing;
31 using namespace std;
32 
33 class SessionAgent : public INetworkSessionCallback,
34                      public std::enable_shared_from_this<SessionAgent> {
35 public:
SessionAgent(std::weak_ptr<INetworkSession> sessionPtr,std::weak_ptr<IServer> serverPtr)36     SessionAgent(std::weak_ptr<INetworkSession> sessionPtr, std::weak_ptr<IServer> serverPtr)
37         : sessionPtr_(sessionPtr), serverPtr_(serverPtr)
38     {
39         SHARING_LOGD("trace.");
40     }
~SessionAgent()41     ~SessionAgent()
42     {
43         SHARING_LOGD("trace.");
44     }
OnSessionReadData(int32_t fd,DataBuffer::Ptr buf)45     void OnSessionReadData(int32_t fd, DataBuffer::Ptr buf) override
46     {
47         SHARING_LOGD("OnSessionReadData fd: %{public}d,thread_id: %{public}llu.", fd, GetThreadId());
48     }
49 
OnSessionWriteable(int32_t fd)50     void OnSessionWriteable(int32_t fd) override
51     {
52         SHARING_LOGD("OnSessionWriteable fd: %{public}d,thread_id: %{public}llu.", fd, GetThreadId());
53         static int index = 0;
54         DataBuffer::Ptr bufSend = std::make_shared<DataBuffer>();
55         string msg = "tcp session send message=" + std::to_string(index++);
56         bufSend->PushData(msg.c_str(), msg.size());
57         auto session = sessionPtr_.lock();
58         if (session) {
59             session->Send(bufSend, bufSend->Size());
60         }
61     }
62 
OnSessionClose(int32_t fd)63     void OnSessionClose(int32_t fd) override
64     {
65         SHARING_LOGD("OnSessionClose fd: %{public}d,thread_id: %{public}llu.", fd, GetThreadId());
66         auto server = serverPtr_.lock();
67         if (server) {
68             server->CloseClientSocket(fd);
69         }
70     }
71 
OnSessionException(int32_t fd)72     void OnSessionException(int32_t fd) override
73     {
74         SHARING_LOGD("OnSessionException fd: %{public}d,thread_id: %{public}llu.", fd, GetThreadId());
75         auto server = serverPtr_.lock();
76         if (server) {
77             server->CloseClientSocket(fd);
78         }
79     }
80 
81 private:
82     std::weak_ptr<INetworkSession> sessionPtr_;
83     std::weak_ptr<IServer> serverPtr_;
84 };
85 
86 class ServerAgent final : public IServerCallback,
87                           public std::enable_shared_from_this<ServerAgent> {
88 public:
ServerAgent(bool tcpOrUdp)89     explicit ServerAgent(bool tcpOrUdp) : tcpOrUdp_(tcpOrUdp)
90     {
91         SHARING_LOGD("trace.");
92     }
93 
~ServerAgent()94     ~ServerAgent()
95     {
96         SHARING_LOGD("trace.");
97         if (serverPtr_) {
98             serverPtr_->Stop();
99         }
100     }
101 
OnAccept(std::weak_ptr<INetworkSession> session)102     void OnAccept(std::weak_ptr<INetworkSession> session) override
103     {
104         SHARING_LOGD("trace.");
105         auto sessionStr = session.lock();
106         if (sessionStr) {
107             auto sa = std::make_shared<SessionAgent>(session, serverPtr_);
108             sessionStr->RegisterCallback(std::move(sa));
109             sessionStr->Start();
110             static int index = 0;
111             DataBuffer::Ptr buf = std::make_shared<DataBuffer>();
112             string msg = "tcp server accept send message=" + std::to_string(index++);
113             buf->PushData(msg.c_str(), msg.size());
114             int sendSize = buf->Size();
115             sessionStr->Send(std::move(buf), sendSize);
116         }
117     }
118 
Start()119     void Start()
120     {
121         if (tcpOrUdp_) {
122             bool ret = NetworkFactory::CreateTcpServer(8888, shared_from_this(), serverPtr_, "");
123             if (!ret) {
124                 SHARING_LOGE("TCP server start failed");
125             }
126         } else {
127             bool ret = NetworkFactory::CreateUdpServer(9999, "", shared_from_this(), serverPtr_);
128             if (!ret) {
129                 SHARING_LOGE("UDP server start failed");
130             }
131         }
132         SHARING_LOGD("server agent started");
133     }
OnServerReadData(int32_t fd,DataBuffer::Ptr buf,INetworkSession::Ptr session)134     void OnServerReadData(int32_t fd, DataBuffer::Ptr buf, INetworkSession::Ptr session) override
135     {
136         SHARING_LOGD("OnServerReadData fd: %{public}d,thread_id: %{public}llu.", fd, GetThreadId());
137     }
138 
OnServerWriteable(int32_t fd)139     void OnServerWriteable(int32_t fd) override
140     {
141         SHARING_LOGD("OnServerWriteable fd: %{public}d,thread_id: %{public}llu.", fd, GetThreadId());
142     }
143 
OnServerClose(int32_t fd)144     void OnServerClose(int32_t fd) override
145     {
146         SHARING_LOGD("OnServerClose fd: %{public}d,thread_id: %{public}llu.", fd, GetThreadId());
147         serverPtr_->Stop();
148     }
149 
OnServerException(int32_t fd)150     void OnServerException(int32_t fd) override
151     {
152         SHARING_LOGD("OnServerException fd: %{public}d,thread_id: %{public}llu.", fd, GetThreadId());
153         serverPtr_->Stop();
154     }
155 
156     NetworkFactory::ServerPtr serverPtr_{nullptr};
157     INetworkSession::Ptr sessionPtr_ = nullptr;
158     bool tcpOrUdp_ = true;
159     std::vector<INetworkSession::Ptr> sessionPtrVec_;
160 };
161 
162 class ServerManager {
163 public:
~ServerManager()164     ~ServerManager()
165     {
166         SHARING_LOGD("trace.");
167         serverAgents_.Clear();
168     }
169 
ServerManager()170     ServerManager()
171     {
172         SHARING_LOGD("trace.");
173         serverAgents_.Clear();
174     }
175 
CreateTcpServer()176     void CreateTcpServer()
177     {
178         SHARING_LOGD("CreateTcpServer");
179         serverAgent_ = std::make_shared<ServerAgent>(true);
180         serverAgent_->Start();
181     }
182 
CreateUdpServer()183     void CreateUdpServer()
184     {
185         SHARING_LOGD("CreateUdpServer");
186         serverAgent_ = std::make_shared<ServerAgent>(false);
187         serverAgent_->Start();
188     }
189 
StopServer()190     void StopServer()
191     {
192         if (serverAgent_) {
193             if (serverAgent_->serverPtr_) {
194                 serverAgent_->serverPtr_->Stop();
195             }
196         }
197     }
198     std::shared_ptr<ServerAgent> serverAgent_;
199     OHOS::SafeMap<uint32_t, std::shared_ptr<ServerAgent>> serverAgents_;
200     uint32_t serverIdNum = 0;
201 };
202 
main()203 int main()
204 {
205     SHARING_LOGD("trace");
206     std::thread run_server([]() {
207         ServerManager serverMgr;
208         std::stringstream ss;
209         std::string inputCmd;
210 
211         SHARING_LOGD("Please input command.tcp-1,udp-2:");
212         getline(std::cin, inputCmd);
213         SHARING_LOGD("Get command: %{public}s.", inputCmd.c_str());
214         if (inputCmd == "quit") {
215         } else if (inputCmd == "1") {
216             serverMgr.CreateTcpServer();
217 
218         } else if (inputCmd == "2") {
219             serverMgr.CreateUdpServer();
220 
221         } else if (inputCmd == "3") {
222         }
223         while (1) {
224             sleep(1);
225         }
226     });
227     run_server.join();
228     return 0;
229 }