00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "nnclientsocket.h"
00021 #include "nnlog.h"
00022 #include "platform.h"
00023 #include <iostream>
00024
00025 void
00026 NewNet::ClientSocket::disconnect()
00027 {
00028 if((socketState() != SocketConnected) || (descriptor() == -1))
00029 {
00030 NNLOG("newnet.net.warn", "Trying to disconnect an uninitialized client socket.");
00031 return;
00032 }
00033
00034 close(descriptor());
00035 setSocketState(SocketDisconnected);
00036 disconnectedEvent(this);
00037 }
00038
00039 void
00040 NewNet::ClientSocket::process()
00041 {
00042 if(socketState() == SocketConnecting)
00043 {
00044 if(readyState() & StateSend)
00045 {
00046 sockopt_t so_error;
00047 socklen_t so_len = sizeof(int);
00048 getsockopt(descriptor(), SOL_SOCKET, SO_ERROR, &so_error, &so_len);
00049 if(so_len != sizeof(int) || ! so_error)
00050 {
00051 NNLOG("newnet.net.debug", "Connected to host");
00052 setSocketState(SocketConnected);
00053 connectedEvent(this);
00054 }
00055 else
00056 {
00057 NNLOG("newnet.net.warn", "Cannot connect to host, error: %i.", so_error);
00058 setSocketError(ErrorCannotConnect);
00059 cannotConnectEvent(this);
00060 return;
00061 }
00062 }
00063 }
00064
00065 if(readyState() & StateException)
00066 {
00067 unsigned char buf;
00068 ssize_t received = ::recv(descriptor(), (char *)&buf, 1, MSG_OOB);
00069 if(received < 1)
00070 {
00071 NNLOG("newnet.net.warn", "Socket %u encountered error %i. Closing it.", descriptor(), errno);
00072 close(descriptor());
00073 setSocketError(ErrorUnknown);
00074 disconnectedEvent(this);
00075 return;
00076 }
00077 m_ReceiveBuffer.append(&buf, 1);
00078 dataReceivedEvent(this);
00079 }
00080
00081 if(readyState() & StateReceive)
00082 {
00083 unsigned char buf[1024];
00084 ssize_t received = ::recv(descriptor(), (char *)buf, 1024, 0);
00085 if(received == -1)
00086 {
00087 if(errno == EAGAIN)
00088 setReadyState(readyState() & ~StateReceive);
00089 else
00090 {
00091 NNLOG("newnet.net.warn", "Socket %u encountered error %i. Closing it.", descriptor(), errno);
00092 close(descriptor());
00093 setSocketError(ErrorUnknown);
00094 disconnectedEvent(this);
00095 return;
00096 }
00097 }
00098 else if(received == 0)
00099 {
00100 NNLOG("newnet.net.debug", "Socket %u was disconnected.", descriptor());
00101 setSocketState(SocketDisconnected);
00102 disconnectedEvent(this);
00103 return;
00104 }
00105 else
00106 {
00107 NNLOG("newnet.net.debug", "Received %i bytes on socket %u.", received, descriptor());
00108 if(downRateLimiter())
00109 downRateLimiter()->transferred(received);
00110 m_ReceiveBuffer.append(buf, received);
00111 dataReceivedEvent(this);
00112 }
00113 }
00114
00115 if((readyState() & StateSend) && dataWaiting())
00116 {
00117 size_t n = std::min((size_t)1024, m_SendBuffer.count());
00118 ssize_t sent = ::send(descriptor(), (const char *)m_SendBuffer.data(), n, 0);
00119 if(sent < 0)
00120 {
00121 if(errno == EAGAIN)
00122 setReadyState(readyState() & ~StateSend);
00123 else
00124 {
00125 NNLOG("newnet.net.warn", "Socket %u encountered error %i. Closing it.", descriptor(), errno);
00126 close(descriptor());
00127 setSocketError(ErrorUnknown);
00128 disconnectedEvent(this);
00129 return;
00130 }
00131 }
00132
00133 NNLOG("newnet.net.debug", "Sent %i bytes to socket %u.", sent, descriptor());
00134 if(upRateLimiter())
00135 upRateLimiter()->transferred(sent);
00136 m_SendBuffer.seek(sent);
00137 setDataWaiting(m_SendBuffer.count() != 0);
00138 dataSentEvent(this);
00139 }
00140 }