Changeset 15355 for lang/cplusplus
- Timestamp:
- 07/07/08 13:56:27 (5 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
lang/cplusplus/friends_framework/trunk/test/proxy.cpp
r9774 r15355 6 6 7 7 struct ProxyConn { 8 CoopRunnable<CoopSocketReader, ProxyConn> clientRead; 9 CoopRunnable<CoopSocketWriter, ProxyConn> clientWrite; 10 CoopRunnable<CoopSocketReader, ProxyConn> serverRead; 11 CoopRunnable<CoopSocketWriter, ProxyConn> serverWrite; 12 CoopRunnable<CoopSleeper, ProxyConn> timeout; 8 CoopRunnableSocket<ProxyConn> clientSock; 9 CoopRunnableSocket<ProxyConn> serverSock; 10 CoopRunnableSleeper<ProxyConn> timeout; 13 11 CoopBuffer dataToServer; 14 12 CoopBuffer dataToClient; 15 ProxyConn(int clientSock, sockaddr *, socklen_t); 16 ~ProxyConn() { 17 close(clientRead.sock); 18 close(serverRead.sock); 13 ProxyConn(int clientFd, sockaddr *, socklen_t) 14 : clientSock(this, &ProxyConn::OnClientRead, &ProxyConn::OnClientWrite), 15 serverSock(this, &ProxyConn::OnServerRead, &ProxyConn::OnServerConnect), 16 timeout(this, &ProxyConn::OnTimeout) { 17 clientSock.SetSock(clientFd); 19 18 } 20 19 ProxyConn *Init(); … … 25 24 delete this; 26 25 } 27 void OnServerConnect(CoopSocket Writer*) {26 void OnServerConnect(CoopSocket *) { 28 27 ResetTimeout(); 29 client Read.isActive = true;30 server Read.isActive = true;31 server Write.func= &ProxyConn::OnServerWrite;28 clientSock.SetState(CoopSocket::WaitForRead); 29 serverSock.SetState(CoopSocket::WaitForRead); 30 serverSock.writef = &ProxyConn::OnServerWrite; 32 31 } 33 void OnClientRead(CoopSocket Reader*) {32 void OnClientRead(CoopSocket *) { 34 33 ResetTimeout(); 35 if (! CoopTransfer::OnRead(&client Read, &serverWrite, dataToServer))34 if (! CoopTransfer::OnRead(&clientSock, &serverSock, dataToServer)) 36 35 delete this; 37 36 } 38 void OnServerWrite(CoopSocket Writer*) {37 void OnServerWrite(CoopSocket *) { 39 38 ResetTimeout(); 40 if (! CoopTransfer::OnWrite(&client Read, &serverWrite, dataToServer))39 if (! CoopTransfer::OnWrite(&clientSock, &serverSock, dataToServer)) 41 40 delete this; 42 41 } 43 void OnServerRead(CoopSocket Reader*) {42 void OnServerRead(CoopSocket *) { 44 43 ResetTimeout(); 45 if (! CoopTransfer::OnRead(&server Read, &clientWrite, dataToClient))44 if (! CoopTransfer::OnRead(&serverSock, &clientSock, dataToClient)) 46 45 delete this; 47 46 } 48 void OnClientWrite(CoopSocket Writer*) {47 void OnClientWrite(CoopSocket *) { 49 48 ResetTimeout(); 50 if (! CoopTransfer::OnWrite(&server Read, &clientWrite, dataToClient))49 if (! CoopTransfer::OnWrite(&serverSock, &clientSock, dataToClient)) 51 50 delete this; 52 51 } 53 52 }; 54 53 55 ProxyConn::ProxyConn(int clientSock, sockaddr *, socklen_t)56 : clientRead(this, &ProxyConn::OnClientRead),57 clientWrite(this, &ProxyConn::OnClientWrite),58 serverRead(this, &ProxyConn::OnServerRead),59 serverWrite(this, &ProxyConn::OnServerConnect),60 timeout(this, &ProxyConn::OnTimeout)61 {62 clientRead.sock = clientWrite.sock = clientSock;63 serverRead.sock = serverWrite.sock = ::socket(AF_INET, SOCK_STREAM, 0);64 assert(serverRead.sock != -1);65 }66 67 54 ProxyConn *ProxyConn::Init() 68 55 { 69 ::fcntl(serverRead.sock, O_NONBLOCK); 70 if (::connect(serverRead.sock, reinterpret_cast<sockaddr*>(&server_addr), 71 sizeof(server_addr)) == -1) { 56 serverSock.SetSock(::socket(AF_INET, SOCK_STREAM, 0)); 57 assert(serverSock.GetSock() != -1); 58 ::fcntl(serverSock.GetSock(), O_NONBLOCK); 59 if (::connect(serverSock.GetSock(), reinterpret_cast<sockaddr*>(&server_addr), 60 sizeof(server_addr)) == -1) { 72 61 switch (errno) { 73 62 case EWOULDBLOCK: 74 server Write.isActive = true;63 serverSock.SetState(serverSock.GetState() | CoopSocket::WaitForWrite); 75 64 break; 76 65 default: … … 80 69 } 81 70 } else { 82 OnServerConnect(&server Write);71 OnServerConnect(&serverSock); 83 72 } 84 73 ResetTimeout();
![(please configure the [header_logo] section in trac.ini)](/share/chrome/site/your_project_logo.png)