【发布时间】: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