Сейчас на форуме: asfa, bartolomeo, hgdagon (+6 невидимых)

 eXeL@B —› Программирование —› Вопрос по сокетам. Синхронный обмен пакетами с сервером
Посл.ответ Сообщение

Ранг: 39.6 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 22 февраля 2006 14:00 · Поправил: Модератор
· Личное сообщение · #1

Привет всем. Пишу SMTP клиент. Не знаю как сделать синхронизацию передачи данных с сервером.
Нужно, чтобы по факту передачи данных возникало событие или ещё что-нибудь в этом роде.
В The Bat использовались API setsockopt и select. А также использовалась API - WaitForSingleObject.
Может у кого-нибудь есть описание setsockopt и select (хорошо бы с примерами). Просьба в MSDN не тыкать.




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 22 февраля 2006 20:49
· Личное сообщение · #2

Ну что, никто червей мейловых не писал чтоли? Проблема еще актуальна.



Ранг: 352.4 (мудрец), 4thx
Активность: 0.150
Статус: Участник
retired

Создано: 22 февраля 2006 20:57
· Личное сообщение · #3

червей не писал, писал smtp клиента. учился как раз по примерам из msdn




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 22 февраля 2006 21:05 · Поправил: Ara
· Личное сообщение · #4

ssx
Ну может приватно сорсами поделишься? =) Урезаными, если жалко полные... Интересует только отправка почты..




Ранг: 221.8 (наставник)
Активность: 0.150
Статус: Участник

Создано: 22 февраля 2006 22:41
· Личное сообщение · #5

у меня есть примеры какието вообщем общий принцип понятен я думаю ;)

c5ad_troyan1.rar.zip




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 22 февраля 2006 23:07
· Личное сообщение · #6

На ВАСМЕ же был пример про отправку почты на асме по smtp.




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 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.



Ранг: 39.6 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 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 —› Программирование —› Вопрос по сокетам. Синхронный обмен пакетами с сервером
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати