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`函数发送数据后,需要检查返回

值以确定数据是否已经成功发送。