[C con Clase] Conexión con sockets

William Morales (INCOS) wmormar en yahoo.com.mx
Sab Jun 21 07:33:51 CEST 2008


Saludos,

Les comento, estoy intentando hacer algo para el envio de correos electrónicos, he leído mucho acerca de los sockets y protocolo smtp, he logrado hacer que abra el socket, que se conecte al servidor smtp. Hasta ahí todo bien, pero, ahora quiero empezar la "charla" con el servidor SMTP, ahi es donde ya no se como hacerle, he estado usando la funcion recv() en primer paso, pero no responde el server. Tengo por seguro que algo me falta, pero no logro saber que.

Agradeceré mucho me ayuden a disipar la duda y me digan que me falta y porque.

este es el código en cuestión.

#include <windows.h>
#include <winsock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>

#define DEFAULT_BUFLEN  100

int ioctlsocket(SOCKET s, long cmd, u_long FAR *argp);

void sendsmtp( char *ServidorSMTP, int DEST_PORT )
{
 WSADATA wsaData;
    int iresult;
 int sockfd;
    int recvbuflen = DEFAULT_BUFLEN;
 struct sockaddr_in dest_addr; // Guardará la dirección de destino
 struct hostent *hServSMTP;
    char *sendbuf = "this is a test";
    char recvbuf [DEFAULT_BUFLEN];
    char buffer [33];
    u_long iMode = 0;
    int numbytes = 0;

 /////////////////////////////////////////////////////
 //// Inicio de la Conexión ////
 /////////////////////////////////////////////////////
 if (WSAStartup(MAKEWORD(2, 2), &wsaData) != NO_ERROR)
 {
    MessageBox( NULL, "No se pudo crear el enlace WINSOCK", "INCOS", MB_OK );
       WSACleanup();
    exit(1);
 }
 
 if ((hServSMTP=gethostbyname(ServidorSMTP)) == NULL)
 {
       // Obtener información del host
    MessageBox( NULL, "El dns no existe, verifique...", "INCOS", MB_OK );
       WSACleanup();
    exit(1);
 }

 sockfd = socket(AF_INET, SOCK_STREAM, 0);
 if (sockfd == INVALID_SOCKET)
 {
       MessageBox( NULL, "No hubo socket", "INCOS", MB_OK );
       WSACleanup();
    exit(1);
 }
 
 dest_addr.sin_family = AF_INET; // Ordenación de máquina
 dest_addr.sin_port = htons(DEST_PORT); // short, Ordenación de la red
 dest_addr.sin_addr = *((struct in_addr *)hServSMTP->h_addr);
 memset(&(dest_addr.sin_zero), '\0', 8); // Poner a cero el resto de la estructura
 
 // Coloca el socket no bloqueado
    //-------------------------
    // Set the socket I/O mode: In this case FIONBIO
    // enables or disables the blocking mode for the 
    // socket based on the numerical value of iMode.
    // If iMode = 0, blocking is enabled; 
    // If iMode != 0, non-blocking mode is enabled.
    iresult = ioctlsocket(sockfd, FIONBIO, &iMode);    
    if ( iresult == SOCKET_ERROR )
    {
       MessageBox( NULL, "No se puede desbloquear el socket...", "INCOS", MB_OK );
       WSACleanup();
    exit(1);
    }

 iresult = connect(sockfd, (struct sockaddr *) &dest_addr, sizeof(struct sockaddr));
 if ( iresult == SOCKET_ERROR )
 {
       MessageBox( NULL, "No hubo conexión al socket", "INCOS", MB_OK );
       WSACleanup();
    exit(1);
    }
    
    // Send an initial buffer
    iresult = send( sockfd, sendbuf, (int)strlen(sendbuf), 0 );
    if (iresult == SOCKET_ERROR)
    {
       MessageBox( NULL, "Falló el enviar (send)", "INCOS", MB_OK );
       closesocket(sockfd);
       WSACleanup();
    exit(1);
    }
    
    MessageBox( NULL, ServidorSMTP, "Conectado a...", MB_OK );
    
    if ( (numbytes = recv(sockfd, recvbuf, DEFAULT_BUFLEN, 0)) == SOCKET_ERROR )         
    {
         itoa( WSAGetLastError(),buffer,10 );
         MessageBox( NULL, buffer, "recv ha fallado, error...", MB_OK );
    }
    else
    {
        recvbuf[numbytes]='\0';
        MessageBox( NULL, recvbuf, "Lo recibido...", MB_OK );
    }

 /////////////////////////////////////////////////////
 //// Fin de la Conexion ////
 /////////////////////////////////////////////////////
 shutdown(sockfd,2);
 closesocket(sockfd);
 WSACleanup();
}

Les comento que uso Dev-C++

saludos y gracias de antemano

William Morales
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20080621/96d02808/attachment.html>


Más información sobre la lista de distribución Cconclase