Сейчас на форуме: asfa, bartolomeo, hgdagon (+6 невидимых) |
eXeL@B —› Программирование —› Вопрос по сокетам. Синхронный обмен пакетами с сервером |
Посл.ответ | Сообщение |
|
Создано: 22 февраля 2006 14:00 · Поправил: Модератор · Личное сообщение · #1 Привет всем. Пишу SMTP клиент. Не знаю как сделать синхронизацию передачи данных с сервером. Нужно, чтобы по факту передачи данных возникало событие или ещё что-нибудь в этом роде. В The Bat использовались API setsockopt и select. А также использовалась API - WaitForSingleObject. Может у кого-нибудь есть описание setsockopt и select (хорошо бы с примерами). Просьба в MSDN не тыкать. |
|
Создано: 22 февраля 2006 20:49 · Личное сообщение · #2 |
|
Создано: 22 февраля 2006 20:57 · Личное сообщение · #3 |
|
Создано: 22 февраля 2006 21:05 · Поправил: Ara · Личное сообщение · #4 |
|
Создано: 22 февраля 2006 22:41 · Личное сообщение · #5 |
|
Создано: 22 февраля 2006 23:07 · Личное сообщение · #6 |
|
Создано: 23 февраля 2006 00:34 · Личное сообщение · #7 NetSpider пишет: Нужно, чтобы по факту передачи данных возникало событие или ещё что-нибудь в этом роде. А ты хочешь использовать blocking или non-blocking вызовы? В самом простом варианте вызываешь int32 result = send(m_hSocket, sData.c_str(), sData.size(), 0); который не возвращается пока данные не ушли (blocking calls). Если не хочешь подвешивать GUI во время отправки, то запихиваешь сокетный код в отдельный поток, и делаешь PostMessage(), главный поток ловит message и обнавляет GUI. |
|
Создано: 25 февраля 2006 22:37 · Поправил: NetSpider · Личное сообщение · #8 Я уже все реализовал через select(). Написал отдельный класс SMTP клиента на СИ. Спасибо за помощь. Вот фрагмент, чтобы таких вопросов не возникало. BOOL WINAPI TMailSMTP::SendDataToServer(char *DataBuffer) { timeval tmval; fd_set fdst; tmval.tv_sec=1; tmval.tv_usec=0; fdst.fd_count=1; fdst.fd_array[0]=Sock; if (select(0,NULL,&fdst,NULL,&tmval)==SOCKET_ERROR){ FreeConnect(); return FALSE; }; //Send message to host if (send(Sock,DataBuffer,strlen(DataBuffer),0)==SOCKET_ERROR){ FreeConnect(); return FALSE; }; return TRUE; } BOOL WINAPI TMailSMTP::RecieveDataFromServer(char *DataBuffer) { int recvlen; timeval tmval; fd_set fdst; tmval.tv_sec=1; tmval.tv_usec=0; fdst.fd_count=1; fdst.fd_array[0]=Sock; if (select(0,&fdst,NULL,NULL,&tmval)==SOCKET_ERROR){ FreeConnect(); return FALSE; }; //Recieve ready message from smtp if ((recvlen = recv(Sock,DataBuffer,MAX_PATH,0))==SOCKET_ERROR){ FreeConnect(); return FALSE; }; DataBuffer[recvlen+1]=0; return TRUE; } BOOL WINAPI TMailSMTP::FreeConnect() { closesocket(Sock); WSACleanup(); return TRUE; } |
eXeL@B —› Программирование —› Вопрос по сокетам. Синхронный обмен пакетами с сервером |