}
Когда нажимаю на кнопку, то как и надо появляется сообщение OK connect,
а вот как принять сообщение от sa.Send? Т.е. моя прога как бы себе посылает сообщение,
знаю что нужно использовать accept и recieve, но вот не знаю как это использовать .
Необходима что бы она себе передала Hello World и вывела AfxMessageBox Hello World.
Помогите пожалуйста.
Здравствуйте, -SS-, Вы писали:
SS>вообщем создаю сокет SS>WSADATA WsaData; SS>SOCKET s; SS>SOCKET s1; SS>CSocket sa; SS>SOCKADDR_IN sin; SS>BOOL CMyDialog::OnInitDialog() SS>{ SS> CDialog::OnInitDialog(); SS> int err = WSAStartup (0x0101, &WsaData); SS> if (err == SOCKET_ERROR) SS> { SS> AfxMessageBox("error socket"); SS> return 1; SS> } SS> s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); SS> sin.sin_family = AF_INET; SS> sin.sin_port = htons(8423); SS> sin.sin_addr.s_addr = INADDR_ANY; SS> err = bind( s, (LPSOCKADDR)&sin, sizeof(sin) ); SS> err = listen( s, SOMAXCONN);
SS>} SS>Делаю кнопку на диалоге SS>void CMyDialog::OnBUTTON7() SS>{ SS> sa.Create(); SS> if (sa.Connect("192.168.10.1",8423)) SS> { SS> AfxMessageBox("Ok connect "); SS> } SS> else SS> AfxMessageBox("Error Connect"); SS> CString buffer = " Hello World"; SS> sa.Send(buffer, 500, 0); SS> sa.Close();
SS>} SS>Когда нажимаю на кнопку, то как и надо появляется сообщение OK connect, SS>а вот как принять сообщение от sa.Send? Т.е. моя прога как бы себе посылает сообщение, SS>знаю что нужно использовать accept и recieve, но вот не знаю как это использовать . SS>Необходима что бы она себе передала Hello World и вывела AfxMessageBox Hello World. SS>Помогите пожалуйста.
извините, а можно без потоков(если можно), а то я только начинаю и приведённый выше код не догнал и не заработал он , как нибудь попроще и понаглядней можно?
Я проверил вот этот код, у меня заработало.Он несколько отличается от предыдущего, но все еще использует отдельный поток для установления соединения и получения данных. Почему я предложил отдельный поток? Дело в том, что когда просто создаешь сокет, он по умолчанию блокирующий, и если вызвать функцию accept() в главном потоке, она просто напросто заблокирует его, и обработчик нажатия на кнопку никогда не вызовется (если я не ошибаюсь, если ошибаюсь, то напишите кто-нибудь, дабы развеять мое заблуждение, сам не проверял). Можно, конечно, создать неблокирующий сокет. Но как это поможет в данном случае, сразу не соображу.
Здравствуйте, sa83, Вы писали:
S>Я проверил вот этот код, у меня заработало.Он несколько отличается от предыдущего, но все еще использует отдельный поток для установления соединения и получения данных. Почему я предложил отдельный поток? Дело в том, что когда просто создаешь сокет, он по умолчанию блокирующий, и если вызвать функцию accept() в главном потоке, она просто напросто заблокирует его, и обработчик нажатия на кнопку никогда не вызовется (если я не ошибаюсь, если ошибаюсь, то напишите кто-нибудь, дабы развеять мое заблуждение, сам не проверял). Можно, конечно, создать неблокирующий сокет. Но как это поможет в данном случае, сразу не соображу. S>
Спасибо, помогло, но вот только сообщение можно отправить всего одни раз, т.е. при повторном нажатии на кнопу больше ни чего не происходит, как это побороть?
Здравствуйте, -SS-, Вы писали:
SS>Здравствуйте, sa83, Вы писали:
S>>Я проверил вот этот код, у меня заработало.Он несколько отличается от предыдущего, но все еще использует отдельный поток для установления соединения и получения данных. Почему я предложил отдельный поток? Дело в том, что когда просто создаешь сокет, он по умолчанию блокирующий, и если вызвать функцию accept() в главном потоке, она просто напросто заблокирует его, и обработчик нажатия на кнопку никогда не вызовется (если я не ошибаюсь, если ошибаюсь, то напишите кто-нибудь, дабы развеять мое заблуждение, сам не проверял). Можно, конечно, создать неблокирующий сокет. Но как это поможет в данном случае, сразу не соображу. S>>
SS>Спасибо, помогло, но вот только сообщение можно отправить всего одни раз, т.е. при повторном нажатии на кнопу больше ни чего не происходит, как это побороть?
"Загони" recv() в бесконечный цикл, но надо в таком случае правильно закончить поток, а то он будет висеть
Здравствуйте, sa83, Вы писали:
S>Здравствуйте, -SS-, Вы писали:
SS>>Здравствуйте, sa83, Вы писали:
S>>>Я проверил вот этот код, у меня заработало.Он несколько отличается от предыдущего, но все еще использует отдельный поток для установления соединения и получения данных. Почему я предложил отдельный поток? Дело в том, что когда просто создаешь сокет, он по умолчанию блокирующий, и если вызвать функцию accept() в главном потоке, она просто напросто заблокирует его, и обработчик нажатия на кнопку никогда не вызовется (если я не ошибаюсь, если ошибаюсь, то напишите кто-нибудь, дабы развеять мое заблуждение, сам не проверял). Можно, конечно, создать неблокирующий сокет. Но как это поможет в данном случае, сразу не соображу. S>>>
SS>>Спасибо, помогло, но вот только сообщение можно отправить всего одни раз, т.е. при повторном нажатии на кнопу больше ни чего не происходит, как это побороть? S>"Загони" recv() в бесконечный цикл, но надо в таком случае правильно закончить поток, а то он будет висеть
Т.е. как правильно закончить поток? Я вот сделал так:
UINT receiveThread(LPVOID lParam){
SOCKET socket;
sockaddr_in sockAddr;
int lenSockAddr=sizeof(sockAddr);
while (TRUE) { // это добавил
if((socket=accept(s,(LPSOCKADDR)&sockAddr,&lenSockAddr))!=INVALID_SOCKET)
{
recv(socket,receiveBuffer,sizeof(receiveBuffer),0);
CString str;
str.Format("%s",receiveBuffer);
AfxMessageBox(str);
//m_edit1.SetWindowText(str); // это не работает
}
} // и это добавил
return 1;
}
вроде (3*тьфу) работает
Уменя ещё один вопросик
Вообщем у меня на диалоге 2 EditBox m_edit и m_edit1. Из m_edit берётся текст и посылается
, после того как его примет поток мне нужно вывести принятый текст в m_edit1. Добавил это
m_edit1.SetWindowText(str); — всё без проблем откомпилелось, запускаю, посылаю текст, текст приходит и сразу прям ошибка(на том шаге когда в editbox текст выводить надо было) с тремя вариантами ответа Прервать Повтор Пропустить. Помогите плиз и с этой задачкой .
SS>Вообщем у меня на диалоге 2 EditBox m_edit и m_edit1. Из m_edit берётся текст и посылается SS>, после того как его примет поток мне нужно вывести принятый текст в m_edit1. Добавил это SS>m_edit1.SetWindowText(str); — всё без проблем откомпилелось, запускаю, посылаю текст, текст приходит и сразу прям ошибка(на том шаге когда в editbox текст выводить надо было) с тремя вариантами ответа Прервать Повтор Пропустить. Помогите плиз и с этой задачкой .
Ну в общем, понятно. Потоковая функция у тебя верно глобальная или статическая функция-член, в которой ты не имеешь права обращаться к полям твоего класса. Предлагаю сделать так:
Здравствуйте, -SS-, Вы писали:
SS>Когда нажимаю на кнопку, то как и надо появляется сообщение OK connect, SS>а вот как принять сообщение от sa.Send? Т.е. моя прога как бы себе посылает сообщение, SS>знаю что нужно использовать accept и recieve, но вот не знаю как это использовать . SS>Необходима что бы она себе передала Hello World и вывела AfxMessageBox Hello World.
В вашем случае возможно было бы удобнее использовать асинхронные сокеты. см. MSDN: WSAAsyncSelect.
Удобнее, в плане того, что есть окна, которые могут получать сообщения.