Работа с сокетами в MFC - PullRequest
       21

Работа с сокетами в MFC

0 голосов
/ 01 июня 2010

Я пытаюсь создать приложение MFC (клиент), которое подключается к серверу («localhost», порт 1234), сервер отвечает клиенту, а клиент читает из ответа сервера.

Сервер может получать данные от клиента и отправляет ответ обратно в сокет, откуда он их получил, но я не могу прочитать ответ из клиента.

Я делаю CAsyncSocket для соединения с сервером и отправки данных и CAsyncSocket с перегруженными методами onAccet и onReceive для чтения ответа с сервера. Пожалуйста, скажите мне, что я делаю не так.

    class ServerSocket:public CAsyncSocket{
    public:
    void OnAccept(int nErrorCode){
        outputBox->SetWindowTextA("RECEIVED DATA");
        CAsyncSocket::OnAccept(nErrorCode);
    }
};

//in ApplicationDlg I have:

socket.Create();
socket.Connect("127.0.0.1",1234);
socket.Send(temp,strlen(temp));    //this should be sending the initial message

if(!serverSocket.Create())  //this should get the response i guess...
    AfxMessageBox("Could not create server socket");

if(!serverSocket.Listen())
    AfxMessageBox("Could not listen to socket");

Ответы [ 2 ]

1 голос
/ 01 июня 2010

Вы должны знать, что все сетевые операции являются потенциально трудоемкими операциями. Теперь, так как вы используете класс MFC CAsyncSocket, он выполняет все операции асинхронно (не блокирует вас). Но возврат из функции не означает, что она уже завершена.

Давайте посмотрим на следующие строки кода:

socket.Connect("127.0.0.1",1234);
socket.Send(temp,strlen(temp));    //this should be sending the initial message

Первый - это вызов Connect, который, скорее всего, не завершается немедленно. Затем вы звоните Send, но ваш сокет еще не подключен! Он определенно возвращает вам код ошибки, но так как вы не проверяете его возвращаемое значение - вы просто счастливо ждете, чтобы что-то получить.

Итак, следующее правило для вас, мой друг, должно проверять каждые возвращаемое значение для каждой функции, которую вы вызываете, особенно когда речь идет о сети, где ошибки допустимы и часто происходят.

Отправлять сообщения следует только после вызова OnConnect.

0 голосов
/ 01 июня 2010

Во-первых, я не вижу, куда вы отправляете данные клиенту (на сервере).

Во-вторых, Accept () не означает получение данных. Принять означает, что у вас есть новое входящее соединение, для которого вам нужно создать еще один сокет, в который следует отправлять данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...