c# socket 异步通信 的一个问题

下面两个函数是clientsocket类中的两个方法, 我想定义一个client类, 然后通过 receive 方法 返回读取的内容, 但是程序运行到下面老是卡住, 运行一分钟左右 然后返回空

public string Receive()
{
try
{
response = "";
StateObject state = new StateObject();
state.workSocket = client;
receiveDone.Reset();
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
receiveDone.WaitOne();
return response;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
private void ReceiveCallback(IAsyncResult ar)
{
StateObject state = (StateObject)ar.AsyncState;
Socket client = state.workSocket;
int bytesRead = client.EndReceive(ar);
if (bytesRead > 0)
{
// 有数据,存储.
state.sb.Append(Encoding.UTF8.GetString(state.buffer, 0, bytesRead));
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state);
}
else
{
response = state.sb.ToString();
}
// 所有数据读取完毕的指示信号.
receiveDone.Set();
}
receiveDone.WaitOne();
return response;
我估计问题应该出在这个地方, 不知道在什么时候返回这个数值。。

你又用Callback来实现异步,又用receiveDone.WaitOne();来等待返回,所以还是卡住主线程。
你的线程同步机制有点混乱或者理解的不够。追问

我是理解的有点不够;正在学习中。
我想返回读取完成后的数据,如果不加receiveDone.WaitOne() 这句话, 会不会主线程beginreceive之后 就直接return response了? 我单步调试了一下,就直接return 了。
response 是保存的读取的数据。
大神, 你能有个好的解决方法吗?

追答

肯定要return的,这就是异步读取。你采用异步读取的方式,用同步的方法来获取结果,结果还是同步读取。

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-11-20
socket通信,是需要线程的,你这样肯定是会卡,也会出问题的追问

是卡, 我是写在timer 控件里面的, 这位大侠有何解决的高招啊?

第2个回答  2019-06-04
运行一分钟左右
然后返回空,是读取超时了才返回的,而且bytesread=0,你应该考虑异步读取,才不会卡住;

C# SOCKET 异步接收的问题
客户机b进行通信传输。首先需要在a机建立监听线程。监听某一端口,那么b机可以向a机发送通讯请求,b机连接到a机以后。a机可以从他的监听队列中取的一个监听对象。在a端拿到了这个socket对象就可以进行接收跟发送数据了。这里问题就出现了。假如b端在请求a端的时候请求成功就发送一条数据。那么 a端就可...

C#socket异步怎么实现 线程间通信如何实现
在调用BeginConnect方法时必须注册相应的回调函数并且至少传递一个Socket的实例给state参数,以保证EndConnect方法中能使用原始的套接字。下面是一段是BeginConnect的调用:Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp)IPAddress ip=IPAddress.Parse("127.0.0.1");IPEndPoint iep=new...

C# Socket通信 服务器异常:远程主机强迫关闭了一个现有的连接
因为客户端关闭的主动权是由服务器决定的,如果客户端擅自关闭连接则会出现这个异常

C#Socket无连接异步传输
自己的IP地址 如果是直接入网的话(无网关 不是学校公司这种局域网入网的) 就是你上百度贴吧匿名发帖的那个IP 其他方法也有 但是这个最直观 还有 SOCKET不是一个端口性质的东西 而是更像一个数据包这种样子的东西 这点很容易混淆 比如说 如果是服务器监听客户端的话 :服务器不需要知道客户端的IP 只...

c#socket在使用TCP或UDP异步通信的时候SocketAsyncEventArgs和...
3、由于SocketAsyncEventArgs是异步操作,在很多情况需要的一些其他信息传递到Completed事件中,这个时候可以通过UserToken属性来解决异步信息传递的问题。使用注意:SocketAsyncEventArgs同一时间只能进行一个操作,通过Completed来确认当前操作是否完成,如果同步完成是不会触该事件需要自己手动调用处理。

c#中tcp异步编程遇到异常问题,新手感觉很不得懂 希望大神能从浅显的角度...
;这句代码的意思是建立一个连接到host和其端口52888的连接,在创建时就已经连接上了。这里的host指的是你要连接的服务器IP地址。此时在创建时已经建立连接了,所以在使用BeginConnect异步调用时,抛出一个【在一个已经建立连接的套接字上做一个连接请求。你理解上面的内容,应该就可以解决你的问题了。

C# Socket 客户端 异步收发消息的时候,提示“远程主机强迫关闭了一个...
服务端 是接收连接 一个客户端连上来 创建了一个连接 100个客户连上来服务端就创建100个连接,没个对应相应的客户连接 提示关闭了一个连接 就是 有一个客户连接断开了 就还剩下99个连接,为什么每有一个客户的 连上来就创建一个 Socket 因为 通信用的就是socket 类 也就是一个连接 ...

C#Socket(tcp)异步批量发送文件问题
测试文件发送到Server和下载的情况基本差不多,这说明了在网络不好的情况处理发送大数据包似首容易产生错误,但看TCP\/IP协议讲解这情况似乎不存在,因为当一个发送数据超过某个值的时候,TCP会划分块进行传输并保证其顺序.但网络不好的情况测试结果接收的数据有错误,但处理的数据大小是正确的,也并没影响整个...

C# socket异步通信请求被重复执行的问题
C# socket异步通信请求被重复执行的问题 10 本人做的一个socket服务,已经运行半年多,之前没有出现错误的情况,单单昨天出现了一笔离奇的交易记录,客户端请求操作记录是一条,但服务端的监听记录是两条,所以也就执行了两次,... 本人做的一个socket服务,已经运行半年多,之前没有出现错误的情况,单单昨天出现了一笔...

c# Socket TCP通信中发生莫名其妙的错误
问题应该发生在接收的上面,当read结束时数据并不一定会接收全所以如果直接发出去的话,发送的数据也是不全的.加了sleep之后read的时间间隔就变长了所以得到完整数据包的可能性就更高了.你最好在接受的时候判断下是否接到了所有数据,再去发送.

相似回答