11#include < XSYDTCPSocket.h>
22
3- std::map<uv_tcp_t *, std::vector<EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket*>> EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::m_MyClassPtrs;
3+ std::map<EasyCrossPlatform::Network::Socket::SocketWorker*,std::map< uv_tcp_t *, std::vector<EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket*> >> EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::m_MyClassPtrs;
44std::mutex EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::sharedMutex;
55void EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::m_uv_connect_cb (uv_connect_t * req, int status)
66{
77 uv_tcp_t * mytcpHandle = (uv_tcp_t *)req->handle ;
88 free (req);
9- std::vector<TCPAsyncClientSocket*> &myClasses = TCPAsyncClientSocket::m_MyClassPtrs[mytcpHandle];
9+ std::vector<TCPAsyncClientSocket*> &myClasses = TCPAsyncClientSocket::m_MyClassPtrs[(SocketWorker*) req-> data ][ mytcpHandle];
1010 for (auto iter = myClasses.begin (); iter != myClasses.end (); iter++) {
1111 if (status < 0 ) {
1212 (*iter)->onConnected (false );
@@ -21,7 +21,7 @@ void EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::m_uv_connect_cb(u
2121
2222void EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::m_uv_close_cb (uv_handle_t * handle)
2323{
24- std::vector<TCPAsyncClientSocket*> MyClasses = TCPAsyncClientSocket::m_MyClassPtrs[((uv_tcp_t *)handle)];
24+ std::vector<TCPAsyncClientSocket*> MyClasses = TCPAsyncClientSocket::m_MyClassPtrs[(SocketWorker*) handle-> data ][( (uv_tcp_t *)handle)];
2525
2626 if (!MyClasses.empty ()) {
2727 for (auto iter = MyClasses.begin (); iter != MyClasses.end (); iter++) {
@@ -40,7 +40,7 @@ void EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::m_uv_close_cb(uv_
4040void EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::m_uv_read_cb (uv_stream_t * stream, ssize_t nread, const uv_buf_t * buf)
4141{
4242 std::string data;
43- std::vector<TCPAsyncClientSocket*> &myClasses = TCPAsyncClientSocket::m_MyClassPtrs[(uv_tcp_t *)stream];
43+ std::vector<TCPAsyncClientSocket*> &myClasses = TCPAsyncClientSocket::m_MyClassPtrs[(SocketWorker*) stream-> data ][( uv_tcp_t *)stream];
4444 std::string myErrMsg;
4545
4646 if (nread < 0 && nread != UV_EOF ) {
@@ -77,7 +77,7 @@ void EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::m_uv_shutdown_cb(
7777{
7878 // 废弃, 暂时不用
7979 if (state < 0 ) {
80- std::vector<TCPAsyncClientSocket*> &myClasses = TCPAsyncClientSocket::m_MyClassPtrs[(uv_tcp_t *)req->handle ];
80+ std::vector<TCPAsyncClientSocket*> &myClasses = TCPAsyncClientSocket::m_MyClassPtrs[(SocketWorker*)req-> data ][( uv_tcp_t *)req->handle ];
8181 for (auto iter = myClasses.begin (); iter != myClasses.end (); iter++) {
8282 (*iter)->onError (state, uv_err_name (state));
8383 (*iter)->Closing = false ;
@@ -123,7 +123,7 @@ EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::TCPAsyncClientSocket(c
123123 this ->mySocketWorker = oldClient.mySocketWorker ;
124124 if (oldClient.Inited ) {
125125 this ->mySocketWorker ->m_num_Client ++;
126- this ->m_MyClassPtrs [this ->m_ClientSocketHandle .get ()].push_back (this );
126+ this ->m_MyClassPtrs [this ->mySocketWorker ][ this -> m_ClientSocketHandle .get ()].push_back (this );
127127 }
128128}
129129void EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::setWorker (SocketWorker & socketWorker)
@@ -141,9 +141,13 @@ void EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::Init()
141141
142142 this ->Inited = true ;
143143 this ->m_ClientSocketHandle = std::shared_ptr<uv_tcp_t >(new uv_tcp_t );
144+ this ->m_ClientSocketHandle .get ()->data = (void *)this ->mySocketWorker ;
144145 // this->m_MyClassPtrs[this->m_ClientSocketHandle.get()] = std::pair<std::mutex*, std::vector<TCPAsyncClientSocketv4*>>(new std::mutex(), std::vector<TCPAsyncClientSocketv4*>());
145- this ->m_MyClassPtrs [this ->m_ClientSocketHandle .get ()] = std::vector<TCPAsyncClientSocket*>();
146- this ->m_MyClassPtrs [this ->m_ClientSocketHandle .get ()].push_back (this );
146+ if (this ->m_MyClassPtrs .find (this ->mySocketWorker ) == this ->m_MyClassPtrs .end ()) {
147+ this ->m_MyClassPtrs [this ->mySocketWorker ] = std::map<uv_tcp_t *, std::vector<TCPAsyncClientSocket*>>();
148+ }
149+ this ->m_MyClassPtrs [this ->mySocketWorker ][this ->m_ClientSocketHandle .get ()] = std::vector<TCPAsyncClientSocket*>();
150+ this ->m_MyClassPtrs [this ->mySocketWorker ][this ->m_ClientSocketHandle .get ()].push_back (this );
147151
148152 if (this ->mySocketWorker ->m_num_Client == 0 ) {
149153 uv_loop_init (this ->mySocketWorker ->m_uv_loop .get ());
@@ -159,6 +163,7 @@ void EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::Connect()
159163 this ->Init ();
160164 }
161165 uv_connect_t *myReadReq = (uv_connect_t *) malloc (sizeof (uv_connect_t ));
166+ myReadReq->data = (void *)this ->mySocketWorker ;
162167 sockaddr myAddress = this ->m_remoteAddr .getIPAddress ();
163168 uv_tcp_connect (myReadReq, this ->m_ClientSocketHandle .get (), &myAddress, EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::m_uv_connect_cb);
164169}
@@ -197,6 +202,7 @@ void EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::SendMsg(const std
197202 }
198203 uv_write_t * myWriteRequest = (uv_write_t *) malloc (sizeof (uv_write_t ));
199204 uv_buf_t myWriteBuf;
205+ myWriteRequest->data = (void *)this ->mySocketWorker ;
200206
201207 char * myBufSpace = new char [Msg.length () + 1 ];
202208 for (unsigned int i = 0 ; i < Msg.length (); i++) {
@@ -229,7 +235,7 @@ void EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::Destroy()
229235 std::this_thread::sleep_for (std::chrono::duration<int , std::milli>(200 ));
230236 }
231237 this ->Inited = false ;
232- std::vector<TCPAsyncClientSocket*> &MyVector = m_MyClassPtrs[this ->m_ClientSocketHandle .get ()];
238+ std::vector<TCPAsyncClientSocket*> &MyVector = m_MyClassPtrs[this ->mySocketWorker ][ this -> m_ClientSocketHandle .get ()];
233239
234240 if (!MyVector.empty ()) {
235241 for (auto MyIt = MyVector.begin (); MyIt != MyVector.end (); MyIt++) {
@@ -242,9 +248,12 @@ void EasyCrossPlatform::Network::Socket::TCPAsyncClientSocket::Destroy()
242248 if (MyVector.empty ()) {
243249 this ->Disconnect ();
244250 this ->sharedMutex .lock ();
245- this ->m_MyClassPtrs .erase (this ->m_ClientSocketHandle .get ());
251+ this ->m_MyClassPtrs [ this -> mySocketWorker ] .erase (this ->m_ClientSocketHandle .get ());
246252 this ->sharedMutex .unlock ();
247253 }
254+ if (this ->m_MyClassPtrs [this ->mySocketWorker ].empty ()) {
255+ this ->m_MyClassPtrs .erase (this ->mySocketWorker );
256+ }
248257 this ->m_ClientSocketHandle .reset ();
249258 this ->mySocketWorker ->m_num_Client --;
250259 if (this ->mySocketWorker ->m_num_Client == 0 ) {
0 commit comments