一个简单的问题--Socket.ReceiveFrom函数的用法

caiwei1129 2003-10-17 02:55:31
using System;
using System.Net;
using System.Net.Sockets;

namespace server
{
class Class1
{
static void Main(string[] args)
{
Socket myso=new Socket(AddressFamily.InterNetwork,SocketType.Raw,ProtocolType.Icmp);
byte[] rcvBuf=new byte[256];
IPEndPoint remoteIP=new IPEndPoint(IPAddress.Parse("172.16.11.22"),0);
EndPoint remoteEP=(remoteIP);
while(true)
{
int nBytes=myso.ReceiveFrom(rcvBuf,256,0,ref remoteEP);
Console.WriteLine(remoteEP.ToString());
}
}
}
}

我想写一个接收ICMP数据包的程序,可是上述程序总是说执行ReceiveFrom函数那句出错:"An unhandled exception of type 'System.Net.Sockets.SocketException' occurred in system.dll

Additional information: 提供了一个无效的参数。"
请教一下各位大侠应该怎么改,这个程序是想接受所有的ICMP包的,ReceiveFrom函数中的最后一个EndPoint参数我记得好象是用来存储远程主机的信息的,所以原来为空应该也可以,可是若这个参数开始没有赋值,就提示使用了未赋值的参数,给他赋值,又提示上述错误,哪位大侠帮帮我吧!!
...全文
790 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
babysgaler 2003-11-11
  • 打赏
  • 举报
回复
收分
caiwei1129 2003-10-18
  • 打赏
  • 举报
回复
wolve你好,我试过用IPAddress.Any了,可是结果一样不行
至于rgbcn推荐的ping程序,实际上我已经编过了,且运行成功,而且奇怪是,为什么那里receivefrom函数的最后一个EndPoint参数用的是本机的地址,我觉得应该是远程的啊,即使我按照ping程序中的receiveFrom函数原原本本的搬过来,还是同样错误,真是不明白是怎么回事
caiwei1129 2003-10-18
  • 打赏
  • 举报
回复
我发现一个奇怪的现象,如果用建立的原始套接字先向某个随便什么地址用sendto函数发送一个数据包,再用receivefrom函数就没有问题了,如果把sendto函数这一行去掉,则提示receivefrom这行提供了一个无效的参数....这是什么原因呢??
caiwei1129 2003-10-18
  • 打赏
  • 举报
回复
up
dahai9825 2003-10-17
  • 打赏
  • 举报
回复
up
rgbcn 2003-10-17
  • 打赏
  • 举报
回复
看下这
http://www.c-sharpcorner.com/network/ping.asp
hmjwdmh 2003-10-17
  • 打赏
  • 举报
回复
up
wolve 2003-10-17
  • 打赏
  • 举报
回复
我发错了,sorry.
把remoteIp设为:IPEndPoint(IPAddress.Any, 0)试试.应该参考一下socket的通信协议的文档,可能还有设置其它标志位。

wolve 2003-10-17
  • 打赏
  • 举报
回复
http://www-900.ibm.com/developerWorks/cn/webservices/ws-secure/index.shtml
非常不错,c#入门经典哦! 关于socket的,适合初学者。 #socket编程基础 Microsoft.Net Framework为应用程序访问Internet提供了分层的、可扩展的以及受管辖的网络服务,其名字空间System.Net和System.Net.Sockets包含丰富的类可以开发多种网络应用程序。.Net类采用的分层结构允许应用程序在不同的控制级别上访问网络,开发人员可以根据需要选择针对不同的级别编制程序,这些级别几乎囊括了Internet的所有需要 --从socket套接字到普通的请求/响应,更重要的是,这种分层是可以扩展的,能够适应Internet不断扩展的需要。 抛开ISO/OSI模型的7层构架,单从TCP/IP模型上的逻辑层面上看,.Net类可以视为包含3个层次:请求/响应层、应用协议层、传输层。 WebReqeust和WebResponse 代表了请求/响应层,支持Http、Tcp和Udp的类组成了应用协议层,而Socket类处于传输层。 传输层位于这个结构的最底层,当其上面的应用协议层和请求/响应层不能满足应用程序的特殊需要时,就需要使用这一层进行Socket套接字编程。 而在.Net中,System.Net.Sockets 命名空间为需要严密控制网络访问的开发人员提供了 Windows Sockets (Winsock) 接口的托管实现。System.Net 命名空间中的所有其他网络访问类都建立在该套接字 Socket实现之上,如TCPClient、TCPListener 和 UDPClient 类封装有关创建到 Internet 的 TCP 和 UDP 连接的详细信息;NetworkStream类则提供用于网络访问的基础数据流等,常见的许多 Internet服务都可以见到Socket的踪影,如Telnet、Http、Email、Echo等,这些服务尽管通讯协议Protocol的定义不同,但是其基础的传输都是采用的Socket。 其实,Socket可以象流Stream一样被视为一个数据通道,这个通道架设在应用程序端(客户端)和远程服务器端之间,而后,数据的读取(接收)和写入(发送)均针对这个通道来进行。 可见,在应用程序端或者服务器端创建了Socket对象之后,就可以使用Send/SentTo方法将数据发送到连接的Socket,或者使用Receive/ReceiveFrom方法接收来自连接Socket的数据; 针对Socket编程,.NET 框架的 Socket 类是 Winsock32 API 提供的套接字服务的托管代码版本。其中为实现网络编程提供了大量的方法,大多数情况下,Socket 类方法只是将数据封送到它们的本机 Win32 副本中并处理任何必要的安全检查。如果你熟悉 Winsock API函数,那么用Socket类编写网络程序会非常容易,当然,如果你不曾接触过,也不会太困难,跟随下面的解说,你会发觉使用 Socket类开发windows 网络应用程序原来有规可寻,它们在大多数情况下遵循大致相同的步骤。

110,499

社区成员

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

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

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