IOCP WSASend()

WSASend 函数: 在一个已连接的套接口上发送数据


简述

语法

	int WSASend(
		SOCKET s,
		LPWSABUF lpBuffers,
		DWORD dwBufferCount,
		LPDWORD lpNumberOfBytesSent,
		DWORD dwFlags,
		LPWSAOVERLAPPED lpOverlapped,
		LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
		);
参数

    s: 表示一个已连接套接口的秒数字

    lpBuffers:                                一个指向WSABUF结构数组的指针。 每个WSABUF结构包含缓冲区的指针和传冲去的大小。

    dwBufferCount:                     lpBuffers数组中WSABUF结构的数目。

    lpNumberOfBytesSent:        如果发送操作立即完成,则为一个指向所发送数据字节数的指针。

    dwFlags:                                 标志位

    lpOverLapped:                      指向WSAOVERLAPPED结构的指针(对于非重叠套接口则忽略)

   lpCompletionRoutine:          一个指向发送操作完成后调用的完成例程指针。(对于非重叠套接口则忽略)


返回值

    若无错误发生且发送操作立即完成, 则WSASend()函数返回0。 这时,完成例程应该已经被调用,一旦调用线程处于alertable状态时就会调用它。 负责 返回SOCKET_ERROR。 通过WSAGetLastError获得详细的错误代码。 WSA_IO_PENDING这个错误吗表示重叠操作已经提交成功(就是异步IO的意思)。稍后会提示完成。其他的错误代码都代表重叠操作没有正确开始。也不会有完成标志出现


评价

   WSASend覆盖标准的send函数,并在下面两个方面有所增强:

    1、它可以用于overlapped socket(重叠socket)上以进行重叠发送的擦做(简单地理解为就是异步send也可以了)

    2、它可以一次发送多个缓冲区中的数据来进行集中写入。应该相当于unix上的writev,好处看来是避免Nagle算法。

   WSASend用于在一个面向连接的socket(第一个参数s)上发出的数据

    对于overlapped sockets来说(通过WSASocket函数, 用WSA_FLAG_OVERLAPPED标识创建),发送消息时使用的是重叠IO, 除非lpOverlapped and lpCompletionRoutine都是NULL。 这时这个socket被视为非重叠的socket。 当所有的缓冲区都被发送完了, 将会执行一个动作来表示操作完成, 这个动作可能是调用完成例程或者是引发一个event对象。 如果操作没有立即完成, 最终的完成状态通过完成例程或者WSAGetOverlappedResult得到

    对于非重叠的sockets来说, 最后两个参数被忽略, WSASend和send具有相同的语意。 数据从用户缓冲区拷贝到发送缓冲区中应该是指系统的socket对战, 如果socket是非阻塞的又是同时是面向流的,同时发送缓冲区没有足够的大小,WSASend将只发送用户缓冲区中的部分数据。 如果同样缓存大小, 而socket是阻塞的socket, WSASend将阻塞直到用户所有的数据被发送成功。


操作

    Overlapped Socket I/O

    如果重叠操作立即完成, WSASend返回0 同时设置lpNumberOfBytesSent指向的变量为发送的字节数。 如果重叠操作成功初始化将稍后完成, WSASend返回SOCKET_ERROR同时设置错误吗为WSA_IO_PENDING。 这时 lpNumberOfBytesSent指向的变量不会被更新。  当重叠IO完成以后,发送的数量可以用两种方式取得:如果制定了完成例程,那么通过完成例程cbTransferred参数得到, 也可以调用WSAGetOverlappedResult, 通过lpcbTransfer得到。



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值