2024年4月28日发(作者:)
wsasend 使用示例
`WSASend`是一个Windows平台的网络编程函数,用于向网络发送数据。它支持一次性
发送多个数据缓冲区的请求,每个缓冲区的数据会被填充到`WSABUF`结构体中,并传递给
`WSASend`函数,同时提供缓冲区的数量。
以下是一个`WSASend`函数的使用示例:
```cpp
#include
#include
#include
#include
#define DATA_BUFSIZE 4096
#define SEND_COUNT 10
// 定义一个结构体数组,用于存储每个缓冲区的数据
struct WSABUF DataBuf[SEND_COUNT];
// 初始化结构体数组
void __cdecl initBuffers() {
int i;
for (i = 0; i < SEND_COUNT; i++) {
DataBuf[i].len = DATA_BUFSIZE;
DataBuf[i].buf = buffer;
}
}
// 主函数
void __cdecl main() {
WSADATA wsd;
struct addrinfo *result = NULL, hints = ;
WSAOVERLAPPED SendOverlapped = ;
SOCKET ListenSocket = INVALID_SOCKET, AcceptSocket = INVALID_SOCKET;
WSABUF *Buffers = DataBuf;
DWORD SendBytes, Flags;
char buffer(DATA_BUFSIZE);
int err, rc, i;
// 加载 Winsock
rc = WSAStartup(MAKEWORD(2, 2), &wsd);
if (rc != 0) {
fprintf(stderr, "Unable to load Winsock: %dn", rc);
return;
}
// 初始化提示以获取 IPv4 的通配符绑定地址
_family = AF_INET;
_socktype = SOCK_STREAM;
_protocol = IPPROTO_TCP;
_flags = AI_PASSIVE;
// 获取地址信息
rc = getaddrinfo(NULL, "27015", &hints, &result);
if (rc != 0) {
fprintf(stderr, "getaddrinfo failed: %dn", rc);
return;
}
// 创建套接字
ListenSocket
result->ai_protocol);
if (ListenSocket == INVALID_SOCKET) {
fprintf(stderr, "socket failed: %dn", WSAGetLastError());
freeaddrinfo(result);
return;
}
// 绑定套接字
= socket(result->ai_family, result->ai_socktype,
rc = bind(ListenSocket, result->ai_addr, (int)result->ai_addrlen);
if (rc == SOCKET_ERROR) {
fprintf(stderr, "bind failed: %dn", WSAGetLastError());
freeaddrinfo(result);
closesocket(ListenSocket);
return;
}
// 监听连接请求
rc = listen(ListenSocket, 1);
if (rc == SOCKET_ERROR) {
fprintf(stderr, "listen failed: %dn", WSAGetLastError());
freeaddrinfo(result);
closesocket(ListenSocket);
return;
}
// 接受传入的连接请求
AcceptSocket = accept(ListenSocket, NULL, NULL);
if (AcceptSocket == INVALID_SOCKET) {
fprintf(stderr, "accept failed: %dn", WSAGetLastError());
freeaddrinfo(result);
closesocket(ListenSocket);
return;
}
printf("");
// 创建事件句柄并设置重叠结构
= WSACreateEvent();
if ( == NULL) {
fprintf(stderr, "WSACreateEvent failed: %dn", WSAGetLastError());
freeaddrinfo(result);
closesocket(ListenSocket);
closesocket(AcceptSocket);
return;
}
// 初始化数据缓冲区
initBuffers();
// 发送数据
for (i = 0; i < SEND_COUNT; i++) {
rc = WSASend(AcceptSocket, &Buffers[i], 1, &SendBytes, Flags,
&SendOverlapped, NULL);
if (rc == WSA_IO_PENDING) {
printf("Send ");
}
else if (rc == 0) {
printf("Send failed: %dn", WSAGetLastError());
}
else {
printf("Send complete: %lu bytesn", SendBytes);
}
}
// 关闭套接字
closesocket(ListenSocket);
closesocket(AcceptSocket);
}
```
在上述示例中,首先加载了`Winsock`,然后初始化了一个`WSABUF`结构体数组,用于
存储要发送的数据。接下来,创建了一个套接字,并绑定到指定的端口上进行监听。然后,
接受传入的连接请求,并创建了一个事件句柄和重叠结构。最后,使用`WSASend`函数发送
数据,并根据返回值进行相应的处理。
需要注意的是,`WSASend`函数发送的数据可能不会立即被发送出去,而是被缓存在系
统中,并在适当的时候发送出去。因此,在使用`WSASend`函数发送数据后,需要检查返回
值以确定数据是否已经成功发送。


发布评论