【急】请教高手:C#如何发送原始套接字?【100分】

时间:2022-11-16 17:56:19
我试了各种方法,不过至今都不行~

下面那个是试验到现在的最可行的点的方法了,关键代码如下:
sock = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
sock.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, 1);

sock.SendTo(bytee, bytee.Length, 0, ip);

但是它一执行,它就一直报错:一个*操作被对 WSACancelBlockingCall 的调用中断。
请问这是为什么呢?如何才能把原始套接字发出去呢?谢谢了~

项目催得很紧,麻烦帮忙吧~~~~

10 个解决方案

#1


不对,发错了

那个发送的代码应该是:sock.Send(bytee, bytee.Length, 0); 

#2


下面的代码示例演示在连接的 Socket 上发送数据。

// Displays sending with a connected socket
// using the overload that takes a buffer.
public static int SendReceiveTest1(Socket server)
{
    byte[] msg = Encoding.UTF8.GetBytes("This is a test");
    byte[] bytes = new byte[256];
    try 
    {
        // Blocks until send returns.
        int i = server.Send(msg);
        Console.WriteLine("Sent {0} bytes.", i);
        
        // Get reply from the server.
        i = server.Receive(bytes);
        Console.WriteLine(Encoding.UTF8.GetString(bytes));
    }
    catch (SocketException e)
    {
        Console.WriteLine("{0} Error code: {1}.", e.Message, e.ErrorCode);
        return (e.ErrorCode);
    }
    return 0;
}

#3


Connect 了吗

#4


引用 2 楼 zhoufoxcn 的回复:
下面的代码示例演示在连接的 Socket 上发送数据。 

C# code
// Displays sending with a connected socket
// using the overload that takes a buffer.
public static int SendReceiveTest1(Socket server)
{
    byte[] msg = Encoding.UTF8.GetBytes("This is a test");
    byte[] bytes = new byte[256];
    try 
    {
        // Blocks until send returns.
        int i = server.Send(msg);
        C…


谢谢,不过这个发送的只是包的数据部分吧,它的包头没法自定义,不是原始套接字啊~

#5


引用 3 楼 fuadam 的回复:
Connect 了吗


嗯,Connect了。

另外,刚查到说是XP SP2都会发生这个错误的。。。天呐~~~不会让我重装系统吧??~~~

#6


你换个操作系统试试,我认为可能还是同样的问题

#7


嗯,正在装虚拟机中。。。~

#8


同感,系统的问题,再就是还建议你抓网络数据包看看,你下载一个 ethereal
运行程序前,启动ethereal,我做你类似的项目还要自己写模拟器收发自己程序的套接字消息呢
ethereal可以看到,并让你检查分析数据包的正确性

QQ:47332677欢迎交流

#9


后来还是用WinPcap解决的,用了它的两个dll,不过,在Vista下貌似没法运行,在XP下没任何问题。

WinPcap确实非常强大~~~~

#10


MSDN里没有原始套接字的例程?

#1


不对,发错了

那个发送的代码应该是:sock.Send(bytee, bytee.Length, 0); 

#2


下面的代码示例演示在连接的 Socket 上发送数据。

// Displays sending with a connected socket
// using the overload that takes a buffer.
public static int SendReceiveTest1(Socket server)
{
    byte[] msg = Encoding.UTF8.GetBytes("This is a test");
    byte[] bytes = new byte[256];
    try 
    {
        // Blocks until send returns.
        int i = server.Send(msg);
        Console.WriteLine("Sent {0} bytes.", i);
        
        // Get reply from the server.
        i = server.Receive(bytes);
        Console.WriteLine(Encoding.UTF8.GetString(bytes));
    }
    catch (SocketException e)
    {
        Console.WriteLine("{0} Error code: {1}.", e.Message, e.ErrorCode);
        return (e.ErrorCode);
    }
    return 0;
}

#3


Connect 了吗

#4


引用 2 楼 zhoufoxcn 的回复:
下面的代码示例演示在连接的 Socket 上发送数据。 

C# code
// Displays sending with a connected socket
// using the overload that takes a buffer.
public static int SendReceiveTest1(Socket server)
{
    byte[] msg = Encoding.UTF8.GetBytes("This is a test");
    byte[] bytes = new byte[256];
    try 
    {
        // Blocks until send returns.
        int i = server.Send(msg);
        C…


谢谢,不过这个发送的只是包的数据部分吧,它的包头没法自定义,不是原始套接字啊~

#5


引用 3 楼 fuadam 的回复:
Connect 了吗


嗯,Connect了。

另外,刚查到说是XP SP2都会发生这个错误的。。。天呐~~~不会让我重装系统吧??~~~

#6


你换个操作系统试试,我认为可能还是同样的问题

#7


嗯,正在装虚拟机中。。。~

#8


同感,系统的问题,再就是还建议你抓网络数据包看看,你下载一个 ethereal
运行程序前,启动ethereal,我做你类似的项目还要自己写模拟器收发自己程序的套接字消息呢
ethereal可以看到,并让你检查分析数据包的正确性

QQ:47332677欢迎交流

#9


后来还是用WinPcap解决的,用了它的两个dll,不过,在Vista下貌似没法运行,在XP下没任何问题。

WinPcap确实非常强大~~~~

#10


MSDN里没有原始套接字的例程?