Socket.select() 的问题

newlju 2004-11-02 05:04:55
服务器端代码:
private ArrayList ClientList; // 保存当前以连接的客户端socket
启动一个线程负任侦听连接并存入ClientList
protected void StartListen()
{
IPAddress serverAddress = IPAddress.Parse("192.168.0.7");
tcpListener = new TcpListener(serverAddress,2626); tcpListener.Start();
listBox1.Items.Add("wait a conn...");
while(IsListen)
{
Socket socketForClient = tcpListener.AcceptSocket();
socketForClient.Blocking = true; // 设置socket处于阻塞模式
lock(ClientList)
{
ClientList.Add(socketForClient);
}
}
}
另一个负责读取客户端发送过来的数据的线程
private void StartMsgRead()
{
while(ClientList.Count < 0)
{
ArrayList tempList = ClientList;
Socket.Select(tempList,null,null,1000);
for(int i=0;i<tempList.Count;i++)
{
Byte[] data = new byte[1024];
int byteRec;
byteRec = ((Socket)tempList[i]).Receive(data);
listBox1.Items.Add(System.Text.Encoding.BigEndianUnicode.GetString(data,0,byteRec));
}
}
}
----------------------------------
我的想法就是用非阻塞方式一个线程来专门侦听接受客户端连接,半把以连接的socket存到一个socket列表中,
然后另外一个线程中使用socket.select来确定那些socket有数据可读,

按上面的代码客户端连接后发送数据后服务端没有显示出发来的数据,不知道错在那里,初数网络编程,那位高人给偶指点指点。。。
服务端改成阻塞的每个socket专门用一个线程处理就能收到数据,,,郁闷呀。。
...全文
408 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
newlju 2004-11-04
  • 打赏
  • 举报
回复
while(ClientList.Count < 0)
确实是写错了。
换成异步消息加线程池,以经自已解决了。结贴
xiaoslong 2004-11-03
  • 打赏
  • 举报
回复
帮你顶一下
mulintaomulintao 2004-11-03
  • 打赏
  • 举报
回复
ArrayList tempList = ClientList; worong
Arraylist tempList=new arraylist(ClientList)
mulintaomulintao 2004-11-03
  • 打赏
  • 举报
回复
你的ArrayList 中存的socket ,
for(int i=0;i<tempList.Count;i++)
{
Byte[] data = new byte[1024];
int byteRec;
byteRec = ((Socket)tempList[i]).Receive(data);
listBox1.Items.Add(System.Text.Encoding.BigEndianUnicode.GetString(data,0,byteRec));
你发送的数据并不一定是哪一个socket的,如果他不是tempList中的第一个,调用((Socket)tempList[i]).Receive(data),仍旧会阻塞,因此出错难免
mulintaomulintao 2004-11-03
  • 打赏
  • 举报
回复
while(ClientList.Count < 0)
改为
while(ClientList.Count 〉 0)
zhouyong2052 2004-11-02
  • 打赏
  • 举报
回复
up
newlju 2004-11-02
  • 打赏
  • 举报
回复
up......
newlju 2004-11-02
  • 打赏
  • 举报
回复
回复人: sexfreebird(自由鸟) ( ) 信誉:100 2004-11-02 17:45:00 得分: 0


有没有debug一下看看是到哪里出错的呀


不是出错。是
listBox1.Items.Add(System.Text.Encoding.BigEndianUnicode.GetString(data,0,byteRec));
什么都没输出。好像是Socket.select之后的代码都没有执行。
sexfreebird 2004-11-02
  • 打赏
  • 举报
回复
有没有debug一下看看是到哪里出错的呀
newlju 2004-11-02
  • 打赏
  • 举报
回复
up....
cs920 2004-11-02
  • 打赏
  • 举报
回复
NO.1
up

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧