Win32 асинхронные сокеты основной вопрос - PullRequest
0 голосов
/ 31 декабря 2010

Я провел голосовой чат клиент-сервер (например, ventrilo) в C # и сейчас делаю это в неуправляемом win32 c ++. У меня есть вопрос о том, как асинхронные чтения / записи обрабатываются в C ++. В C # у вас была функция, которая вызывалась (EndSend / EndRecieve), как только BeginSend / BeginRecieve были сделаны. Как это делается в 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, не должно ли оно получить его, как только клиент подключен? Я могу отправить () и recv (), поэтому соединение определенно установлено.

Ответы [ 2 ]

3 голосов
/ 31 декабря 2010

взгляните на Boost Asio library .даже если вам не нужно кроссплатформенное решение, Asio - отличная библиотека C ++, которая предоставляет асинхронные сокеты. пример асинхронного чтения / записи

2 голосов
/ 31 декабря 2010

и если вы не хотите иметь дело с Asio, вот хороший учебник об асинхронных сокетах: http://www.gamedev.net/reference/programming/features/asyncsock/

...