c中的套接字编程问题

时间:2014-08-13 06:44:16

标签: c sockets

    Client code 
    #include <string.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <unistd.h>
    #include <stdio.h>

    int  main ()
    {
            struct sockaddr_in server ;
            struct socklen_t;

            int sockid,status,count,count1 ;
            char buffer[1024];
            char buffer1[1024];
            /* socket */
            sockid = socket( AF_INET, SOCK_STREAM,0);
            if (sockid == -1)
            {
                    printf("could not create socket");
            }
            else
            {
                    printf(" socket created\n");
            }

            memset((char *) &server, 0, sizeof(server));
            server.sin_addr.s_addr = inet_addr("127.0.0.1");
            server.sin_family =AF_INET;

            server.sin_port = htons(20143);

            /* connection */
            status = connect(sockid ,(struct sockaddr *)&server, sizeof(struct sockaddr));
            if (status == -1)
            {
                    printf ("error in connection\n ");
            }
            else
            {
                    printf("no error \n");
            }
            /* send*/
            strcpy(buffer, "hello \n"),
            printf("message: %s\n", buffer);

                    if(send(sockid, buffer ,strlen("buffer"),0)  < 0 )
    {
                    puts("sends failed");
    return 1;
    }
    puts("data send");

            /* receive
               count1 = recv(sockid,,buf,0 );*/


            if(recv(sockid, buffer1, 1024, 0) < 0 )
    {
    puts("receive failed ");
    return 1;
    }
    puts("receive success");
    puts(buffer1);


            /*---- Print the received message ----*/
            printf("Data received: %s",buffer1);

            close (sockid);
    }



    server code is 

    #include <string.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <unistd.h>
    #include <stdio.h>

     int main()
    {
     struct sockaddr_in server ;
     struct socklen_t ;

    int s,sockid,status;
    char buffer[1024];
    char buffer1[1024];
    /* socket */
    sockid = socket(AF_INET, SOCK_STREAM,0);
    if(sockid == -1)
    {
    printf("could not create socket");
    }

    {
    printf(" socket created\n");
    }

    memset((char *)&server, 0, sizeof(server));
    server.sin_addr.s_addr =inet_addr("127.0.0.1");
    server.sin_family = AF_INET;
    server.sin_port = htons(20143);

    if((bind(sockid,(struct sockaddr *)&server, sizeof(struct sockaddr)))== -1)
    {
    puts("failure ");
    return 1;
    }
    puts("success");
    listen(sockid,5);

    s = accept(sockid,(struct sockaddr *)&server, (socklen_t *)sizeof(server));

    if(recv(sockid,buffer, 1024, 0)< 0 )
    {
    puts("receive failed ");
    return 1;
    }
    puts("receive success");
    puts(buffer1);
      /*---- Print the received message ----*/
    printf("Data received: %s",buffer);
    enter code here

  strcpy(buffer1,"Hello World\n");
if(send(sockid,buffer1,13,0) < 0 )
{
puts("failed ");
return 1;
}
puts("success");

close (sockid);

}

这里我试图在客户端和服务器之间建立双向连接,但我无法完成它因为我面临绑定的问题,即服务器没有与客户端绑定,每次它在绑定中显示错误。 PLZ为我提供了足够的解决方案..

1 个答案:

答案 0 :(得分:2)

在这里你有办法在&#34; C&#34;中发表评论,评论是西班牙语,但我希望它有所帮助。 链接到我的Github:https://github.com/MarcosAguayo/sockets-c

客户端

#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/un.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>



/**
 * Función que usa socket INET para conectarse con un servidor. 
 * @params char *hostServer, char *service
 * @return res
 */
int abrirConexion (char *hostServer, char *service){
    struct sockaddr_in dir;
    struct servent *puerto;
    struct hostent *host;
    int res;

    puerto = getservbyname (service, "tcp");
    if(puerto == NULL) return -1;

    host = gethostbyname (hostServer);
    if(host == NULL) return -1;

    dir.sin_family = AF_INET;
    dir.sin_addr.s_addr = ((struct in_addr *)(host->h_addr))->s_addr;
    dir.sin_port = puerto->s_port;

    res = socket (AF_INET, SOCK_STREAM, 0);
    if(res == -1) return -1;

    if(connect (res, (struct sockaddr *)&dir, sizeof (dir)) == -1){
        return -1;
    }

    return res;
}



/**
 * Función para leer los datos del socket. Devuelve el total de bytes que
 * ha leído, un -1 si da algun error o un 0 si se cierra.
 * @params int fd, char *data, int longitud
 * @return total
 */
int leerSocket (int fd, char *data, int longitud){
    int total = 0;
    int temp = 0;

    // Validación de los parámetros de entrada
    if ((fd == -1) || (data == NULL) || (longitud < 1)) return -1;

    // Bucle que se ejecuta siempre que no hayamos leido todos los datos
    while (total < longitud){
        temp = read (fd, data + total, longitud - total);
        if (temp > 0){
            // Si se han leido los datos incrementamos la variable que después devolveremos
            total = total + temp;
        }else{
            // Si devuelve 0, es que se ha cerrado el socket por lo que terminamos u devolvemos total
            if (temp == 0) return total;

            if (temp == -1){
                switch (errno){
                    case EINTR:
                    case EAGAIN:
                        usleep (100);
                        break;
                    default:
                        return -1;
                }
            }
        }
    }

    return total;
}



/**
 * Escribe datos en el socket del cliente y devuelve el total de bytes que ha escrito
 * @params int fd, char *data, int longitud
 * @return num (Total bytes escritos) o -1
 */
int escribirSocket (int fd, char *data, int longitud){
    int num = 0;
    int temp = 0;

    // Validar los parámetros
    if ((fd == -1) || (data == NULL) || (longitud < 1)) return -1;

    while (num < longitud){
        temp = write (fd, data + num, longitud - num);
        if (temp > 0){
            num = num + temp;
        }else{
            if (temp == 0)
                return num;
            else
                return -1;
        }
    }

    return num;
}



/**
 * Función MAIN
 */
void main (void){

    int socketServer;
    char cad[100];

    // Abrimos la conexión con el server pasandole "localhost" y el nombre del servicio (/etc/services)
    socketServer = abrirConexion ("localhost", "aguayo");
    if (socketServer == 1){
        printf ("No puedo establecer conexion con el servidor\n");
        exit (-1);
    }

    strcpy(cad, "Hola");
    escribirSocket(socketServer, cad, 5);
    leerSocket (socketServer, cad, 6);

    printf ("Hola buenas soy el cliente y he recibido: %s\n", cad);

    close (socketServer);
}

服务器

#include <string.h>
#include <stdlib.h>
#include <netdb.h>
#include <unistd.h>
#include <errno.h>
#include <stdio.h>
#include <sys/un.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>



/**
 * Función para aceptar la conexion del socket
 * @param int res
 * @return int ch
 */
int aceptarConexion (int res){
    socklen_t long_cl;
    struct sockaddr cl;
    int ch;

    long_cl = sizeof (cl);
    ch = accept (res, &cl, &long_cl);
    if (ch == -1)return -1;

    return ch;
}



/**
 * Función que usa socket INET 
 * @params char *servicio
 * @return res
 */
int abrirConexion (char *servicio){
    struct sockaddr_in dir;
    struct sockaddr cl;
    struct servent *puerto;
    socklen_t long_cl;
    int res;

    res = socket (AF_INET, SOCK_STREAM, 0);
    if (res == -1) return -1;

    // obtenemos el servicio del fichero /etc/services
    puerto = getservbyname (servicio, "tcp");
    if (puerto == NULL) return -1;

    // Se comletan los campos de la estructura
    dir.sin_family = AF_INET;
    dir.sin_port = puerto->s_port;
    dir.sin_addr.s_addr =INADDR_ANY;
    if (bind (res, (struct sockaddr *)&dir, sizeof (dir)) == -1){
        close (res);
        return -1;
    }

    if (listen (res, 1) == -1){
        close (res);
        return -1;
    }

    return res;
}



/**
 * Función para leer los datos del socket. Devuelve el total de bytes que
 * ha leído, un -1 si da algun error o un 0 si se cierra.
 * @params int fd, char *data, int longitud
 * @return num
 */
int leerSocket (int fd, char *data, int longitud){
    int num = 0;
    int temp = 0;

    // Validación de los parámetros de entrada
    if ((fd == -1) || (data == NULL) || (longitud < 1)) return -1;

    // Bucle que se ejecuta siempre que no hayamos leido todos los datos
    while (num < longitud){
        temp = read (fd, data + num, longitud - num);
        if (temp > 0){
            num = num + temp;
        }else{
            if (temp == 0) return num;
            if (temp == -1){
                switch (errno){
                    case EINTR:
                    case EAGAIN:
                        usleep (100);
                        break;
                    default:
                        return -1;
                }
            }
        }
    }

    return num;
}



/**
 * Escribe datos en el socket del cliente y devuelve el total de bytes que ha escrito
 * @params int fd, char *data, int longitud
 * @return total (Total bytes escritos) o -1
 */
int escribirSocket (int fd, char *data, int longitud){
    int total = 0;
    int temp = 0;

    // Validar los parámetros
    if ((fd == -1) || (data == NULL) || (longitud < 1)) return -1;

    while (total < longitud){
        temp = write (fd, data + total, longitud - total);
        if (temp > 0){
            total = total + temp;
        }else{
            if (temp == 0) return total;
            else return -1;
        }
    }

    return total;
}



/**
 * Función MAIN
 */
void main (void){
    int socketServer;
    int socketClient;
    char cad[100];

    socketServer = abrirConexion ("aguayo");
    if (socketServer == -1){
        printf ("No se puede abrir socket servidor\n");
        exit (-1);
    }

    socketClient = aceptarConexion (socketServer);
    if (socketServer == -1){
        printf ("No se puede abrir socket de cliente\n");
        exit (-1);
    }

    leerSocket (socketClient, cad, 5);
    printf ("Soy el Servidor y he recibido: %s\n", cad);

    strcpy (cad, "Adios");
    escribirSocket (socketClient, cad, 6);

    close (socketClient);
    close (socketServer);
}