Socket编程的一个问题,请教下大家

zaixiang 2005-10-12 08:47:56
下面是异常的堆栈信息:
System.Net.Sockets.SocketException: 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。
at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 size, SocketFlags socketFlags)

因为我还没有从客户端把信息发给服务器,于是在服务器段用Reveive的时候,就遇到这个问题.可是msdn上说,Receive会阻塞直到收到信息的啊.请问是什么缘故.
谢谢大家!
...全文
109 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
CraxyMouse 2005-10-13
  • 打赏
  • 举报
回复
上面那是服務器端的服務及數據處理方式,你上面的錯是服務端還是客戶端報了來的?
如果是客戶端報出來的話是你沒有連接到服務端或是連接斷開了!
CraxyMouse 2005-10-13
  • 打赏
  • 举报
回复
private void StartListen()
{
while(true)
{
try
{
//當接收到客戶端請求時,確認
Socket o_ConnectSocket = o_ServerListener.AcceptSocket();
//用TempSocket來保存客戶端請求實例
o_TempSocket = o_ConnectSocket;
//判斷連接數是否到最大連接數
if(a_Clents.Count > n_ConnectMAX)
{
o_TempSocket.Close();
}
else
{
//啟動一個新線程,處理客戶端請求
Thread o_ClientService = new Thread(new ThreadStart(ServiceForClient));
o_ClientService.IsBackground = true;
o_ClientService.Start();
}
}
catch(Exception ex)
{
labState.Text = "Error";
labState.ForeColor = Color.Red;
ListViewItem lvi = new ListViewItem();
lvi.Text = "Error";
lvi.SubItems.Add(ex.Message);
lvUser.Items.Add(lvi);
}
GC.Collect();
}
}

private void ServiceForClient()
{
try
{
Socket o_ClientSocket = o_TempSocket;
//用循還與客戶端進行交互,直到用戶發出QUIT命令
bool b_KeepConnect = true;
int bufLen = 0;
while(b_KeepConnect)
{
//接收客戶端發關的數據,第次接收最大的數據為1024個字節
byte[] buff = new byte[1024];
bufLen = o_ClientSocket.Available;
//接收客戶端的數據並存在buff數組中
o_ClientSocket.Receive(buff,0,bufLen,SocketFlags.None);
//將客戶端發關的數據轉換成字串
string s_ClientCommand = System.Text.Encoding.ASCII.GetString(buff);
//保存用戶的登錄信息
string[] s_a_ClientData = s_ClientCommand.Split(new char[]{'|'});
//s_a_ClientData[0]存放用戶命令
#region LOGIN
if(s_a_ClientData[0] == "LOGIN")
{
//s_a_ClientData[1]存放用戶登錄用戶名
//s_a_ClientData[2]存放用戶登錄密碼
//s_a_ClientData[3]存放用戶登錄IP
#region 確認錄信息
for(int n =1;n<lvUser.Items.Count;n++)
{
if(lvUser.Items[n].SubItems[1].Text.Trim() == s_a_ClientData[3].Trim())
{
string s_Fail = "CLOSE|The 'IP' Has Been Login!";
byte[] Fail = System.Text.Encoding.ASCII.GetBytes(s_Fail.ToCharArray());
o_ClientSocket.Send(Fail,Fail.Length,0);
Thread.Sleep(100);
o_ClientSocket.Close();
b_KeepConnect = false;
}
}
#endregion

//添加到用戶列表中
Client o_Client = new Client(s_a_ClientData[1],o_ClientSocket);
a_Clents.Add(o_Client);
ListViewItem lvi = new ListViewItem();
lvi.Text = s_a_ClientData[1];
lvi.SubItems.Add(s_a_ClientData[3]);
lvi.SubItems.Add(s_a_ClientData[4]);
lvUser.Items.Add(lvi);
//登錄成功後返回一組用戶消息
string s_LogMsg = "OK|";
byte[] Message = System.Text.Encoding.ASCII.GetBytes(s_LogMsg.ToCharArray());
o_ClientSocket.Send(Message,Message.Length,0);
}
#endregion

#region LINE
if(s_a_ClientData[0] == "LINE")
{
for(int l = 1; l<lvUser.Items.Count;l++)
{
if(s_a_ClientData[1].Trim() == lvUser.Items[l].SubItems[1].Text.Trim())
{
lvUser.Items[l].SubItems[2].Text = s_a_ClientData[2];
break;
}
}
}
#endregion

#region QUIT
if(s_a_ClientData[0] == "QUIT")
{
for(int i = 0; i < a_Clents.Count; i++)
{
Client _Client = (Client)a_Clents[i];
if(s_a_ClientData[1] == _Client._Name)
{
a_Clents.RemoveAt(i);
}
}
for(int n = 0 ; n <lvUser.Items.Count;n++)
{
if(lvUser.Items[n].SubItems[0].Text.Trim() == s_a_ClientData[1])
{
lvUser.BeginUpdate();
lvUser.Items[n].Remove();
lvUser.EndUpdate();
}
}
if(o_ClientSocket.Connected == true)
{
o_ClientSocket.Close();
}
b_KeepConnect = false;
}
#endregion

}
}
catch(Exception ex)
{
ListViewItem lvi = new ListViewItem();
lvi.Text = "Error";
lvi.SubItems.Add(ex.Message);
lvUser.Items.Add(lvi);
}
}
zaixiang 2005-10-12
  • 打赏
  • 举报
回复

110,534

社区成员

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

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

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