Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.30;
Скачать: CL | DM;

Вниз

Как использовать 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.023 c
1-98043
Hro
2002-09-19 00:05
2002.09.30
Excel


1-98133
Vladimiruss
2002-09-19 18:31
2002.09.30
Помогите, начинающему программисту...


3-97989
BoxTer
2002-09-09 20:58
2002.09.30
Crystal Report 8, 8.5


1-98066
Skywalker
2002-09-19 12:02
2002.09.30
Почему не удаляется?


1-98163
$hade
2002-09-16 12:07
2002.09.30
Delphi 7 Studio!!