我正在尝试创建 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 有效发送数据数组