Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

SMTP-клиент на WinSock API

383
22 ноября 2005 года
zoh
237 / / 03.04.2005
Вот код

Код:
//////////////////
  WSADATA *wData;
  SOCKET sServerListen;
  sockaddr_in server_addr;
  char sRecvBuff;
  AnsiString TempStr;
  int i, iRet;
  //////////////////
  mmLog->Clear();

  /////// Загрузка WinSock
  if (WSAStartup(MAKEWORD(1,1), wData) != 0)
  {
    MessageBox(0,"","",0);
  }

  /////// Создание Сокета
  sServerListen = socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
  if (sServerListen == INVALID_SOCKET)
  {
    MessageBox(0,"","",0);
  }

  //Заполнение структуры адреса
  server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  server_addr.sin_family = AF_INET;
  server_addr.sin_port = htons(StrToInt(edPort->Text));
  server_addr.sin_addr = LookUpName(edServer->Text);

if (connect(sServerListen, server_addr, sizeof(server_addr))) == SOCKET_ERROR)
{
  /////////////
}



в функции конект выдаёт ошибку.
406
22 ноября 2005 года
vitaly2003s
481 / / 27.07.2004
попробуй создать сокет не используя протокол IP.используй ТСP:
socket(AF_INET, SOCK_STREAM, 0);

Думаю ошибка исчезнет.
383
23 ноября 2005 года
zoh
237 / / 03.04.2005
Ошибка ещё в LookupName тобиш он не знает что такое.
А в конект выдаёт что не знает
[C++ Error] Unit1.cpp(50): E2034 Cannot convert 'sockaddr_in' to 'int'

[C++ Error] Unit1.cpp(50): E2342 Type mismatch in parameter 'type' (wanted 'int', got 'sockaddr_in')

попробуй в Сишку вставь посмотри.
1
23 ноября 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by zoh
Вот код

 
Код:
//////////////////
  server_addr.sin_addr = LookUpName(edServer->Text);

if (connect(sServerListen, server_addr, sizeof(server_addr))) == SOCKET_ERROR)
{
  /////////////
}



в функции конект выдаёт ошибку.


 
Код:
server_addr.sin_addr = inet_addr(edServer->Text.c_str());

if (connect(sServerListen, (LPSOCKADDR)&server_addr, sizeof(server_addr))) == SOCKET_ERROR)
383
23 ноября 2005 года
zoh
237 / / 03.04.2005
Если тебе не трудно ответь что значит
 
Код:
(LPSOCKADDR)&...
1
23 ноября 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by zoh
Если тебе не трудно ответь что значит
 
Код:
(LPSOCKADDR)&...


Функции необходимо передавать указатель на структуру. Это всего навсего явное приведение к типу указателя на структуру адреса.
(Во сказал... :) )

383
23 ноября 2005 года
zoh
237 / / 03.04.2005
 
Код:
server_addr.sin_addr = inet_addr(edServer->Text.c_str());


[C++ Error] Unit1.cpp(48): E2034 Cannot convert 'unsigned long' to 'in_addr'

Выдаёт такую ошибку.
1
24 ноября 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by zoh
 
Код:
server_addr.sin_addr = inet_addr(edServer->Text.c_str());


[C++ Error] Unit1.cpp(48): E2034 Cannot convert 'unsigned long' to 'in_addr'

Выдаёт такую ошибку.


Было бы странно если бы он смог. Извини замотался примерно надо такое:

 
Код:
server_addr.sin_addr.s_addr  = inet_addr(edServer->Text.c_str());

При условии что веден адрес а не имя.
243
24 ноября 2005 года
pacific_7
1.9K / / 06.09.2004
Глянь сюда: http://www.insidepro.com/kk/006/006r.shtml - более менее толково расписано, только я бы не стал там всему безоговорочно верить. Но исходники рабочие.
383
25 ноября 2005 года
zoh
237 / / 03.04.2005
Код:
String GetLocalHost (void)
{
   char sh[256];
   if (gethostname(sh, 255)==0)    return StrPas(sh);
   else  return  "";
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{ //////////////////
  WSADATA wData;
  SOCKET sServerListen;
  sockaddr_in server_addr;
  char sRecvBuff;
  AnsiString TempStr;
  int i, iRet;
   HOSTENT *hst;

  //////////////////
  mmLog->Clear();

  /////// Çàãðóçêà WinSock
  if (WSAStartup(MAKEWORD(1,1), &wData) != 0)
  {
    MessageBox(0,"","",0);
  }

  /////// Ñîçäàíèå Ñîêåòà
  sServerListen = socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
  if (sServerListen == INVALID_SOCKET)
  {
    MessageBox(0,"","",0);
  }

  //Çàïîëíåíèå ñòðóêòóðû àäðåñà
  server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
  server_addr.sin_family = AF_INET;
  server_addr.sin_port = htons(StrToInt(edPort->Text));
  //server_addr.sin_addr = inet_addr(edServer->Text.c_str());


   if (hst = gethostbyname(edServer->Text.c_str()))
            // hst->h_addr_list ñîäåðæèò íå ìàññèâ àäðåñîâ,
            // à ìàññèâ óêàçàòåëåé íà àäðåñà
            ((unsigned long *)&server_addr.sin_addr)[0]=
            ((unsigned long **)hst->h_addr_list)[0][0];
        else
        {

            //closesocket(my_sock);
            WSACleanup();
        }

  if (connect(sServerListen, (LPSOCKADDR)&server_addr, sizeof(server_addr)) == SOCKET_ERROR)

  {
    MessageBox(0,"","",0);
  }

  recv(sServerListen, &sRecvBuff, sizeof(sRecvBuff)-1, 0);

  TempStr = &sRecvBuff;
  mmLog->Lines->Add("<"+TempStr);
  //Application->ProcessMessages();

  TempStr = GetLocalHost();
  //CopyMemory(sRecvBuff, TempStr.
}



В функции recv() что-то не пашет, в переменную sRecvBuff должен помешаться сигнал от сервера но в переменной TempStr пусто ( а вроде всё верно?)
6.4K
25 ноября 2005 года
Host
122 / / 22.09.2005
Цитата:
Originally posted by zoh
 
Код:
WSADATA wData;
  SOCKET sServerListen;
  sockaddr_in server_addr;
  char sRecvBuff;
  AnsiString TempStr;
  int i, iRet;
   HOSTENT *hst;

 
  recv(sServerListen, &sRecvBuff, sizeof(sRecvBuff)-1, 0);



В твоем случае буфер, куда записываются данные - sRecvBuff, а он размером всего 1байт(1символ).
sizeof(sRecvBuff)=1, таким образом размер буфера:
1-1...
Сделай буфер больше, чтобы принять пришедшие данные:

char sRecvBuff[200];
recv(sServerListen, sRecvBuff, 200, MSG_OOB);

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог