آژانس هواپیماییexchanging
dakhlestan

سوكت نويسي

شروع موضوع توسط vasighi ‏19 جولای 2007 در انجمن خانواده C++ , C

  1. vasighi

    vasighi کاربر تازه وارد

    تاریخ عضویت:
    ‏19 آپریل 2007
    نوشته ها:
    21
    تشکر شده:
    0
    سلام به اساتید و برتران
    من یه برنامه کلاینت سرور با API لینوکس نوشتم ولی موقع اجرا سمت کلاینت
    Error:Network is unreachable میده
    مشکلش چیه؟؟؟؟؟؟؟؟؟؟؟
    *********************************************************************
    Server side:

    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <string.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
    #include <sys/wait.h>
    #define MYPORT 3490 /* the port users will be connecting to */
    #define BACKLOG 10 /* how many pending connections queue will hold */
    main() {
    int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd */
    struct sockaddr_in my_addr; /* my address information */
    struct sockaddr_in their_addr; /* connector's address information */
    int sin_size;
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    perror("socket");
    exit(1);
    }
    my_addr.sin_family = AF_INET; /* host byte order */
    my_addr.sin_port = htons(MYPORT); /* short, network byte order */
    my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */
    bzero(&(my_addr.sin_zero), 8); /* zero the rest of the struct */
    if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) \
    == -1) {
    perror("bind");
    exit(1);
    }
    if (listen(sockfd, BACKLOG) == -1) {
    perror("listen");
    exit(1);
    }
    while(1) { /* main accept() loop */
    sin_size = sizeof(struct sockaddr_in);
    if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, \
    &sin_size)) == -1) {
    perror("accept");
    continue;
    }
    printf("server: got connection from %s\n", \
    inet_ntoa(their_addr.sin_addr));
    if (!fork()) { /* this is the child process */
    if (send(new_fd, "Hello, world!\n", 14, 0) == -1)
    perror("send");
    close(new_fd);
    exit(0);
    }
    close(new_fd); /* parent doesn't need this */
    while(waitpid(-1,NULL,WNOHANG)>0); /* clean up child processes */
    }
    }

    *********************************************************************
    Client side:

    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <string.h>
    #include <netdb.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    #include <sys/socket.h>
    #define PORT 3490 /* the port client will be connecting to */
    #define MAXDATASIZE 100 /* max number of bytes we can get at once */
    int main(int argc, char *argv[])
    {
    int sockfd, numbytes;
    char buf[MAXDATASIZE];
    struct hostent *he;
    struct sockaddr_in their_addr; /* connector's address information */
    if (argc != 2) {
    fprintf(stderr,"usage: client hostname\n");
    exit(1);
    }
    if ((he=gethostbyname(argv[1])) == NULL) { /* get the host info */
    herror("gethostbyname");
    exit(1);
    }
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
    perror("socket");
    exit(1);
    }
    their_addr.sin_family = AF_INET; /* host byte order */
    their_addr.sin_port = htons(PORT); /* short, network byte order */
    their_addr.sin_addr = *((struct in_addr *)he-h_addr);
    bzero(&(their_addr.sin_zero), 8); /* zero the rest of the struct */
    if (connect(sockfd, (struct sockaddr *)&their_addr, \
    sizeof(struct sockaddr)) == -1) {
    perror("connect");
    exit(1);
    }
    if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1) {
    perror("recv");
    exit(1);
    }
    buf[numbytes] = '\0';
    printf("Received: %s",buf);
    close(sockfd);
    return 0;
    }

    بعد موقع کامپایل با gcc ارور زیر رو هم میده
    ****************************************
    اینها در هدر ها تعریف شده هستند

    #include <netdb.h>


    struct hostent {
    char *h_name;
    char **h_aliases;
    int h_addrtype;
    int h_length;
    char **h_addr_list;
    };

    #define h_addr h_addr_list[0]





    struct sockaddr_in {
    short int sin_family; /* Address family */
    unsigned short int sin_port; /* Port number */
    struct in_addr sin_addr; /* Internet address */
    unsigned char sin_zero[8]; /* Same size as struct sockaddr */
    };


    struct in_addr {
    unsigned long s_addr;
    };
    *********************************************************
    {my program}


    struct hostent *he;

    struct sockaddr_in their_addr;
    *********************************************************
    main(){…………………….
    ……………………..

    تو این خطtheir_addr.sin_addr = *((struct in_addr *)he-h_addr);
    …………………
    Error:Request for member 'h_addr_list' in something not a structure or union
     
عسل طبیعی و گرده گل ایرانیavanak