C语言发送UDP数据的!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言发送UDP数据的!相关的知识,希望对你有一定的参考价值。

C语言发送UDP数据的, 我要做一个服务端只管把我的数据发到指定IP上就行了。现在网上找的都是要客服端发数据过来响应的。
下面这段我从网上找了整理出来的。

void do_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen)



int n;

socklen_t len;

char mesg[MAXLINE]; // 数据区

for(;;) // 死循环,作服务器



len = clilen; // 长度

/* waiting for receive data */

n = recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len); // 这是核心方法,应该是一个阻塞的方法,一直在等待客户端的消息.

/* sent data back to client */

sendto(sockfd, mesg, n, 0, pcliaddr, len); // 这是发送到客户端的方法,好象数据从客户端读过来后,马上又给客户端回写回去





int main(int argc, char *argv[])

int sockfd; // SOCKET 编号

struct sockaddr_in servaddr, cliaddr; // SOCKET 地址结构体, 用来存放服务器和客户端的IP地址

sockfd = socket(AF_INET, SOCK_DGRAM, 0); /*create a socket*/ // 实际创建一个SOCKET对象, AF_INET是IPV4的标志,SOCK_DGRAM是UDP数据包的标志

/* init servaddr */

bzero(&servaddr, sizeof(servaddr)); // 这个相当于memset, 先把服务器的IP地址信息全置成0

servaddr.sin_family = AF_INET; // 服务器IP的类型是IPV4

servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // 服务器绑定的IP是任意的.意思就是默认的IP地址

servaddr.sin_port = htons(SERV_PORT); // 服务器端口

// 开始绑定这个服务器,用创建好的SOCKET对象和服务器IP信息,以及服务器IP信息的长度.

/* bind address and port to socket */

if(bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)



// 如果绑定失败,返回错误

perror("bind error");

exit(1);



// 进入主服务器的方法.也就是上面的死循环,程序一直在等待.

do_echo(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));

return 0;

我要用C语言通过socket的UDP发送一段字符串到指定ip上。我只管发送出去就行了。其它都不管它。

不明白你要干嘛,发表了几个陈述句,贴了段code... 参考技术A 这段代码你测试了吗!

无法在c#中使用udp发送数据

您好我正在开发示例应用程序,用于演示udp客户端将数据从客户端发送到服务器。我已经创建了控制台应用程序,下面是我的代码。

class Program
    {
        static void Main(string[] args)
        {
            senddata();
            while (true)
            {
                try { 
                UdpClient udpClient = new UdpClient(9999);
                IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
                Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
                string returnData = Encoding.ASCII.GetString(receiveBytes);
                string result;
                result = returnData.ToString();
                }
                catch(Exception e)
                {

                }
            }
            void senddata()
            {
                UdpClient udpClient = new UdpClient(9999);

                udpClient.Connect("10.170.84.163", 9999);
                Byte[] senddata1 = Encoding.ASCII.GetBytes("Hello World");
                udpClient.Send(senddata1, senddata1.Length);

            }
        }
    }

每当Byte [] receiveBytes被执行时,我得到我的空白黑屏,什么都不会发生。谁能告诉我如何解决这个问题?任何帮助,将不胜感激。谢谢。

答案

这里有几个问题:

  1. 您在该端口上启动侦听器之前将数据发送到udp端口(通过senddata()),并且您只执行一次,因此侦听器无法接收它。
  2. 在发送数据时,无需将UdpClient绑定到特定端口,尤其是在您使用另一个UdpClient监听的同一端口上。只需使用UdpClient udpClient = new UdpClient();让它使用任何可用的端口进行发送。
  3. 由于您正在测试 - 不需要将数据发送到外部IP,而是发送到loopback接口:udpClient.Connect(IPAddress.Loopback, 9999);
  4. UdpClient实施IDisposable,所以在你完成后处理它。
  5. 你的while (true)循环不起作用,因为你没有处理UdpClient,所以在循环的第二次迭代,第二次UdpClient将尝试绑定到同一个9999端口并失败,因为已经有侦听器(你没有处置)在同一个港口。

您的代码上面有修复(显然不是“生产”代码所以我不会添加取消等内容,只修复以便能够看到消息即将到来):

static void senddata() {
    // send message every 100 ms
    while (true) {
        // wrap in using
        using (UdpClient udpClient = new UdpClient()) {
            // loopback
            udpClient.Connect(IPAddress.Loopback, 9999);
            Byte[] senddata1 = Encoding.ASCII.GetBytes("Hello World");
            udpClient.Send(senddata1, senddata1.Length);
        }
        Thread.Sleep(100);
    }
}

static void Main(string[] args) {
    // run sending in background
    Task.Run(() => senddata());

    try {
        // wrap in using
        using (UdpClient udpClient = new UdpClient(9999)) {
            IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
            // move while loop here
            while (true) {
                // this blocks until message is received
                Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
                string returnData = Encoding.ASCII.GetString(receiveBytes);
                Console.WriteLine(returnData);
            }
        }
    }
    catch (Exception e) {
        // do something meaningful
    }
}
另一答案

它看起来不像是在输出收到的字符串。

像这样......

string result;
result = returnData.ToString();
Console.WriteLine(result);
另一答案

尝试更改以下内容:

IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);

使用端口9999而不是随机端口。老实说有点惊讶,不会抛出异常。

请注意,绑定到随机端口作为服务器不是非典型的,但远程端需要某种方式来发现随机端口I..E。 ftp使用第二个端口进行实际文件数据传输的方式,该端口号作为开始传输的消息的一部分发送。

以上是关于C语言发送UDP数据的!的主要内容,如果未能解决你的问题,请参考以下文章

C语言写的UDP客户端收不到包

用C语言实现基于UDP协议的文件传输系统,其中服务端接受和发送文件需要用到哪些函数?

我想问怎么用c语言实现对一个二进制报文的读取(报文里是以太网,IP,UDP,DNS,ARP,TCP

从客户端接收到第一个数据包后,C ++ UDP Socket无法从服务器发送回客户端

如何用c语言编写socket套接字

C语言 UDP中revcfrom怎么从阻塞中跳出?