Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
3-97956
billybons
2002-09-09 08:01
2002.09.30
DBGrid


7-98378
BJValentine
2002-07-11 16:45
2002.09.30
Пути


14-98279
Aleksey Pavlov
2002-09-02 13:36
2002.09.30
Фотографии со второй встречи Мастаков в Москве.


14-98294
still
2002-09-04 14:05
2002.09.30
Опять про железо


1-98212
Wolverin
2002-09-18 18:06
2002.09.30
Иконка в TrayBar





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский