I am developing a server application that accepts TCP connections (BeginAccept / EndAccept) and data (BeginReceive / EndReceive) asynchronously. The protocol requires the ACK to be sent whenever the EOM symbol is found before it sends the next message. Receive and receive work, but the sending application does not receive the ACK (sent synchronously).
private void _receiveTransfer(IAsyncResult result) { SocketState state = result.AsyncState as SocketState; int bytesReceived = state.Socket.EndReceive(result); if (bytesReceived == 0) { state.Socket.Close(); return; } state.Offset += bytesReceived; state.Stream.Write(state.Buffer, 0, bytesReceived); if (state.Buffer[bytesReceived - 1] == 13) { // process message Messages.IMessage message = null; try { var value = state.Stream.ToArray(); // do some work var completed = true; if (completed) { // send positive ACK var ackMessage = string.Format(ack, message.TimeStamp.ToString("yyyyMMddhhmm"), message.MessageType, message.Id, "AA", message.Id); var buffer = ASCIIEncoding.ASCII.GetBytes(ackMessage); int bytesSent = state.Socket.Send(buffer, 0, buffer.Length, SocketFlags.None); } else { // send rejected ACK var ackMessage = string.Format(ack, message.TimeStamp.ToString("yyyyMMddhhmm"), message.MessageType, message.Id, "AR", message.Id); state.Socket.Send(ASCIIEncoding.ASCII.GetBytes(ackMessage)); } } catch (Exception e) { // log exception // send error ACK if (message != null) { var ackMessage = string.Format(ack, DateTime.Now.ToString("yyyyMMddhhmm"), message.MessageType, message.Id, "AE", message.Id); state.Socket.Send(ASCIIEncoding.ASCII.GetBytes(ackMessage)); } } } state.Socket.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, new AsyncCallback(_receiveTransfer), state); }
State.Socket.Send returns the correct number of bytes, but no data is received until the socket is deleted.
Suggestions are welcome.
Steve source share