Форум: "Сети";
Текущий архив: 2002.09.30;
Скачать: [xml.tar.bz2];
ВнизКак использовать API-функцию connect? Найти похожие ветки
← →
net-lamer (2002-07-25 20:41) [0]Чего-то не врубаюсь как ее использовать. В SDK чего-то ни хрена не понять.
int connect (
SOCKET s,
const struct sockaddr FAR* name,
int namelen
);
Чего это за структура такая name и как ее объявить, заполнить и указать в connect.
Если не в лом, расскажите еще про recv и send.
← →
Digitman (2002-07-26 09:01) [1]Это тебе зачем ? Чем не устраивают готовые стандартные компоненты для работы с гнездами ?
← →
net-lamer (2002-07-26 11:54) [2]А потому как пишу non-VCL прогу. А вставка компонентов резко увеличивает размер проги. Терпеть не могу прог типа Hello world! размером по 400 кило.
← →
Polevi (2002-07-26 12:08) [3]uses Winsock
var
FAddr: TSockAddrIn;
FSocket:TSocket;
begin
FSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_IP);
FAddr.sin_family:=PF_INET;
FAddr.sin_addr.s_addr := inet_addr(PChar("192.168.1.1"));
FAddr.sin_port := htons(110);
connect(FSocket, FAddr, SizeOf(FAddr));
← →
Digitman (2002-07-26 12:23) [4]Позволю себе усомниться, что у тебя что либо получится стоящее при такой постановке вопроса и аргументах)
Если уж ты не в состоянии, подумав головой, исключить модуль Forms из списка используемых Scktcomp, дабы радикально уменьшить размер своей "проги", или изучить работу упомянутых тобой WinsockAPI-вызовов на примере того же TClientSocket, то - лучше не начинай.
Ну, если я таки ошибаюсь в предположениях, держи ответ по connect() :
вот соответстыующие декларации в модуле Winsock.pas
u_int = Integer;
{ The new type to be used in all
instances which refer to sockets. }
{$EXTERNALSYM TSocket}
TSocket = u_int; // хэндл гнезда
in_addr = record
case integer of
0: (S_un_b: SunB);
1: (S_un_w: SunW);
2: (S_addr: u_long); // IP-адрес
end;
TInAddr = in_addr;
sockaddr_in = record
case Integer of
0: (sin_family: u_short;// код семейства Инет-адресов, например, AF_INET
sin_port: u_short; // номер целевого порта
sin_addr: TInAddr; // структура, описывающая целевой адрес
sin_zero: array[0..7] of Char); //
1: (sa_family: u_short;
sa_data: array[0..13] of Char)
end;
TSockAddr = sockaddr_in;
function connect(s: TSocket; var name: TSockAddr; namelen: Integer): Integer; stdcall;
← →
net-lamer (2002-07-26 16:35) [5]Всем спасибо за ответы!
Но теперь другая беда - пока я их ждал попробовал что-то накропать сам. Получилась такая пурга:
procedure TForm1.Button1Click(Sender: TObject);
var nSMTPServerSocket:integer;
nConnect:integer;
smtp_address: sockaddr_in;
iLength, iMsg, iEnd , error:integer;
mes:string;
begin
nSMTPServerSocket := socket (AF_INET, SOCK_STREAM,IPPROTO_IP);
error:=WSAGetLastError();
case error of
WSANOTINITIALISED : label4.Caption:="A successful WSAStartup must occur before using this function.";
WSAENETDOWN: label4.Caption:="The network subsystem or the associated service provider has failed.";
WSAEAFNOSUPPORT: label4.Caption:="The specified address family is not supported.";
WSAEINPROGRESS:label4.Caption:="A blocking Windows Sockets 1.1 call is in progress, or the service provider is still processing a callback function.";
WSAEMFILE :label4.Caption:="No more socket descriptors are available.";
WSAENOBUFS : label4.Caption:="No buffer space is available. The socket cannot be created.";
WSAEPROTONOSUPPORT: label4.Caption:="The specified protocol is not supported.";
WSAEPROTOTYPE : label4.Caption:="The specified protocol is the wrong type for this socket.";
WSAESOCKTNOSUPPORT : label4.Caption:="The specified socket type is not supported in this address family.";
else label4.Caption:=inttostr(error);
end;
label1.Caption:=inttostr(nSMTPServerSocket);
{if(nSMTPServerSocket <> INVALID_SOCKET) then
begin
label1.Caption:="socket O.K.";
closesocket(nSMTPServerSocket);
end else label1.Caption:=inttostr(nSMTPServerSocket);
}
smtp_address.sin_family := AF_INET;
smtp_address.sin_addr.s_addr := inet_addr("x.x.x.x"); // IP сервака
smtp_address.sin_port := htons(25);
nConnect := connect(nSMTPServerSocket, smtp_address, sizeof(smtp_address));
label2.Caption:=inttostr(nConnect);
iLength:=0; iMsg:=0; iEnd:=0;
mes:="HELO aaa\r\nMAIL FROM:<mail@host>\r\nRCPT TO:<mail@host>\r\nDATA\r\nTest\r\n\r\n.\r\nQUIT\r\n"+#0;
iend:=send(nSMTPServerSocket, mes, strlen(pchar(mes)), 0);
label3.Caption:=inttostr(iEnd);
closesocket(nSMTPServerSocket);
end;
Но чего-то эта хренотень не работает с самой первой строчки nSMTPServerSocket := socket (AF_INET, SOCK_STREAM,0); возвращает щшибку "A successful WSAStartup must occur before using this function.". Чего бы это могло значить?
По примеру Polevi пробовал socket (AF_INET, SOCK_STREAM,IPPROTO_IP); - один хрен.
Может перед этим чего еще проинициализировать надо?
To Digitman
Позволю себе усомниться, что у тебя что либо получится стоящее при такой постановке вопроса и аргументах)
Если уж ты не в состоянии, подумав головой .......
Да на надо меня так ругать, я ж не профессиональный программер, а так, пишу для себя без претензий на что-то выдающееся.
← →
Digitman (2002-07-26 16:50) [6]>net-lamer
Так тогда и вопрос ставь по-иному :
"Я не знаю ничего о низкоуровневом механизме WinsockAPI. Какие основные, ф-ции в каких режимах, с какими параметрами. В какой последовательности должны вызываться для осуществления корректной передачи инф-ции по гнездовому соединению ? Где можно посмотреть подробную инф-цию на эту тему ?"
← →
Wonder (2002-07-26 16:51) [7]>net-lamer
socket (AF_INET, SOCK_STREAM,IPPROTO_IP);
Ну откель вы все берете AF_INET? Там PF_INET (protocol family)
должно быть! Хоть и цифири одинаковые и не влияет это ни на что, но логика-то где?
"A successful WSAStartup must occur before using this function.". Чего бы это могло значить?
То и значит, что написано. Успешный вызов ф-ции WSAStartup() должен предшествовать всем вызовам ф-ций из WinSock.
← →
Digitman (2002-07-26 16:56) [8]Вот ты пойми - прежде, чем отвергать "творчество" Борланда за якобы излишне большие размеры твоей программы, нужно разобраться - а почему это так ? Что лишнего ? Ну, залезь ты, не поленись в модуль, где Борланд "сотворил" TClientSocket да посмотри, как же сам Борланд делает это ! Ну, почему ты сразу отвергаешь чужой опыт и пытаешься строить тот же велосипед по-новому, набивая шишку за шишкой ? Что , это так сложно - разобраться в готовом коде, выкинуть из него лишнее и оставить только то, что тебе действительно нужно ? Ну, просвети меня, тундру, не понимаю я этого ....
← →
net-lamer (2002-07-29 15:32) [9]Еще раз спасибо за ответы и, только не смейтесь, еще пару вопросов.
1) Поставил первой строкой
var wsad:WSAData;
begin
err1 := WSAStartup( 2, wsaD );
А какую на самом деле надо цифирь указывать в WSAStartup. Правда вроде и так сработало без ошибок.
2) Вроде ошибок нигде не выдается, но письмо не доходит. Может в строке mes (само письмо) символы /n и /r надо задавать как char(x) и если это так, то какие у них коды (типа у /n код 10 или 13).
И немного лирики.
To Digitman
Так тогда и вопрос ставь по-иному :
---------
"Я не знаю ничего о низкоуровневом механизме WinsockAPI. Какие основные, ф-ции в каких режимах, с какими параметрами. В какой последовательности должны вызываться для осуществления корректной передачи инф-ции по гнездовому соединению ? Где можно посмотреть подробную инф-цию на эту тему ?"
---------
Ну дык так оно и есть, см. мой ник. Ну и "Где можно посмотреть подробную инф-цию на эту тему ?" и желательно в дельфийском контексте.
To Wonder
Ну откель вы все берете AF_INET? Там PF_INET (protocol family)
должно быть!
----------
А какая разница - вот в исходниках нашел PF_INET = AF_INET;
← →
Digitman (2002-07-29 15:38) [10]Где можно посмотреть ? Я ж тебе говорю - в модуле ScktComp.pas : готовый и 100%-но работающий код ! Куда уж наглядней ...
← →
Malder (2002-07-29 16:52) [11]Digitman, если у тебя плохое настроение - не издевайся над людьми.
← →
Digitman (2002-07-30 08:48) [12]>Malder
Может, мне еще и номер строки с WSAStartup() в модуле scktcomp.pas указать ? Где четко, черным по белому написано, какие параметры и в каком синтаксие требует этот вызов ? Где и как объявить все то, от чего зависит работа и WSAStartup() и прочих WS2API-ф-ций ? Ну, чтобы совсем уж не думать головой ? Просто "содрать" один-в-один строчки к себе в код, и - заработало и ладно ? Так что ли ?
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2002.09.30;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.009 c