virtual int Send(
const void* lpBuf,
int nBufLen,
int nFlags = 0);
Dialog中Socket设置AsyncSelect(FD_WRITE),触发虚函数OnSend(),之后调用Send()发送消息。
参数
lpBuf
包含要传输的数据的缓冲区。
nBufLen
中的数据的长度lpBuf
以字节为单位。
nFlags
指定在其中进行调用的方式。 此函数的语义由套接字选项和nFlags
参数。 后者通过组合构成的以下值中任意使用 c + +OR
运算符︰
MSG_DONTROUTE数据应该不会受到路由的指定。 Windows 套接字供应商可以选择忽略此标志。
MSG_OOB发送带外数据 ( SOCK_STREAM仅)。
返回值
如果没有出现错误,发送返回发送字符的总数。 (请注意,这可以是由指示的数字小于nBufLen
。)否则为值为SOCKET_ERROR返回,并且可以通过调用检索特定的错误代码GetLastError。 以下错误适用于该成员函数︰
WSANOTINITIALISED成功AfxSocketInit使用此 API 之前必须发生。
WSAENETDOWN Windows 套接字实现检测到的网络子系统失败。
WSAEACCES请求的地址是广播的地址,但未设置适当的标志。
返回 WSAEINPROGRESS正在阻塞的 Windows 套接字操作。
WSAEFAULT
lpBuf
参数不是用户地址空间的有效部分。WSAENETRESET必须重置该连接,因为 Windows 套接字实现将其删除。
WSAENOBUFS
Windows 套接字实现报告缓冲区死锁。WSAENOTCONN套接字未连接。
WSAENOTSOCK描述符不是一个套接字。
WSAEOPNOTSUPP MSG_OOB指定了,但对套接字类型不是SOCK_STREAM。
WSAESHUTDOWN的套接字关闭; 不能调用发送后套接字上
ShutDown
已调用了与nHow
设置为 1 或 2。WSAEWOULDBLOCK套接字被标记为非阻塞和所请求的操作将阻塞。
WSAEMSGSIZE套接字是类型的SOCK_DGRAM,并且大于支持的 Windows 套接字实现最大数据报。
WSAEINVAL尚未与绑定套接字绑定。
WSAECONNABORTED由于超时或其他故障虚拟线路已中止。
WSAECONNRESET虚拟线路已重置的远程端。
virtual void OnSend( int nErrorCode );
// CMyAsyncSocket is derived from CAsyncSocket and defines the // following variables: // CString m_sendBuffer; //for async send // int m_nBytesSent; // int m_nBytesBufferSize; void CMyAsyncSocket::OnSend(int nErrorCode) { while (m_nBytesSent < m_nBytesBufferSize) { int dwBytes; if ((dwBytes = Send((LPCTSTR)m_sendBuffer + m_nBytesSent, m_nBytesBufferSize - m_nBytesSent)) == SOCKET_ERROR) { if (GetLastError() == WSAEWOULDBLOCK) { break; } else { TCHAR szError[256]; _stprintf_s(szError, _T("Server Socket failed to send: %d"), GetLastError()); Close(); AfxMessageBox (szError); } } else { m_nBytesSent += dwBytes; } } if (m_nBytesSent == m_nBytesBufferSize) { m_nBytesSent = m_nBytesBufferSize = 0; m_sendBuffer = _T(""); } CAsyncSocket::OnSend(nErrorCode); }