//////////////////
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)
{
/////////////
}
SMTP-клиент на WinSock API
Вот код
socket(AF_INET, SOCK_STREAM, 0);
Думаю ошибка исчезнет.
А в конект выдаёт что не знает
[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')
попробуй в Сишку вставь посмотри.
Цитата:
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 = 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)
if (connect(sServerListen, (LPSOCKADDR)&server_addr, sizeof(server_addr))) == SOCKET_ERROR)
Код:
(LPSOCKADDR)&...
Цитата:
Originally posted by zoh
Если тебе не трудно ответь что значит
Если тебе не трудно ответь что значит
Код:
(LPSOCKADDR)&...
Функции необходимо передавать указатель на структуру. Это всего навсего явное приведение к типу указателя на структуру адреса.
(Во сказал... :) )
Код:
server_addr.sin_addr = inet_addr(edServer->Text.c_str());
[C++ Error] Unit1.cpp(48): E2034 Cannot convert 'unsigned long' to 'in_addr'
Выдаёт такую ошибку.
Цитата:
Originally posted by zoh
[C++ Error] Unit1.cpp(48): E2034 Cannot convert 'unsigned long' to 'in_addr'
Выдаёт такую ошибку.
Код:
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());
При условии что веден адрес а не имя.
http://www.insidepro.com/kk/006/006r.shtml - более менее толково расписано, только я бы не стал там всему безоговорочно верить. Но исходники рабочие.
Глянь сюда:
Код:
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.
}
{
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 пусто ( а вроде всё верно?)
Цитата:
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);
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);