IOCP WSASend()

来源:互联网 发布:王坚阿里云纷争马云 编辑:程序博客网 时间:2024/06/06 00:20

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 0