如果服务端要主动向客户端发送数据,则必须要保留beginaccept所分配的socket引用。
关于短开连接,如果客户端是正常close的,那么客户端会发送通知给服务端,你的服务端程序则会受到onclose事件(好象是这个),但是如果客户端不是正常关闭,服务端则不会发现连接已关闭。此时向该socket进行write将会引起一个异常,定时向连接发送检测数据才能真正监测连接是否断开开。若要这样做,则必须保存所有的连接socket的引用
关于短开连接,如果客户端是正常close的,那么客户端会发送通知给服务端,你的服务端程序则会受到onclose事件(好象是这个),但是如果客户端不是正常关闭,服务端则不会发现连接已关闭。此时向该socket进行write将会引起一个异常,定时向连接发送检测数据才能真正监测连接是否断开开。若要这样做,则必须保存所有的连接socket的引用
HickMars(山鸡) :“则必须保存所有的连接socket的引用“什么意思
在服务端,acceptCallback之后,就会有一个socket,进行beginsend和beginreceive,我在ReceiveCallback里只是
Socket handler=(Socket)ar.AsyncState;
int bytesSent=handler.EndSend(ar);
然后就没管过handler,我是否要在接收完或发送完数据后需要对socket进行处理?怎样处理?
=============================================================================
看你自己的要求了,如果只是客户端发给服务端信息,服务端给确认后没有其他的信息,你可以在客户端完成服务端确认信息的接收后断开socket连接,就是你上面的handler
handler.Shutdown(SocketShutdown.Both)
handler.Close()
客户端连接断开,服务器端也断开,不需要户端在关闭前先发送一条消息给服务端说要关闭了
比如
[C#]
public void readCallback(IAsyncResult ar) {
StateObject state = (StateObject) ar.AsyncState;
Socket handler = state.WorkSocket; // Read data from the client socket.
int read = handler.EndReceive(ar); // Data was read from the client socket.
if (read > 0) {
state.sb.Append(Encoding.ASCII.GetString(state.buffer,0,read));
handler.BeginReceive(state.buffer,0,StateObject.BufferSize, 0,
new AsyncCallback(readCallback), state);
} else {
if (state.sb.Length > 1) {
// All the data has been read from the client;
// display it on the console.
string content = state.sb.ToString();
Console.WriteLine("Read {0} bytes from socket.\n Data : {1}",
content.Length, content);
}
handler.Close();
}
}如果需要在以后服务器和客户端继续保持通信,可以保持这个handler