gpt4 book ai didi

c - 在 win32 UDP 套接字应用程序中无法从 UDP 服务器接收数据

转载 作者:行者123 更新时间:2023-11-30 15:22:12 24 4
gpt4 key购买 nike

我有一个硬件 ARM 控件作为 UDP 服务器,我通过下面用 C# 编写的代码与其进行通信。 PC是UDP客户端。服务器只是回显数据。

这工作正常,没有任何问题,而且很稳定。

using System.Net.Sockets;
using System.Net;
using System.Text;
using System;

namespace UDPSocket
{
class UDPSender
{
static void Main(string[] args)
{
UInt32 i=0;
Int32 PORT = 45555;
for (; i < 15; )
{
Console.WriteLine(i++);
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
ProtocolType.Udp);

IPAddress broadcast = IPAddress.Parse("192.168.0.10");

byte[] sendbuf = Encoding.ASCII.GetBytes("Shriganesh Damle, Infineon Techonologies India Pvt Ltd, Bangalore");
IPEndPoint ep = new IPEndPoint(broadcast, PORT);

//Creates a UdpClient for reading incoming data.
UdpClient receivingUdpClient = new UdpClient(PORT);

s.SendTo(sendbuf, ep);

Console.WriteLine("Message sent to the broadcast address");

//Creates an IPEndPoint to record the IP Address and port number of the sender.
// The IPEndPoint will allow you to read datagrams sent from any source.
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);

// Blocks until a message returns on this socket from a remote host.
Byte[] receiveBytes = receivingUdpClient.Receive(ref RemoteIpEndPoint);

string returnData = Encoding.ASCII.GetString(receiveBytes);

Console.WriteLine("This is the message you received " +
returnData.ToString());
Console.WriteLine("This message was sent from " +
RemoteIpEndPoint.Address.ToString() +
" on their port number " +
RemoteIpEndPoint.Port.ToString());
//Console.Read();
receivingUdpClient.Close();
}
Console.Read();
}
}
}

现在,我想要在 Win32 C 应用程序中使用相同的 PC 代码。我尝试了下面的代码。

/*
Simple udp client
*/
#include<stdio.h>
#include<winsock2.h>

#pragma comment(lib,"ws2_32.lib") //Winsock Library

#define SERVER "192.168.0.10" //ip address of udp server
#define BUFLEN 512 //Max length of buffer
#define PORT 45555 //The port on which to listen for incoming data

int main(void)
{
struct sockaddr_in si_other;
int s, slen=sizeof(si_other);
char buf[BUFLEN];
char message[BUFLEN];
WSADATA wsa;

//Initialise winsock
printf("\nInitialising Winsock...");
if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)
{
printf("Failed. Error Code : %d",WSAGetLastError());
exit(EXIT_FAILURE);
}
printf("Initialised.\n");

//create socket
if ( (s=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR)
{
printf("socket() failed with error code : %d" , WSAGetLastError());
exit(EXIT_FAILURE);
}

//setup address structure
memset((char *) &si_other, 0, sizeof(si_other));
si_other.sin_family = AF_INET;
si_other.sin_port = htons(PORT);
si_other.sin_addr.S_un.S_addr = inet_addr(SERVER);

//start communication
while(1)
{
printf("Enter message : ");
gets(message);

//send the message
if (sendto(s, message, strlen(message) , 0 , (struct sockaddr *) &si_other, slen) == SOCKET_ERROR)
{
printf("sendto() failed with error code : %d" , WSAGetLastError());
exit(EXIT_FAILURE);
}

//receive a reply and print it
//clear the buffer by filling null, it might have previously received data
memset(buf,'\0', BUFLEN);
//try to receive some data, this is a blocking call
if (recvfrom(s, buf, BUFLEN, 0, (struct sockaddr *) &si_other, &slen) == SOCKET_ERROR)
{
printf("recvfrom() failed with error code : %d" , WSAGetLastError());
exit(EXIT_FAILURE);
}

puts(buf);
}

closesocket(s);
WSACleanup();

return 0;
}

此代码能够发送到 UDP 服务器并回显。但是recvfrom调用将等待数据直到无限时间。 recvfrom 正在阻塞调用。我给出了正确的 IP 地址和端口。我仍然无法在 Win32 应用程序中从服务器接收数据。你能帮忙吗?

最佳答案

如果要在套接字上接收数据,则需要将其绑定(bind)到一个或多个本地地址和本地端口。您的 C# 版本通过 new UdpClient(PORT) 实现此目的(请注意 PORT 参数),但您的 C 版本不会执行任何类似操作。

创建套接字后,执行以下操作

sockaddr_in localAddr;

localAddr.sin_family = AF_INET;
localAddr.sin_port = htons(PORT);
localAddr.sin_addr.S_un.S_addr = INADDR_ANY;

bind(s, &localAddr, sizeof(sockaddr_in));

并验证它是否返回 0 以指示成功。

或者,如果您创建第二个套接字来接收服务器响应,C 版本将与 C# 版本更加并行。我认为没有必要在 C 中执行此操作(更准确地说,在 Winsock2 中),但使用相同的套接字发送和接收可能需要绑定(bind)到特定的本地地址而不是 INADDR_ANY

关于c - 在 win32 UDP 套接字应用程序中无法从 UDP 服务器接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29300746/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com