C++UDP recvfrom行为异常,WSAGetLastError=10014
C++ UDP recvfrom is acting strange, WSAGetLastError = 10014
我的代码在Windows上表现得很奇怪,但在Linux上工作。。。这是我的服务器。cpp:
#include <cstdio>
#include "packet.h"
#include "socket.h"
int main(int argc, char *argv[])
{
Socket s;
s.bindAt(1337);
for (int i = 0; i < 20; i++) {
Packet p;
int32_t a;
char *b;
int abc = s.receive();
printf("abc = %dn", abc);
printf("error = %dn", WSAGetLastError());
p.getInt(&a);
p.getString(&b);
printf("int = %dnstring = %sn", a, b);
delete[] b;
}
return 0;
}
这是插座。cpp:
Socket::Socket()
{
#ifdef _WIN32
WSADATA wsa;
if (sockNum == 0 && WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
throw 1;
#endif
sock = socket(AF_INET, SOCK_DGRAM, 0);
#ifdef _WIN32
if (sock == INVALID_SOCKET)
#else
if (sock == -1)
#endif
throw 2;
addrlen = 0;
sockNum++;
}
int Socket::bindAt(unsigned short port)
{
struct sockaddr_in sa = { 0 };
memset(&sa, 0, sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_port = htons(port);
sa.sin_addr.s_addr = htonl(INADDR_ANY);
return bind(sock, (struct sockaddr *) &sa, sizeof(sa));
}
ssize_t Socket::receive()
{
ssize_t n;
#ifdef _WIN32
char msg[100];
n = recvfrom(sock,msg, sizeof(msg), 0,(SOCKADDR*) &addr, &addrlen);
#else
n = recvfrom(sock, p->buf, p->bufSize, 0,
(struct sockaddr *) &addr, &addrlen);
#endif
/*if (n < 0)
p->bufSize = 0;
else
p->bufSize = n;*/
return n;
}
基本上是它的标题:
typedef SOCKET socket_t;
typedef int ssize_t;
class Socket
{
public:
socket_t sock;
socklen_t addrlen;
struct sockaddr_in addr;
Socket();
~Socket();
int connect(const char *ip, unsigned short port);
int bindAt(unsigned short port);
ssize_t send(Packet *p);
ssize_t receive();
};
如果我更改recvfrom的最后2个参数,则(SOCKADDR*)&addr和&addrlen为NULL是有效的,但这两个参数有什么问题?
而不是这个:
addrlen = 0;
这样做:
addrlen = sizeof(sockaddr_in)
它应该可以工作,因为您正确地识别了输出地址缓冲区指针的大小。
来自MSDN对WSAEFAULT
(10014)的描述:
系统在尝试使用调用的指针参数时检测到无效的指针地址。如果应用程序传递了无效的指针值,或者缓冲区的长度太小,就会发生此错误。例如,如果参数(sockaddr结构)的长度小于(sockaaddr)的大小。
因此,如果您提供一个未初始化的addrlen
值,它可能太小,从而导致此错误。
如果addr
是NULL
,则表示您不希望填写地址,因此忽略addrlen
。
相关文章:
- win32 select()报告插入()套接字上的例外;wsagetlasterror()= 0
- 为什么std :: string使wsagetlasterror返回零
- 从 IOCP 线程调用 WSAGetLastError() 将返回不正确的结果
- 为什么创建 std::runtime_error 会重置 WSAGetLastError
- WSAGetLastError 10038 in a C++ client
- C++ Bluetooth WSAGetLastError 10108
- 来自WSAGetLastError 10014的C++UDP记录
- C++UDP recvfrom行为异常,WSAGetLastError=10014
- Connect()函数失败wsagetlasterror() 10038