二次socket连接连不上 AcceptCallback()里面应该加上connectDone.set() 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1.客户端关闭socket之后,服务端自动监测到吗?是不是客户端发送完数据后就关闭socket,还是等到服务端接收完数据后发送一个消息告诉客户端已经接收到所有数据,然后客户端接收到这个消息后就关闭socket2.connectDone,receiveDone,sendDone的含义是什么 ,什么时候用,我不明白请赐教一二 监听程序;int nPort = Convert.ToInt32(port_textbox.Text);IPEndPoint ipLocalEndPoint;IPAddress ipAddress = Dns.GetHostByName (Dns.GetHostName ()).AddressList [0];ipLocalEndPoint = new IPEndPoint(ipAddress, nPort);ListenSoc = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp );ListenSoc.Bind(ipLocalEndPoint);ListenSoc.Listen(5);ListenSoc.BeginAccept(new AsyncCallback(AcceptCallback),ListenSoc);//回掉函数public static void AcceptCallback(IAsyncResult ar){Socket listener=(Socket)ar.AsyncState;Socket handler=listener.EndAccept(ar);listener.BeginAccept(new AsyncCallback(AcceptCallback),listener);StateObject state=new StateObject();state.workSocket=handler;handler.BeginReceive(state.buffer,0,StateObject.BufferSize,0,new AsyncCallback(ReceiveCallback),state} 小火柴:你的监听部分不用while(true){connectDone.Reset();ListenSoc.BeginAccept(new AsyncCallback(AcceptCallback),ListenSoc);connectDone.WaitOne();}吗?和直接用ListenSoc.BeginAccept(new AsyncCallback(AcceptCallback),ListenSoc);有什么不一样?而且我的两个问题你好象没回答我呀 你再看看给public static void AcceptCallback(IAsyncResult ar)里多了什么 这是前几天帮个朋友写的,你看看using System;using System.Net;using System.Net.Sockets;using System.Collections;namespace Server{ /// <summary> /// Class1 的摘要说明。 /// </summary> class SocketServer { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main(string[] args) { // // TODO: 在此处添加代码以启动应用程序 // SocketServer socketServer = new SocketServer(); socketServer.Listen(); System.Threading.Thread.CurrentThread.Suspend(); } SortedList clientList; public SocketServer() { clientList = new SortedList(); } Socket serverSocket; /// <summary> /// 启动监听 /// </summary> public void Listen() { serverSocket = new Socket(AddressFamily.InterNetwork ,SocketType.Stream,ProtocolType.Tcp); IPHostEntry lipa = Dns.Resolve(Dns.GetHostName()); IPEndPoint lep = new IPEndPoint(lipa.AddressList[0],8788); serverSocket.Bind(lep); serverSocket.Listen(100); //最大等待连接数 serverSocket.BeginAccept(new AsyncCallback(Accept_Callback),serverSocket); Console.WriteLine("Listen ..."); } void Accept_Callback(IAsyncResult e) { //接受连接 Socket clientSocket = this.serverSocket.EndAccept(e); string ip = SocketIP(clientSocket); clientList.Add(clientList.Count, clientSocket); Console.WriteLine("Accept " + ip ); //继续监听 serverSocket.BeginAccept(new AsyncCallback(Accept_Callback),null); //异步开始接收数据 StateObject stateObject = new StateObject(clientSocket); clientSocket.BeginReceive(stateObject.Buffer,0,stateObject.Buffer.Length, SocketFlags.None,new AsyncCallback(CalReceive_Callback),stateObject); } void CalReceive_Callback(System.IAsyncResult r) { StateObject stateObject = (StateObject)r.AsyncState; Socket clientSocket = stateObject.SocketObject; string ip = this.SocketIP(clientSocket); int len=clientSocket.EndReceive(r); if(len==0) { if(clientList.ContainsKey(ip)) clientList.Remove(ip); return; } string msg = System.Text.Encoding.Default.GetString(stateObject.Buffer,0,len); Console.WriteLine("Receive Message From " + ip + "\n" + msg + "\n----------------------------"); //异步开始接收数据 stateObject = new StateObject(clientSocket); clientSocket.BeginReceive(stateObject.Buffer,0,stateObject.Buffer.Length, SocketFlags.None,new AsyncCallback(CalReceive_Callback),stateObject); } /// <summary> /// 取IP地址 /// </summary> /// <param name="s"></param> /// <returns></returns> string SocketIP(Socket s) { string r; r=((IPEndPoint)s.RemoteEndPoint).Address.ToString(); return r; } } class StateObject { public byte[] Buffer; public Socket SocketObject; public StateObject(Socket s) { this.SocketObject=s; this.Buffer=new byte[200]; } }} 其实我觉得:你Accept_Callback里的 serverSocket.BeginAccept(new AsyncCallback(Accept_Callback),null);可以被connectDone.set()代替。1。有个问题:我在客户端传完文件后关闭掉客户端socket,用shutdown.receive关的,可是总是出现“不能访问名为System.net.sockets.socket的已处置对象",如果没有客户端的socket关闭就不出现,我在想是不是,客户端关掉后,服务端发现了客户端关掉了socket,可是客户端传来的数据还没接收完所以出现这种提示,其实,最后文件也传完了,我在想时不是我程序的问题。 将文件夹中的图片动态显示在页面上 什么意思 怎么把登入界面时的 用户名 ,在后来的存储中,一起存入 数据库 怎么改变MouseHover事件的响应时间? 做自动登录时,构造URL的问题 listview分页 C++代码转c# dataGridView 自定义列显示两个单选框 救急!!!! 水晶报表,曲线图的线如何加粗(在线等待......) 那位大哥有C#播放WAV声音文件的例子 求C#编写文件上传的代码
是不是客户端发送完数据后就关闭socket,还是等到服务端接收完数据后发送一个消息告诉
客户端已经接收到所有数据,然后客户端接收到这个消息后就关闭socket
2.connectDone,receiveDone,sendDone的含义是什么 ,什么时候用,我不明白
请赐教一二
int nPort = Convert.ToInt32(port_textbox.Text);
IPEndPoint ipLocalEndPoint;IPAddress ipAddress = Dns.GetHostByName (Dns.GetHostName ()).AddressList [0];
ipLocalEndPoint = new IPEndPoint(ipAddress, nPort);
ListenSoc = new Socket(AddressFamily.InterNetwork, SocketType.Stream,ProtocolType.Tcp );
ListenSoc.Bind(ipLocalEndPoint);
ListenSoc.Listen(5);
ListenSoc.BeginAccept(new AsyncCallback(AcceptCallback),ListenSoc);
//回掉函数
public static void AcceptCallback(IAsyncResult ar)
{
Socket listener=(Socket)ar.AsyncState;
Socket handler=listener.EndAccept(ar);listener.BeginAccept(new AsyncCallback(AcceptCallback),listener);StateObject state=new StateObject();
state.workSocket=handler;
handler.BeginReceive(state.buffer,0,StateObject.BufferSize,0,new AsyncCallback(ReceiveCallback),state
}
while(true)
{
connectDone.Reset();
ListenSoc.BeginAccept(new AsyncCallback(AcceptCallback),ListenSoc);
connectDone.WaitOne();
}吗?
和直接用ListenSoc.BeginAccept(new AsyncCallback(AcceptCallback),ListenSoc);有什么不一样?
而且我的两个问题你好象没回答我呀
using System;
using System.Net;
using System.Net.Sockets;
using System.Collections;namespace Server
{
/// <summary>
/// Class1 的摘要说明。
/// </summary>
class SocketServer
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
//
// TODO: 在此处添加代码以启动应用程序
//
SocketServer socketServer = new SocketServer();
socketServer.Listen(); System.Threading.Thread.CurrentThread.Suspend();
} SortedList clientList;
public SocketServer()
{
clientList = new SortedList();
} Socket serverSocket;
/// <summary>
/// 启动监听
/// </summary>
public void Listen()
{
serverSocket = new Socket(AddressFamily.InterNetwork ,SocketType.Stream,ProtocolType.Tcp);
IPHostEntry lipa = Dns.Resolve(Dns.GetHostName());
IPEndPoint lep = new IPEndPoint(lipa.AddressList[0],8788);
serverSocket.Bind(lep);
serverSocket.Listen(100); //最大等待连接数
serverSocket.BeginAccept(new AsyncCallback(Accept_Callback),serverSocket); Console.WriteLine("Listen ...");
} void Accept_Callback(IAsyncResult e)
{
//接受连接
Socket clientSocket = this.serverSocket.EndAccept(e); string ip = SocketIP(clientSocket);
clientList.Add(clientList.Count, clientSocket); Console.WriteLine("Accept " + ip ); //继续监听
serverSocket.BeginAccept(new AsyncCallback(Accept_Callback),null); //异步开始接收数据
StateObject stateObject = new StateObject(clientSocket);
clientSocket.BeginReceive(stateObject.Buffer,0,stateObject.Buffer.Length,
SocketFlags.None,new AsyncCallback(CalReceive_Callback),stateObject);
} void CalReceive_Callback(System.IAsyncResult r)
{
StateObject stateObject = (StateObject)r.AsyncState;
Socket clientSocket = stateObject.SocketObject;
string ip = this.SocketIP(clientSocket);
int len=clientSocket.EndReceive(r);
if(len==0)
{
if(clientList.ContainsKey(ip))
clientList.Remove(ip);
return;
} string msg = System.Text.Encoding.Default.GetString(stateObject.Buffer,0,len);
Console.WriteLine("Receive Message From " + ip + "\n" + msg + "\n----------------------------"); //异步开始接收数据
stateObject = new StateObject(clientSocket);
clientSocket.BeginReceive(stateObject.Buffer,0,stateObject.Buffer.Length,
SocketFlags.None,new AsyncCallback(CalReceive_Callback),stateObject);
} /// <summary>
/// 取IP地址
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
string SocketIP(Socket s)
{
string r;
r=((IPEndPoint)s.RemoteEndPoint).Address.ToString();
return r;
}
} class StateObject
{
public byte[] Buffer;
public Socket SocketObject;
public StateObject(Socket s)
{
this.SocketObject=s;
this.Buffer=new byte[200];
}
}
}
1。
有个问题:我在客户端传完文件后关闭掉客户端socket,用shutdown.receive关的,可是总是出现“不能访问名为System.net.sockets.socket的已处置对象",如果没有客户端的socket关闭就不出现,我在想是不是,客户端关掉后,服务端发现了客户端关掉了socket,可是客户端传来的数据还没接收完所以出现这种提示,其实,最后文件也传完了,我在想时不是我程序的问题。