Msg : Prev 497 / 4523 Next -460
2002-12-11 20:11:06

To  : Stepan Kits

Subj:

smtp


Привет Stepan! 

30 Nov 02, 23:17, Stepan Kits >> Kostya Volkov 

SK>>> Как на ассемблере установить связь в smtp сервером и отправить 
SK>>> письмо с приаттаченным файлом? 
KV>> точно так же как и на Си :) 
SK> Ладно переформулирую вопрос: а как на Си? 

прямо как и с остальными портами. протокол smtp бери в rfc. 
вот некоторые кусочки хоста и вызываемой проги :) 
надеюсь поймешь что к чему. 

============================ host.c ===================================== 

#include <stdio.h> 
#include <errno.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <winsock.h> 
#define MAXMSG 512 

void a_exit(char *ty) { 
printf("Error: %s = %d\n",ty,WSAGetLastError()); 
WSACleanup(); 
exit(0); } 

int main (int argc, char *argv[]) 
{ 
extern int make_socket (unsigned short int port); 
int sock,sock2; 
int status; 
fd_set active_fd_set, read_fd_set; 
int i; 
struct sockaddr_in clientname; 
struct sockaddr_in sin; 
// size_t size; 
int FAR size; 


WORD wVersionRequested; 
WSADATA wsaData; 
int err; 
char buffer[MAXMSG]; 
int nbytes; 
int flag; 

struct hostent *he; 
int myport = 80; 
printf("■Reminder's HOST \n"); 
if (argc>1) myport=atoi(argv[1]); 
printf("Port: %d\n",myport); 

wVersionRequested = MAKEWORD(1, 1); 
err = WSAStartup(wVersionRequested, &wsaData); 
if (err != 0) a_exit("WSAStartup1"); 
if ( LOBYTE( wsaData.wVersion ) != 1 || 
HIBYTE( wsaData.wVersion ) != 1 ) a_exit("WSAStartup2"); 

sock=socket(AF_INET, SOCK_STREAM, 0); 
printf("Sock1 = %d\n",sock); 

sin.sin_addr.s_addr = htonl (INADDR_ANY); 
sin.sin_family=AF_INET; 
sin.sin_port=htons(myport); 
if (bind(sock, (struct sockaddr*)&sin, sizeof(sin))!=0) 
a_exit("bind"); 

if (listen (sock, 1) < 0) a_exit("listen"); 
FD_ZERO (&active_fd_set); 
FD_SET (sock, &active_fd_set); 

while (1) 
{ 
printf("Check select ==============================\n"); 
if (select(FD_SETSIZE,&active_fd_set,&active_fd_set,NULL, NULL) < 0) 
a_exit("select"); 

printf("Found query\n"); 

//sock2=accept(sock,(struct sockaddr*)&clientname, &size); 
size=sizeof(clientname); 
sock2=accept(sock,(struct sockaddr*)&clientname, &size); 

if (sock2<0) a_exit("accept"); 
printf("accept yeah. Socket %d\n",sock2); 

printf ("Server: connect from host %s, port %hd.\n", 
inet_ntoa (clientname.sin_addr), 
ntohs (clientname.sin_port)); 

flag=1; 
while (flag) { 
nbytes = recv(sock2,buffer,MAXMSG,0); 
if (nbytes < 0) a_exit ("error recv"); 
else if (nbytes == 0) 
{printf("Close session2\n\n");closesocket(sock2);flag=0; } 
else {printf (":%s\n", buffer); 
if (strcmp(buffer,"shutdown")==0) {closesocket(sock2);a_exit("Shutdown"); } 
strcpy(buffer,""); 

} 

} 

} 

} 

=========================================================================== 
=========================================================================== 

#include <winsock.h> 
#include <stdio.h> 
void a_exit(char *ty) { 
printf("Error: %s = %d\n",ty,WSAGetLastError()); 
WSACleanup(); 
exit(0); } 
void main(int argc, char *argv[]) { 
char host[100]; int myport = 5555; 
struct sockaddr_in sin; 
int sock; 
char buffer[100024]; 
WORD wVersionRequested; 
WSADATA wsaData; 
int err; 
int t; 
char *getst; 
int lenn; 

struct hostent *he; 
printf("■Reminder's TCP/IP \n"); 
printf("argc: %d\n",argc); 
strcpy(host,"localhost"); 
if (argc>1) if ((argc==2) & (atoi(argv[1])!=0)) myport=atoi(argv[1]); 
else strcpy(host,argv[1]); 
if (argc>2) myport=atoi(argv[2]); 
printf("Address: %s\n",host); 
printf("Port: %d\n",myport); 
wVersionRequested = MAKEWORD(1, 1); 
err = WSAStartup(wVersionRequested, &wsaData); 
if (err != 0) a_exit("WSAStartup1"); 
if ( LOBYTE( wsaData.wVersion ) != 1 || 
HIBYTE( wsaData.wVersion ) != 1 ) a_exit("WSAStartup2"); 
if ((he=gethostbyname(host)) == NULL) a_exit("gethostbyname"); 
sock=socket(AF_INET, SOCK_STREAM, 0); 
printf("Sock1 = %d\n",sock); 
memcpy((char *)&sin.sin_addr, he->h_addr, he->h_length); 
sin.sin_family=AF_INET; 
sin.sin_port=htons(myport); 
if (connect(sock, (struct sockaddr*)&sin, sizeof(sin))!=0) 
a_exit("connect"); 

getst=(char *)malloc(512); 

while (1==1) 

{ 
printf(":>");gets(getst); 
if (send(sock,getst,strlen(getst)+1,0)<0) a_exit("send"); 
if (strcmp(getst,"quit")==0) {closesocket(sock);a_exit("a"); } 
err=recv(sock, buffer, sizeof(buffer),100); 
// if (err<0) a_exit("recv"); 
printf("%s",buffer); 

} 

} 

========================================================================== 

С бестовыми регардами , Kostya Volkov aka Reminder 
http://reminder.h1.ru 

--- 
* Origin: 2B OR (NOT 2B) = FF (2:4631/17) 
VX Heavens - коллекция вирусов,исходников и статей.
Сообщения можно выбирать стрелками Enter
Пользовательского поиска