请教 socket 服务端 sendto 无法发送到指定 的终结点

my1ove 2011-01-09 09:07:41
private IPEndPoint ServerInfo;//存放服务器的IP和端口信息
private Socket ServerSocket;//服务端运行的SOCKET
private Thread ServerThread;//服务端运行的线程
private Socket[] ClientSocket;//为客户端建立的SOCKET连接
private int ClientNumb;//存放客户端数量
private byte[] MsgBuffer;//存放消息数据
private void CmdStar_Click(object sender, EventArgs e)
{

ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //提供一个 IP 地址,指示服务器应侦听所有网络接口上的客户端活动
IPAddress ip = IPAddress.Any;
ServerInfo=new IPEndPoint(ip,this.GetPort());
ServerSocket.Bind(ServerInfo);//将SOCKET接口和IP端口绑定
ServerSocket.Listen(100);//开始监听,并且挂起数为10
ClientSocket = new Socket[65535];//为客户端提供连接个数
MsgBuffer = new byte[65535];//消息数据大小
ClientNumb = 0;//数量从0开始统计
ServerThread = new Thread(new ThreadStart(RecieveAccept));//将接受客户端连接的方法委托给线程
ServerThread.Start();//线程开始运行
CheckForIllegalCrossThreadCalls = false;//不捕获对错误线程的调用
this.CmdStar.Enabled = false;
this.CmdStop.Enabled = true;
this.StateMsg.Text = "服务正在运行..." + " 运行端口:" + this.GetPort().ToString();
this.ClientList.Items.Add("服务于 " + DateTime.Now.ToString() + " 开始运行.");
}
//接受客户端连接的方法
private void RecieveAccept()
{
while (true)
{
//Accept 以同步方式从侦听套接字的连接请求队列中提取第一个挂起的连接请求,然后创建并返回新的 Socket。
//在阻止模式中,Accept 将一直处于阻止状态,直到传入的连接尝试排入队列。连接被接受后,原来的 Socket 继续将传入的连接请求排入队列,直到您关闭它。
ClientSocket[ClientNumb] = ServerSocket.Accept();
ClientSocket[ClientNumb].BeginReceive(MsgBuffer, 0, MsgBuffer.Length, SocketFlags.None,new AsyncCallback(RecieveCallBack),ClientSocket[ClientNumb]);

IPAddress remote_ip = ((System.Net.IPEndPoint)ClientSocket[ClientNumb].RemoteEndPoint).Address;
// int remote_Port = ((System.Net.IPEndPoint)ClientSocket[ClientNumb].RemoteEndPoint).Port;




lock (this.ClientList)
{
if (remote_ip.ToString() == "127.0.0.1")
{
this.listBox1.Items.Add(ClientSocket[ClientNumb].RemoteEndPoint.ToString() + " 请求连接.");
}
else
{
this.ClientList.Items.Add(ClientSocket[ClientNumb].RemoteEndPoint.ToString() + " 请求连接.");
}


}


ClientNumb++;




}
} //回发数据给客户端
private void RecieveCallBack(IAsyncResult AR)
{

try
{

Socket RSocket = (Socket)AR.AsyncState;
int REnd = RSocket.EndReceive(AR);

//byte[] MsgB = Encoding.Unicode.GetString(MsgBuffer, 0, REnd));
//


IPAddress remote_ip = ((System.Net.IPEndPoint)RSocket.RemoteEndPoint).Address;//获得客户端IP
int remote_Port = ((System.Net.IPEndPoint)RSocket.RemoteEndPoint).Port;//获得客户端端口

this.ClientList.Items.Add(remote_ip + ":::" + remote_Port);

if (remote_ip.ToString() == "127.0.0.1")
{


string msgbuffer = Encoding.UTF8.GetString(MsgBuffer, 0, MsgBuffer.Length);
String[] sarray = msgbuffer.Split(',');

ClassMsg msg = new ClassMsg();
msg.SID = sarray[0].ToString();
msg.SIP = sarray[1].ToString();
msg.SPort = sarray[2].ToString();
msg.RIP = remote_ip.ToString(); ;
msg.RPort = remote_Port.ToString();

msg.Data = Encoding.Unicode.GetBytes(sarray[3].ToString());
msg.sendKind = SendKind.SendMsg;
msg.msgCommand = MsgCommand.SendToOne;

byte[] sendmsg = new ClassSerializers().SerializeBinary(msg).ToArray();


string sip = sarray[1].ToString();
int sPort = Convert.ToInt32(sarray[2]);
IPEndPoint khdpoint = new IPEndPoint(IPAddress.Parse(sip), Convert.ToInt32(sPort));

/*
for (int i = 0; i < ClientNumb; i++)
{
if (ClientSocket[i].Connected)
{ //回发数据到客户端
ClientSocket[i].Send(sendmsg, 0, sendmsg.Length, SocketFlags.None);


} //同时接收客户端回发的数据,用于回发

}
*/



ServerSocket.SendTo(sendmsg, 0, sendmsg.Length, SocketFlags.None, khdpoint); //MessageBox.Show(sip + sPort);
this.listBox1.Items.Add("发送成功.");
}
else
{


byte[] Data = MsgBuffer;
//MessageBox.Show(Encoding.Unicode.GetString(MsgBuffer, 0, MsgBuffer.Length));

ClassMsg msg = new ClassSerializers().DeSerializeBinary((new MemoryStream(Data, 0, Data.Length))) as ClassMsg;


switch (msg.sendKind)
{
case SendKind.SendCommand://命令
{
switch (msg.msgCommand)
{

case MsgCommand.Logining://登录用户
{
UserLogin(msg, remote_ip, remote_Port, 1, RSocket);
break;
}
case MsgCommand.Close://登录用户
{
userexit(msg, remote_ip, remote_Port, RSocket);
break;
}

}
break;
}
case SendKind.SendMsg://消息
{
switch (msg.msgCommand)
{
case MsgCommand.SendToOne://发送消息给单用户
// SendUserMsg(msg, Ip, Port);
break;

case MsgCommand.SendToAll://发送消息给单用户
{
for (int i = 0; i < ClientNumb; i++)
{
if (ClientSocket[i].Connected)
{ //回发数据到客户端
ClientSocket[i].Send(MsgBuffer, 0, REnd, SocketFlags.None);


} //同时接收客户端回发的数据,用于回发

}
break;
}
}
break;
}
case SendKind.SendFile://文件
{
break;
}
}


//this.textBox1.AppendText(Encoding.Unicode.GetString(msg.Data, 0,msg.Data.Length));
//MessageBox.Show(Encoding.Unicode.GetString(msg.Data, 0, msg.Data.Length));
/* Classmysql mysql = new Classmysql();
mysql.UpdateData("update users set ipaddress = '" + remote_ip + "', port = '" + remote_Port + "' where id = 1");


string[,] str = mysql.GetData("select * from users where id=1");
this.ClientList.Items.Add(str[0,3] + "''''" + str[0,4]);
byte[] str2 = Encoding.Unicode.GetBytes("ddddd");
IPEndPoint khdpoint = new IPEndPoint(IPAddress.Parse(str[0,3]), Convert.ToInt32(str[0,4]));
RSocket.SendTo(str2, 0, str2.Length, SocketFlags.None, khdpoint);
*/


//对每一个侦听的客户端端口信息进行接收和回发
}

RSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, SocketFlags.None, new AsyncCallback(RecieveCallBack), RSocket);

}

catch { }




}




上面标红色的这句发不出去 客户端没有收到 用下面这句就可以 为什么????for (int i = 0; i < ClientNumb; i++)
{
if (ClientSocket[i].Connected)
{ //回发数据到客户端
ClientSocket[i].Send(MsgBuffer, 0, REnd, SocketFlags.None);


} //同时接收客户端回发的数据,用于回发

}
...全文
180 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
my1ove 2011-01-09
  • 打赏
  • 举报
回复
sendto 是执行 了 但是客户端却没有收到
wuyq11 2011-01-09
  • 打赏
  • 举报
回复
F11单步调试
憧憬z 2011-01-09
  • 打赏
  • 举报
回复



好长

110,536

社区成员

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

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

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