Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.191.5.239] |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
вот проект-примерчик созданный на данном коде (VC9.0):
сначала происходит инициализация сервера, потом клиента, потом серверу посылаются числа 10, 20, 30 ничего не происходит - они не доходят адрес 127.0.0.1:1234 Прикреплённый файлclient_server.zip (8.21 Кбайт, скачиваний: 171) |
Сообщ.
#17
,
|
|
|
а accept где?
|
Сообщ.
#18
,
|
|
|
1. Не рекомендуется убивать поток извне
if (::WaitForSingleObject(m_hClientServerThread, 2000) == WAIT_TIMEOUT) ::TerminateThread(m_hClientServerThread, 0); 2. А где сопоставление сокета и Eventa? По моему, должно быть как-то так: Event = WSACreateEvent(); WSAEventSelect(Sock, Event, (FD_READ | FD_WRITE)); А в цикле: DWORD ret = WaitForMultipleObjects(3, evEvents, FALSE, INFINITE); status = WSAEnumNetworkEvents(Sock, SockEvent, &NetworkEvents); if (status == SOCKET_ERROR) { // ошибка DebugBreak(); } else { if ((NetworkEvents.lNetworkEvents & FD_READ) && (NetworkEvents.iErrorCode[FD_READ_BIT] == 0)) { // есть данные для чтения - читаем status = RecvHandler(port); } if ((NetworkEvents.lNetworkEvents & FD_WRITE) && (NetworkEvents.iErrorCode[FD_WRITE_BIT] == 0)) { // возможна запись в сокет - записываем status = XmitHandler(port); } } Добавлено 1. Не рекомендуется убивать поток извне if (::WaitForSingleObject(m_hClientServerThread, 2000) == WAIT_TIMEOUT) ::TerminateThread(m_hClientServerThread, 0); 2. А где сопоставление сокета и Eventa? По моему, должно быть как-то так: Event = WSACreateEvent(); WSAEventSelect(Sock, Event, (FD_READ | FD_WRITE)); А в цикле: ... DWORD ret = WaitForSingleeObject(Event, FALSE, INFINITE); ... status = WSAEnumNetworkEvents(Sock, SockEvent, &NetworkEvents); if (status == SOCKET_ERROR) { // ошибка DebugBreak(); } else { if ((NetworkEvents.lNetworkEvents & FD_READ) && (NetworkEvents.iErrorCode[FD_READ_BIT] == 0)) { // есть данные для чтения - читаем status = RecvHandler(); } if ((NetworkEvents.lNetworkEvents & FD_WRITE) && (NetworkEvents.iErrorCode[FD_WRITE_BIT] == 0)) { // возможна запись в сокет - записываем status = XmitHandler(); } } |
Сообщ.
#19
,
|
|
|
потоки - это все мелочи
в конце концов они не влияют на работоспособность остального кода главный вопрос - почему код не работает как надо Добавлено popsa, точно ! добавил после Listen accept m_pServerClientSocket2 = accept(m_pServerClientSocket, NULL, NULL); и send переделал в nNetOpResult = send(m_pServerClientSocket2, (char*)&szDataSize, sizeof(szDataSize), 0); все равно не работает Добавлено о - заработало 1) пришлось и инициализацию сервера сунуть в отдельный поток (чтобы не висеть на accept) 2) при неудачном recv не выходить из потока а крутиться в цикле теперь надо по-умному потоки прикрутить |