windows recvfrom c++ 返回-1
时间: 2023-12-29 08:05:13 浏览: 210
在 Windows 平台上,`recvfrom` 函数在发生错误时会返回 `-1`。此时,可以使用 `WSAGetLastError` 函数获取错误码,然后根据错误码进行调试和处理。
以下是一个简单的示例代码,可以用来测试 `recvfrom` 函数的返回值:
```c++
#include <winsock2.h>
#include <iostream>
#define BUF_SIZE 1024
int main() {
// 初始化 Winsock 库
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
std::cerr << "Failed to initialize Winsock." << std::endl;
return 1;
}
// 创建套接字
SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sock == INVALID_SOCKET) {
std::cerr << "Failed to create socket." << std::endl;
WSACleanup();
return 1;
}
// 绑定端口
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(1234);
addr.sin_addr.s_addr = htonl(INADDR_ANY);
if (bind(sock, (sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) {
std::cerr << "Failed to bind socket." << std::endl;
closesocket(sock);
WSACleanup();
return 1;
}
// 接收数据
char buf[BUF_SIZE];
sockaddr_in clientAddr;
int clientAddrLen = sizeof(clientAddr);
int recvLen = recvfrom(sock, buf, BUF_SIZE, 0, (sockaddr*)&clientAddr, &clientAddrLen);
if (recvLen == SOCKET_ERROR) {
int errCode = WSAGetLastError();
std::cerr << "Failed to receive data: " << errCode << std::endl;
closesocket(sock);
WSACleanup();
return 1;
}
// 输出接收到的数据
buf[recvLen] = '\0';
std::cout << "Received data: " << buf << std::endl;
// 关闭套接字
closesocket(sock);
WSACleanup();
return 0;
}
```
如果 `recvfrom` 函数返回 `-1`,则可以根据错误码进行调试和处理。常见的错误码包括:
- `WSAECONNRESET`:连接被重置,通常是对方已经关闭了连接。
- `WSAEINTR`:函数被信号中断。
- `WSAEINVAL`:参数无效。
- `WSAEMSGSIZE`:接收到的消息太大,无法放入缓冲区。
- `WSAEWOULDBLOCK`:套接字处于非阻塞模式,没有数据可用。
- `WSANOTINITIALISED`:未初始化 Winsock 库。
根据具体的错误码,可以采取不同的处理方式,例如重新尝试接收数据、关闭套接字等。
阅读全文