c语言winsock recvfrom
时间: 2024-06-08 09:06:13 浏览: 185
C语言WinSock学习笔记
3星 · 编辑精心推荐
`recvfrom` 函数是 Winsock API 中用于接收网络数据的函数。它的函数原型如下:
```C
int recvfrom(
SOCKET s,
char *buf,
int len,
int flags,
struct sockaddr *from,
int *fromlen
);
```
参数说明如下:
- `s`:要接收数据的套接字。
- `buf`:接收数据的缓冲区。
- `len`:缓冲区长度。
- `flags`:接收数据的方式标志,一般为 0。
- `from`:指向发送方的地址信息结构体的指针。
- `fromlen`:`from` 指针所指向的地址信息结构体的长度。
`recvfrom` 函数的返回值为接收到的字节数,如果返回值为 0,表示对方已经关闭了连接。如果返回值为 SOCKET_ERROR,表示发生了错误,可以用 `WSAGetLastError()` 函数获取错误码。
以下是一个示例代码:
```C
#include <stdio.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
int main()
{
WSADATA wsaData;
int ret = WSAStartup(MAKEWORD(2, 2), &wsaData); // 初始化 Winsock
if (ret != 0)
{
printf("WSAStartup failed: %d\n", ret);
return 1;
}
SOCKET sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (sock == INVALID_SOCKET)
{
printf("socket failed: %d\n", WSAGetLastError());
WSACleanup();
return 1;
}
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(1234);
addr.sin_addr.s_addr = INADDR_ANY;
ret = bind(sock, (SOCKADDR*)&addr, sizeof(addr));
if (ret == SOCKET_ERROR)
{
printf("bind failed: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}
char buf[1024];
struct sockaddr_in from;
int fromlen = sizeof(from);
ret = recvfrom(sock, buf, sizeof(buf), 0, (SOCKADDR*)&from, &fromlen);
if (ret == SOCKET_ERROR)
{
printf("recvfrom failed: %d\n", WSAGetLastError());
closesocket(sock);
WSACleanup();
return 1;
}
printf("Received data from %s:%d, %d bytes: %s\n", inet_ntoa(from.sin_addr), ntohs(from.sin_port), ret, buf);
closesocket(sock);
WSACleanup();
return 0;
}
```
该示例代码创建了一个 UDP 套接字,并绑定到本地的 1234 端口。然后使用 `recvfrom` 函数接收网络数据,并打印接收到的数据、发送方IP地址和端口号。注意,这里使用了 `inet_ntoa` 函数将 `sin_addr` 转换为字符串格式的 IP 地址。
阅读全文