UserSocket.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614
  1. #define WIN32_LEAN_AND_MEAN
  2. #include <windows.h>
  3. #include <WinSock2.h>
  4. #include <mutex>
  5. #include "../common/pool.h"
  6. #include "../common/IOBuffer.h"
  7. #include "../webrtcinterop/include/api.h"
  8. #include "../Protocol/win/Protocol.pb.h"
  9. #include "UserManager.h"
  10. #include "DBConnect.h"
  11. #include "scoped_ptr.h"
  12. #include "UserSocket.h"
  13. FNRedirector<CUserSocket> CUserSocket::Redirector;
  14. CUserSocket::CUserSocket(HANDLE hCom, SOCKET s) :CIOSocket(hCom, s)
  15. {
  16. _uid = -1;
  17. _loginsucc = false;
  18. _egoType = EgoType::None;
  19. _userpeer = -1;
  20. Init(hCom);
  21. TimeTick = GetTickCount64();
  22. }
  23. void CUserSocket::InitFnDirector()
  24. {
  25. Redirector.Insert(RemoNet::CS_Answer, &CUserSocket::OnAnswer);
  26. Redirector.Insert(RemoNet::CS_Candidate, &CUserSocket::OnCadidate);
  27. Redirector.Insert(RemoNet::CS_KeepAlive, &CUserSocket::OnKeepAlive);
  28. Redirector.Insert(RemoNet::CS_Add, &CUserSocket::OnAdd);
  29. Redirector.Insert(RemoNet::CS_Robot, &CUserSocket::OnRobot);
  30. Redirector.Insert(RemoNet::CS_Offer, &CUserSocket::OnOffer);
  31. Redirector.Insert(RemoNet::CS_Rep, &CUserSocket::OnRepVideo);
  32. Redirector.Insert(RemoNet::CS_Req, &CUserSocket::OnReqVideo);
  33. Redirector.Insert(RemoNet::CS_Sign, &CUserSocket::OnSigin);
  34. Redirector.Insert(RemoNet::CS_Leave, &CUserSocket::OnLeave);
  35. //Redirector.Insert(RemoNet::CS_CloseVideo, &CUserSocket::OnCloseVideo);
  36. }
  37. void CUserSocket::OnAnswer(int8_t* Data, int16_t Size)
  38. {
  39. std::cout << __FUNCTION__ << std::endl;
  40. RemoNet::Answer Req;
  41. Req.ParseFromArray(Data, Size);
  42. int32_t peer = Req.peer();
  43. std::cout << Req.sdp().c_str() << std::endl;
  44. CUserManager::GetInstance().NotifyAnswer(peer, _uid, Req.index(), Req.type().c_str(), Req.sdp().c_str());
  45. // Req.set_peer(_uid);
  46. // CIOBuffer* pBuffer = CIOBuffer::Alloc();
  47. // MessageHead Head;
  48. // Head.Command = RemoNet::SC_Answer;
  49. // Head.Length = Req.ByteSizeLong();
  50. // Head.Serialize(pBuffer->Buffer);
  51. // auto ptr = pBuffer->Buffer + MessageHead::Size();
  52. // Req.SerializeToArray(ptr, Head.Length);
  53. // pBuffer->Length = MessageHead::Size() + Head.Length;
  54. // CUserManager::GetInstance().Write(peer, pBuffer);
  55. // pBuffer->Release();
  56. }
  57. void CUserSocket::OnLeave(int8_t* Data, int16_t Size)
  58. {
  59. RemoNet::Leave Req;
  60. Req.ParseFromArray(Data, Size);
  61. auto type = Req.egotype();
  62. if (_egoType != EgoType::User||type==EgoType::User) return;
  63. int32_t peer = Req.peer();
  64. if (type == EgoType::Car)
  65. {
  66. if (peer != _userpeer) return;
  67. _userpeer = -1;
  68. }
  69. CUserManager::GetInstance().LeavePeerVideo(peer, _uid, _egoType);
  70. }
  71. //
  72. // void CUserSocket::OnCloseVideo(int8_t* Data, int16_t Size)
  73. // {
  74. // std::cout << "OnCloseVideo" << std::endl;
  75. // RemoNet::Close Req;
  76. // Req.ParseFromArray(Data, Size);
  77. // auto type = Req.egotype();
  78. // if (_egoType != EgoType::User || type == EgoType::User) return;
  79. // int32_t peer = Req.peer();
  80. // int32_t index = Req.index();
  81. // if (type == EgoType::Car)
  82. // {
  83. // if (peer != _carpeer) return;
  84. //
  85. //
  86. // }
  87. // else if (type == EgoType::Cave)
  88. // {
  89. // if (peer != _cavepeer) return;
  90. //
  91. // }
  92. // CUserManager::GetInstance().ClosePeerVideo(peer, _uid, _egoType, index);
  93. // }
  94. void CUserSocket::OnCadidate(int8_t* Data, int16_t Size)
  95. {
  96. RemoNet::Candidate Req;
  97. Req.ParseFromArray(Data, Size);
  98. int32_t peer = Req.peer();
  99. CUserManager::GetInstance().NotifyCandidate(peer, _uid, Req.index(), Req.type().c_str(), Req.candidate().c_str(), Req.sdpmlineindex(), Req.sdpmid().c_str());
  100. // Req.set_peer(_uid);
  101. // CIOBuffer* pBuffer = CIOBuffer::Alloc();
  102. // MessageHead Head;
  103. // Head.Command = RemoNet::SC_Candidate;
  104. // Head.Length = Req.ByteSizeLong();
  105. // Head.Serialize(pBuffer->Buffer);
  106. // auto ptr = pBuffer->Buffer + MessageHead::Size();
  107. // Req.SerializeToArray(ptr, Head.Length);
  108. // pBuffer->Length = MessageHead::Size() + Head.Length;
  109. // CUserManager::GetInstance().Write(peer, pBuffer);
  110. // pBuffer->Release();
  111. }
  112. // void CUserSocket::OnCancelReq(int8_t* Data, int16_t Size)
  113. // {
  114. // RemoNet::CSCancelReq Req;
  115. // Req.ParseFromArray(Data, Size);
  116. // if (_peer != Req.peer()) return;
  117. // CUserManager::GetInstance().CancelReq(_peer, _uid);
  118. // _peer = -1;
  119. //
  120. //
  121. // }
  122. void CUserSocket::OnClose()
  123. {
  124. if (_egoType == EgoType::Car)
  125. {
  126. RemoNet::SCDelRobot rot;
  127. rot.set_peer(_uid);
  128. CIOBuffer* pBuffer = CIOBuffer::Alloc();
  129. MessageHead Head;
  130. Head.Command = RemoNet::SC_NotifyDel;
  131. Head.Length = rot.ByteSizeLong();
  132. Head.Serialize(pBuffer->Buffer);
  133. auto ptr = pBuffer->Buffer + MessageHead::Size();
  134. rot.SerializeToArray(ptr, Head.Length);
  135. pBuffer->Length = MessageHead::Size() + Head.Length;
  136. CUserManager::GetInstance().BroadCast(pBuffer, _cid);
  137. pBuffer->Release();
  138. }
  139. if (_userpeer != -1)
  140. CUserManager::GetInstance().LeavePeerVideo(_userpeer, _uid, _egoType);
  141. printf("a socket closed %d", _uid);
  142. CUserManager::GetInstance().Remove(this);
  143. Alloc_Pool<CUserSocket>::GetInstance().Free(this);
  144. }
  145. void CUserSocket::OnCreate()
  146. {
  147. Read(0);
  148. }
  149. void CUserSocket::OnKeepAlive(int8_t* Data, int16_t Size)
  150. {
  151. TimeTick = GetTickCount64();
  152. }
  153. void CUserSocket::OnOffer(int8_t* Data, int16_t Size)
  154. {
  155. std::cout << __FUNCTION__ << std::endl;
  156. RemoNet::Offer Req;
  157. Req.ParseFromArray(Data, Size);
  158. int32_t peer = Req.peer();
  159. CUserManager::GetInstance().NotifyOffer(peer,_uid,Req.index(),Req.type().c_str(),Req.sdp().c_str());
  160. // Req.set_peer(_uid);
  161. // CIOBuffer* pBuffer = CIOBuffer::Alloc();
  162. // MessageHead Head;
  163. // Head.Command = RemoNet::SC_Offer;
  164. // Head.Length = Req.ByteSizeLong();
  165. // Head.Serialize(pBuffer->Buffer);
  166. // auto ptr = pBuffer->Buffer + MessageHead::Size();
  167. // Req.SerializeToArray(ptr, Head.Length);
  168. // pBuffer->Length = MessageHead::Size() + Head.Length;
  169. // CUserManager::GetInstance().Write(peer, pBuffer);
  170. // pBuffer->Release();
  171. }
  172. void CUserSocket::OnRead()
  173. {
  174. int16_t length = m_pBuffer->Length;
  175. int8_t* ptr = m_pBuffer->Buffer;
  176. while (true)
  177. {
  178. if (length < MessageHead::Size())
  179. {
  180. Read(length);
  181. return;
  182. }
  183. MessageHead Head;
  184. Head.Deserialize(ptr);// = reinterpret_cast<MessageHead *>(ptr);
  185. int16_t size = Head.Length + MessageHead::Size();
  186. if (length < size)
  187. {
  188. Read(length);
  189. return;
  190. }
  191. int8_t* Data = ptr + MessageHead::Size();
  192. Process(Head.Command, Data, Head.Length);
  193. length -= size;
  194. ptr += size;
  195. }
  196. }
  197. void CUserSocket::OnRepVideo(int8_t* Data, int16_t Size)
  198. {
  199. std::cout << __FUNCTION__ << std::endl;
  200. RemoNet::CSRep Req;
  201. Req.ParseFromArray(Data, Size);
  202. int32_t peer = Req.peer();
  203. if (Req.desc() == RemoNet::VideoDesc::OK)
  204. _userpeer = peer;
  205. CUserManager::GetInstance().ReplyPeerVideo(peer, _uid, Req.desc(), Req.index());
  206. }
  207. void CUserSocket::OnReqVideo(int8_t* Data, int16_t Size)
  208. {
  209. std::cout << __FUNCTION__ << std::endl;
  210. RemoNet::CSReq Req;
  211. Req.ParseFromArray(Data, Size);
  212. int32_t peer = Req.peer();
  213. int32_t index = Req.index();
  214. int32_t type = Req.egotype();
  215. //bool master=Req.master();
  216. if (type==EgoType::Car&&index==RenderPosition::FRONT_BACK)
  217. {
  218. if (_userpeer == _uid || peer == _userpeer) return;
  219. _userpeer = peer;
  220. }
  221. auto state = CUserManager::GetInstance().ConnectPeerVideo(peer, _uid,index);
  222. RemoNet::SCReq Rep;
  223. Rep.set_peer(peer);
  224. Rep.set_desc(state);
  225. CIOBuffer* pBuffer = CIOBuffer::Alloc();
  226. MessageHead Head;
  227. Head.Command = RemoNet::SC_Req;
  228. Head.Length = Req.ByteSizeLong();
  229. Head.Serialize(pBuffer->Buffer);
  230. auto ptr = pBuffer->Buffer + MessageHead::Size();
  231. Req.SerializeToArray(ptr, Head.Length);
  232. pBuffer->Length = MessageHead::Size() + Head.Length;
  233. Write(pBuffer);
  234. pBuffer->Release();
  235. }
  236. void CUserSocket::OnSigin(int8_t* Data, int16_t Size)
  237. {
  238. RemoNet::CSSign Req;
  239. Req.ParseFromArray(Data, Size);
  240. std::string account = Req.account();
  241. std::string password = Req.password();
  242. CQPtr<CConnectionPtr<sql::Connection>> Conn = CDBConnectPool::GetInstance().QueryConnect();
  243. scoped_ptr<sql::Statement> stmt = (*Conn.get())->createStatement();
  244. char sql[1024];
  245. sprintf_s(sql, "select id,name,cid from user where account=\'%s\' and password=MD5(\'%s\')", account.c_str(), password.c_str());
  246. scoped_ptr<sql::ResultSet> resultSet = stmt->executeQuery(sql);
  247. bool bRet = false;
  248. if (resultSet->next())
  249. {
  250. int32_t uid = resultSet->getInt(1);
  251. CUserManager::GetInstance().Check(uid);
  252. _uid = uid;
  253. _name = resultSet->getString(2).c_str();
  254. _cid = resultSet->getInt(3);
  255. _loginsucc = true;
  256. _egoType = EgoType::User;
  257. bRet = true;
  258. }
  259. RemoNet::SCSign Rep;
  260. Rep.set_ret(bRet);
  261. Rep.set_uid(_uid);
  262. Rep.set_cid(_cid);
  263. Rep.set_name(_name);
  264. CIOBuffer* pBuffer = CIOBuffer::Alloc();
  265. MessageHead Head;
  266. Head.Command = RemoNet::SC_Sign;
  267. Head.Length = Rep.ByteSizeLong();
  268. Head.Serialize(pBuffer->Buffer);
  269. auto ptr = pBuffer->Buffer + MessageHead::Size();
  270. Rep.SerializeToArray(ptr, Head.Length);
  271. pBuffer->Length = MessageHead::Size() + Head.Length;
  272. Write(pBuffer);
  273. pBuffer->Release();
  274. }
  275. void CUserSocket::OnAdd(int8_t* Data, int16_t Size)
  276. {
  277. RemoNet::CSAdd Req;
  278. Req.ParseFromArray(Data, Size);
  279. std::string serial = Req.serial();
  280. _name = Req.name();
  281. CQPtr<CConnectionPtr<sql::Connection>> Conn = CDBConnectPool::GetInstance().QueryConnect();
  282. scoped_ptr<sql::Statement> stmt = (*Conn.get())->createStatement();
  283. char sql[1024];
  284. sprintf_s(sql, "select id,cid from robot where serial=\'%s\'", serial.c_str());
  285. scoped_ptr<sql::ResultSet> resultSet = stmt->executeQuery(sql);
  286. bool bRet = false;
  287. if (resultSet->next())
  288. {
  289. _uid = resultSet->getInt(1);
  290. _cid = resultSet->getInt(2);
  291. _loginsucc = true;
  292. _egoType =static_cast<EgoType>(Req.type());
  293. bRet = true;
  294. }
  295. if (bRet)
  296. {
  297. //_egoType = static_cast<EgoType>(Req.type());
  298. // int32_t size = Req.info().size();
  299. // for (int32_t i = 0; i < size; i++)
  300. // {
  301. // auto& node = Req.info(i);
  302. // CameraInfo info;
  303. // info.index = node.pos();
  304. // info.label = node.label();
  305. //
  306. // info.solution = static_cast<DisplayResolution>(node.solution());
  307. // _cameraArray.push_back(info);
  308. // }
  309. RemoNet::SCAddRobot robot;
  310. auto r=robot.mutable_robot();
  311. r->set_name(_name);
  312. r->set_rid(_uid);
  313. r->set_type(_egoType);
  314. r->set_state(RemoNet::Robot_RobotState::Robot_RobotState_Online);
  315. // for (auto& node : _cameraArray)
  316. // {
  317. // auto info = r->add_info();
  318. // info->set_pos(node.index);
  319. // info->set_label(node.label);
  320. // info->set_solution(node.solution);
  321. // }
  322. CIOBuffer* pBuffer = CIOBuffer::Alloc();
  323. MessageHead Head;
  324. Head.Command = RemoNet::SC_NotifyAdd;
  325. Head.Length = robot.ByteSizeLong();
  326. Head.Serialize(pBuffer->Buffer);
  327. auto ptr = pBuffer->Buffer + MessageHead::Size();
  328. robot.SerializeToArray(ptr, Head.Length);
  329. pBuffer->Length = MessageHead::Size() + Head.Length;
  330. CUserManager::GetInstance().BroadCast(pBuffer, _cid);
  331. pBuffer->Release();
  332. }
  333. RemoNet::SCAdd Rep;
  334. Rep.set_ret(bRet);
  335. Rep.set_uid(_uid);
  336. Rep.set_cid(_cid);
  337. Rep.set_name(_name);
  338. CIOBuffer* pBuffer = CIOBuffer::Alloc();
  339. MessageHead Head;
  340. Head.Command = RemoNet::SC_Add;
  341. Head.Length = Rep.ByteSizeLong();
  342. Head.Serialize(pBuffer->Buffer);
  343. auto ptr = pBuffer->Buffer + MessageHead::Size();
  344. Rep.SerializeToArray(ptr, Head.Length);
  345. pBuffer->Length = MessageHead::Size() + Head.Length;
  346. Write(pBuffer);
  347. pBuffer->Release();
  348. }
  349. void CUserSocket::Process(int32_t cmd, int8_t* Data, int32_t Size)
  350. {
  351. if (!_loginsucc)
  352. {
  353. if ((cmd != RemoNet::CS_Sign && cmd != RemoNet::CS_Add)) return;
  354. }
  355. Redirector.Process(this, cmd, Data, Size);
  356. }
  357. RemoNet::VideoDesc CUserSocket::ReqVideo(int32_t peer, int32_t index)
  358. {
  359. if (_egoType == EgoType::User) return RemoNet::VideoDesc::NoFound;
  360. //if(index!=RenderPosition::FRONT_BACK)
  361. if (_userpeer!=-1&&_userpeer != peer) return RemoNet::VideoDesc::Busy;
  362. RemoNet::CSReq Rep;
  363. Rep.set_peer(peer);
  364. Rep.set_index(index);
  365. CIOBuffer* pBuffer = CIOBuffer::Alloc();
  366. MessageHead Head;
  367. Head.Command = RemoNet::SC_NotifyReq;
  368. Head.Length = Rep.ByteSizeLong();
  369. Head.Serialize(pBuffer->Buffer);
  370. auto ptr = pBuffer->Buffer + MessageHead::Size();
  371. Rep.SerializeToArray(ptr, Head.Length);
  372. pBuffer->Length = MessageHead::Size() + Head.Length;
  373. Write(pBuffer);
  374. pBuffer->Release();
  375. return RemoNet::VideoDesc::OK;
  376. }
  377. void CUserSocket::RepVideo(int32_t peer, int32_t index,RemoNet::VideoDesc desc)
  378. {
  379. if (desc != RemoNet::VideoDesc::OK)
  380. {
  381. _userpeer = -1;
  382. }
  383. RemoNet::CSRep Rep;
  384. Rep.set_desc(desc);
  385. Rep.set_peer(peer);
  386. Rep.set_index(index);
  387. CIOBuffer* pBuffer = CIOBuffer::Alloc();
  388. MessageHead Head;
  389. Head.Command = RemoNet::SC_NotifyRep;
  390. Head.Length = Rep.ByteSizeLong();
  391. Head.Serialize(pBuffer->Buffer);
  392. auto ptr = pBuffer->Buffer + MessageHead::Size();
  393. Rep.SerializeToArray(ptr, Head.Length);
  394. pBuffer->Length = MessageHead::Size() + Head.Length;
  395. Write(pBuffer);
  396. pBuffer->Release();
  397. }
  398. int32_t CUserSocket::uid()
  399. {
  400. return _uid;
  401. }
  402. int32_t CUserSocket::cid()
  403. {
  404. return _cid;
  405. }
  406. std::string CUserSocket::name()
  407. {
  408. return _name;
  409. }
  410. int32_t CUserSocket::type()
  411. {
  412. return _egoType;
  413. }
  414. void CUserSocket::CloseVideo(int32_t peer, int32_t index, EgoType type)
  415. {
  416. if (type == EgoType::User)
  417. {
  418. if (_userpeer != peer) return;
  419. }
  420. RemoNet::Close Rep;
  421. Rep.set_egotype(type);
  422. Rep.set_index(index);
  423. Rep.set_peer(peer);
  424. CIOBuffer* pBuffer = CIOBuffer::Alloc();
  425. MessageHead Head;
  426. Head.Command = RemoNet::SC_NotifyCloseVideo;
  427. Head.Length = Rep.ByteSizeLong();
  428. Head.Serialize(pBuffer->Buffer);
  429. auto ptr = pBuffer->Buffer + MessageHead::Size();
  430. Rep.SerializeToArray(ptr, Head.Length);
  431. pBuffer->Length = MessageHead::Size() + Head.Length;
  432. Write(pBuffer);
  433. pBuffer->Release();
  434. }
  435. void CUserSocket::LeaveVideo(int32_t peer,EgoType type)
  436. {
  437. if (_userpeer != peer) return;
  438. _userpeer = -1;
  439. RemoNet::Leave Rep;
  440. Rep.set_egotype(type);
  441. Rep.set_peer(peer);
  442. CIOBuffer* pBuffer = CIOBuffer::Alloc();
  443. MessageHead Head;
  444. Head.Command = RemoNet::SC_NotifyLeave;
  445. Head.Length = Rep.ByteSizeLong();
  446. Head.Serialize(pBuffer->Buffer);
  447. auto ptr = pBuffer->Buffer + MessageHead::Size();
  448. Rep.SerializeToArray(ptr, Head.Length);
  449. pBuffer->Length = MessageHead::Size() + Head.Length;
  450. Write(pBuffer);
  451. pBuffer->Release();
  452. }
  453. void CUserSocket::KickOff()
  454. {
  455. RemoNet::SCKickOff Rep;
  456. CIOBuffer* pBuffer = CIOBuffer::Alloc();
  457. MessageHead Head;
  458. Head.Command = RemoNet::SC_KickOff;
  459. Head.Length = Rep.ByteSizeLong();
  460. Head.Serialize(pBuffer->Buffer);
  461. auto ptr = pBuffer->Buffer + MessageHead::Size();
  462. Rep.SerializeToArray(ptr, Head.Length);
  463. pBuffer->Length = MessageHead::Size() + Head.Length;
  464. Write(pBuffer);
  465. pBuffer->Release();
  466. _loginsucc = false;
  467. _uid = -1;
  468. }
  469. void CUserSocket::OnRobot(int8_t* Data, int16_t Size)
  470. {
  471. RemoNet::CSRobot Req;
  472. Req.ParseFromArray(Data, Size);
  473. std::vector<Robot> ret;
  474. CUserManager::GetInstance().GetRobot(_cid, ret);
  475. RemoNet::SCRobot Rep;
  476. for (auto& node : ret)
  477. {
  478. auto robot = Rep.add_robot();
  479. robot->set_name(node.name.c_str());
  480. robot->set_rid(node.uid);
  481. robot->set_type(node.type);
  482. robot->set_state(node.state);;
  483. }
  484. CIOBuffer* pBuffer = CIOBuffer::Alloc();
  485. MessageHead Head;
  486. Head.Command = RemoNet::SC_Robot;
  487. Head.Length = Rep.ByteSizeLong();
  488. Head.Serialize(pBuffer->Buffer);
  489. auto ptr = pBuffer->Buffer + MessageHead::Size();
  490. Rep.SerializeToArray(ptr, Head.Length);
  491. pBuffer->Length = MessageHead::Size() + Head.Length;
  492. Write(pBuffer);
  493. pBuffer->Release();
  494. }
  495. bool CUserSocket::IsBusy()
  496. {
  497. return _userpeer != -1;
  498. }
  499. void CUserSocket::NotifyOffer(int32_t peer, int32_t index,const char * type,const char * sdp)
  500. {
  501. // std::cout << sdp << std::endl;
  502. RemoNet::Offer Rep;
  503. Rep.set_peer(peer);
  504. Rep.set_index(index);
  505. Rep.set_type(type);
  506. Rep.set_sdp(sdp);
  507. CIOBuffer* pBuffer = CIOBuffer::Alloc();
  508. MessageHead Head;
  509. Head.Command = RemoNet::SC_NotifyOffer;
  510. Head.Length = Rep.ByteSizeLong();
  511. Head.Serialize(pBuffer->Buffer);
  512. auto ptr = pBuffer->Buffer + MessageHead::Size();
  513. Rep.SerializeToArray(ptr, Head.Length);
  514. pBuffer->Length = MessageHead::Size() + Head.Length;
  515. Write(pBuffer);
  516. pBuffer->Release();
  517. }
  518. void CUserSocket::NotifyAnswer(int32_t peer, int32_t index, const char* type, const char* sdp)
  519. {
  520. //std::cout << sdp << std::endl;
  521. RemoNet::Answer Rep;
  522. Rep.set_peer(peer);
  523. Rep.set_index(index);
  524. Rep.set_type(type);
  525. Rep.set_sdp(sdp);
  526. CIOBuffer* pBuffer = CIOBuffer::Alloc();
  527. MessageHead Head;
  528. Head.Command = RemoNet::SC_NotifyAnswer;
  529. Head.Length = Rep.ByteSizeLong();
  530. Head.Serialize(pBuffer->Buffer);
  531. auto ptr = pBuffer->Buffer + MessageHead::Size();
  532. Rep.SerializeToArray(ptr, Head.Length);
  533. pBuffer->Length = MessageHead::Size() + Head.Length;
  534. Write(pBuffer);
  535. pBuffer->Release();
  536. }
  537. void CUserSocket::NotifyCandidate(int32_t peer, int32_t index, const char* type, const char* candidate, int32_t sdp_mline_index, const char* sdp_mid)
  538. {
  539. RemoNet::Candidate Rep;
  540. Rep.set_peer(peer);
  541. Rep.set_index(index);
  542. Rep.set_type(type);
  543. Rep.set_sdpmid(sdp_mid);
  544. Rep.set_candidate(candidate);
  545. Rep.set_sdpmlineindex(sdp_mline_index);
  546. CIOBuffer* pBuffer = CIOBuffer::Alloc();
  547. MessageHead Head;
  548. Head.Command = RemoNet::SC_NotifyCandidate;
  549. Head.Length = Rep.ByteSizeLong();
  550. Head.Serialize(pBuffer->Buffer);
  551. auto ptr = pBuffer->Buffer + MessageHead::Size();
  552. Rep.SerializeToArray(ptr, Head.Length);
  553. pBuffer->Length = MessageHead::Size() + Head.Length;
  554. Write(pBuffer);
  555. pBuffer->Release();
  556. }
  557. void CUserSocket::OnTimeout()
  558. {
  559. PostQueuedCompletionStatus(m_hComplete, -1, (DWORD_PTR)this, nullptr);
  560. }
  561. ULONGLONG CUserSocket::GetTimeTick()
  562. {
  563. return TimeTick;
  564. }