internal bool Write(CTcpData data) { if (m_sock == null) { m_error = "socket closed"; return(false); } int bytestowrite = data.GetSize(); int byteswritten = 0; //loop until we've written all bytes while (byteswritten < bytestowrite) { //wait until socket becomes writeable bool returnv = WaitForSocket(true, "Write"); if (!returnv) { return(returnv); } int size = m_sock.Send(data.GetData(), byteswritten, data.GetSize() - byteswritten, SocketFlags.None, out SocketError sockError); if (size == -1) { m_error = "send() " + m_address + ":" + m_port + " " + sockError; return(false); } byteswritten += size; } return(true); }
internal bool Read(CTcpData data) { byte[] buff = new byte[1000]; if (m_sock == null) { m_error = "socket closed"; return(false); } bool returnv = WaitForSocket(false, "Read");//wait until the socket has something to read if (!returnv) { return(returnv); } //clear the tcpdata data.Clear(); //loop until the socket has nothing more in its buffer while (true) { try { int size = m_sock.Receive(buff, 0, buff.Length, SocketFlags.None, out SocketError errorCode); // recv(m_sock, buff, sizeof(buff), 0); if (errorCode == SocketError.TryAgain && size == -1) //we're done here, no more data, the call to WaitForSocket made sure there was at least some data to read { return(true); } else if (size == -1) //socket had an error { //m_error = "recv() " + m_address + ":" + m_port + " " + GetErrno(); return(false); } else if (size == 0 && data.GetSize() == 0) //socket closed and no data received { m_error = m_address + ":" + m_port + " Connection closed"; return(false); } else if (size == 0) //socket closed but data received { return(true); } data.SetData(buff, size, true); //append the data } catch (SocketException sockEx) { m_error = "receive() " + m_address + ":" + m_port + " " + sockEx.NativeErrorCode + " " + sockEx.SocketErrorCode; //TODO: format this better return(false); } } }
public void Process() { //open listening socket if it's not already if (!m_socket.IsOpen) { string liseningAddress = String.IsNullOrEmpty(m_address) ? "*" : m_address; Util.Log($"opening listening socket on {liseningAddress}:{m_port}"); if (!m_socket.Open(m_address, m_port, 1000000)) { Util.LogError($"{m_socket.GetError()}"); m_socket.Close(); } } //see if there's a socket we can read from IList <Socket> sockets = GetReadableFd(); foreach (Socket sock in sockets) { if (sock == m_socket.GetSock()) //we can read from the listening socket { CClient client = new CClient(); bool returnv = m_socket.Accept(client.m_socket); if (returnv) { Util.Log($"{client.m_socket.Address}:{client.m_socket.Port} connected"); AddClient(client); } else { client.Dispose(); client = null; Util.Log(m_socket.GetError()); } } else { //get the client the sock fd belongs to CClient client = GetClientFromSock(sock); if (client == null) //guess it belongs to nobody { continue; } //try to read data from the client CTcpData data = new CTcpData(); bool returnv = client.m_socket.Read(data); if (!returnv) { //socket broke probably Util.Log(client.m_socket.GetError()); RemoveClient(client); continue; } //add data to the messagequeue client.m_messagequeue.AddData(data.GetData(), data.GetSize()); //check messages from the messaqueue and parse them, if it fails remove the client if (!HandleMessages(client)) { RemoveClient(client); } } } }