windows c++ socket send 总是经常返回-1,请给正确的处理的c++代码
时间: 2024-03-07 08:47:34 浏览: 122
以下是处理`send`函数返回-1的C++代码示例:
```c++
// 创建套接字
SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET) {
printf("Create socket failed with error code: %d\n", WSAGetLastError());
return 1;
}
// 连接到目标主机
struct sockaddr_in serverAddr;
memset(&serverAddr, 0, sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_addr.s_addr = inet_addr("目标主机IP地址");
serverAddr.sin_port = htons(目标主机端口号);
if (connect(sock, (struct sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) {
printf("Connect failed with error code: %d\n", WSAGetLastError());
closesocket(sock);
return 1;
}
// 发送数据
const char* sendData = "Hello, world!";
int sendLen = strlen(sendData);
while (sendLen > 0) {
int ret = send(sock, sendData, sendLen, 0);
if (ret == SOCKET_ERROR) {
printf("Send data failed with error code: %d\n", WSAGetLastError());
closesocket(sock);
return 1;
}
else if (ret == 0) {
printf("Send buffer is full\n");
Sleep(1000); // 等待1秒后重试发送
}
else {
sendData += ret;
sendLen -= ret;
}
}
// 关闭套接字
closesocket(sock);
```
在上面的代码中,我们通过调用`send`函数来发送数据,并且在`send`函数返回-1时,通过调用`WSAGetLastError`函数来获取具体的错误代码并进行适当的处理。如果`send`函数返回0,则表示发送缓冲区已满,我们可以通过等待一段时间后重试发送来解决这个问题。
需要注意的是,在使用`send`函数发送数据时,我们可能需要对发送缓冲区和网络连接进行适当的调整和优化,以避免出现发送缓冲区已满的情况。同时,我们也需要对`WSAGetLastError`函数返回的错误代码进行适当的处理,以确保程序的稳定性和可靠性。
阅读全文