send函数
send
函数用于将数据发送到已连接的套接字。
int send(
_In_ SOCKET s,
_In_ const char* buf,
_In_ int len,
_In_ int flags
);
s
: 要发送数据的套接字。buf
: 指向包含要发送数据的缓冲区的指针。len
: 缓冲区中要发送的数据的长度,以字节数为单位。flags
: 可选的标志,可以设置为 0。
send
函数返回实际发送的字节数。如果发生错误,返回 SOCKET_ERROR
,你可以通过调用 WSAGetLastError()
函数获取具体的错误代码。
const char* message = "Hello from server!";
int bytesSent = send(clientSocket, message, strlen(message), 0);
if (bytesSent == SOCKET_ERROR) {
printf("Send failed with error: %ld\n", WSAGetLastError());
closesocket(clientSocket);
closesocket(serverSocket);
WSACleanup();
return 1;
} else {
printf("Sent %d bytes of data.\n", bytesSent);
}
在上述代码中,如果 send
函数调用失败,就会输出错误信息并进行一些清理操作,然后返回一个表示错误的值。
recv函数
recv
函数用于从一个已连接的套接字(socket)接收数据。以下是 recv
函数的基本形式:
int recv(int socket, void *buffer, size_t length, int flags);
socket
: 套接字描述符,指定要接收数据的套接字。buffer
: 存储接收数据的缓冲区的指针。length
: 缓冲区的大小,即可以接收的最大字节数。flags
: 通常可以设置为 0。
recv
函数返回接收到的字节数,如果发生错误则返回 -1。下面是一些常见的情况:
- 返回值大于 0:表示成功接收了指定字节数的数据。
- 返回值等于 0:表示对方已经关闭了连接。
- 返回值等于 -1:表示发生了错误。可以使用
errno
变量获取详细的错误信息。
例子:
char buffer[1024];
int bytesRead = recv(clientSocket, buffer, sizeof(buffer), 0);
if (bytesRead > 0) {
// 处理接收到的数据
} else if (bytesRead == 0) {
// 连接已关闭
} else {
// 处理错误,可以查看 errno 变量获取详细信息
perror("recv");
}
注意:在实际的应用中,通常需要在循环中调用 recv
函数,直到接收到足够的数据或者发生错误。这是因为 recv
不保证一次就能接收到指定数量的数据。