【问题标题】:Win32 asynchronous sockets basic questionWin32 异步套接字基本问题
【发布时间】:2011-06-01 19:41:31
【问题描述】:

我已经在 C# 中完成了客户端-服务器语音聊天(如 ventrilo),现在正在非托管 win32 c++ 中进行。我有一个关于如何在 c++ 中处理异步读/写的问题。在 C# 中,一旦 BeginSend/BeginRecieve 完成,就会调用一个函数 (EndSend/EndRecieve)。这是如何在 C++ 中完成的?我查看了 msdn 和谷歌搜索,但找不到答案。

以下是按下按钮时运行的示例代码,触发调用此函数的 WM_WRITE 消息:

[...]
case ID_BUTTON_SEND:
    SendMessage(hWnd,SOCKET_TCP,0,FD_WRITE);
    break;

[....]
case FD_WRITE:
      onTextSend()
      break;
[....]

void onSendText(HWND hWnd) {
// get window handle to send edit control
HWND hWndSend = GetDlgItem(hWnd,ID_EDIT_SEND);

// get textlength of send edit control
int textlen = GetWindowTextLength(hWndSend);

// allocate memory for a buffer that will contains the text to be sent and get the text
char* textbuff = (char*)malloc(textlen+1);
SendMessage(hWndSend,WM_GETTEXT,textlen+1,(LPARAM)textbuff);

// send content
send(tcp_sock,textbuff,textlen+1,0);

// cleanup allocated tempbuffer
  free(textbuff);
}

当然,我不想启动异步发送,然后直接释放发送中使用的缓冲区,我想在发送完成后释放它(如 EndSend)。我还没有找到 c++ 的方法,有什么建议吗?

编辑:还有!出于某种原因,当服务器接受客户端时,客户端没有收到 FM_CONNECT 消息,它不应该在客户端连接后立即收到吗?我可以 send() 和 recv() 所以连接肯定是建立起来的。

【问题讨论】:

    标签: c++ winapi sockets asynchronous tcp


    【解决方案1】:

    看看Boost Asio library。即使你不需要跨平台解决方案,Asio 也是很棒的 C++ 提供异步套接字的库。 an example of asynchronous read/write

    【讨论】:

      【解决方案2】:

      如果你不想处理 Asio,这里有一个关于异步套接字的好教程:http://www.gamedev.net/reference/programming/features/asyncsock/

      【讨论】:

      • 我更喜欢使用winsock,本教程确实弄清楚了一些事情,但没有弄清楚如何处理发送。基本上现在我只是发送文本。本教程提到 WM_WRITE 对此目的不是很好,那么我该如何处理解除分配该缓冲区的问题呢?还更新了主要问题!
      猜你喜欢
      • 2015-10-27
      • 1970-01-01
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多