我正在尝试创建 udp 套接字并通过它发送一个字符串。但它在 sendto() 处给出 10038 错误

Posted

技术标签:

【中文标题】我正在尝试创建 udp 套接字并通过它发送一个字符串。但它在 sendto() 处给出 10038 错误【英文标题】:I am trying to create udp socket and send a string through it. but it gives 10038 error at sendto() 【发布时间】:2016-05-03 09:11:30 【问题描述】:

我是套接字编程的新手。我编写了一个基本函数,它创建一个 UDP 套接字并通过它发送一个数组。我的函数创建一个套接字并在描述符中返回 0,当我使用 sendto() 时它给出 10038 错误。

这是我的代码:

int ret, a=0;
WSADATA wsa;

if (WSAStartup(MAKEWORD(2,2),&wsa) != 0)

    exit(EXIT_FAILURE);


if (m_socket == INVALID_SOCKET)

   m_socket = (AF_INET, SOCK_DGRAM,0);


SOCKADDR_IN addr;
char buf[256];
addr.sin_family=AF_INET;
addr.sin_port=htons(1234);
addr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

strcpy(buf,"Hallo world!");
if (m_socket != INVALID_SOCKET)

 ret=sendto(m_socket,buf,strlen(buf),0,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN));

 if(ret==SOCKET_ERROR)
 
  printf("Fehler: sendto, fehler code: %d\n",WSAGetLastError());
  a=WSAGetLastError();
  ret=-1;
 
 CloseSocket();
 WSACleanup();
 m_socket = INVALID_SOCKET;

【问题讨论】:

错误代码表示“非套接字上的套接字操作。”。文档链接:msdn.microsoft.com/en-us/library/windows/desktop/… 我似乎错过了初始化m_socket的套接字调用。 您省略了对套接字的实际调用:m_socket = socket(AF_INET, SOCK_DGRAM,0);。给定的语法可以编译,因为 C/C++ 中的 () 可以包含被评估的表达式列表,并且整个表达式具有最后一个条目的值,即 (m_socket = (AF_INET, SOCK_DGRAM, 0) 简单地将 0 分配给m_socket。 我在构造函数中将 m_socket 初始化为 m_socket=INVALID_SOCKET 另外 - 如果您打开 winsock.h,您可以看到所有错误代码名称,这些名称应该为正在发生的事情提供更好的线索。宏添加了 10000,因此只需搜索 38 即可找到您的错误。 【参考方案1】:

您的代码有:

m_socket = (AF_INET, SOCK_DGRAM,0);

用于初始化m_socket。这会将0 分配给m_socket,而不是从操作系统分配套接字。因此,您会收到此非套接字错误。

你可能会使用:

m_socket = socket(AF_INET, SOCK_DGRAM,0);

为了掩盖错字。

【讨论】:

如果没有逗号操作符,C 会更好。 是的。我忘记了里面的插座。我从昨天开始就在尝试,想知道为什么这个简单的程序不起作用。 @I004 有时候,错误太明显了,你怎么看都看不出来:) 我可以在同一个项目中编写客户端和服务器程序吗 @I004:这是一个新问题,可能您应该使用适当的上下文信息询问!但基本上,是什么阻止你这样做?但是,根据您的构建环境或 IDE,使用单独的项目可能是有原因的。

以上是关于我正在尝试创建 udp 套接字并通过它发送一个字符串。但它在 sendto() 处给出 10038 错误的主要内容,如果未能解决你的问题,请参考以下文章

Alpakka UDP:如何通过已绑定的套接字响应收到的数据报?

如何在 c++ 和 java 之间通过 udp 有效发送数据数组

发送到:无效参数错误

如何在 iOS swift 中使用 UDP 套接字流式传输音频?

IOS4 - 在 Wifi 上使用 UDP 套接字发送数据

通过 AsyncUDPSocket 发送时崩溃