نمایش نتایج: از شماره 1 تا 3 از مجموع 3
سپاس ها 1سپاس

موضوع: سوكت نويسي در لينوكس

  
  1. #1


    عضو غیر فعال
    تاریخ عضویت
    Apr 2007
    نوشته
    20
    سپاسگزاری شده
    0
    سپاسگزاری کرده
    3

    Icon14 سوكت نويسي در لينوكس

    سلام به اساتید و برتران
    من یه برنامه کلاینت سرور با 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



    موضوعات مشابه:

  2. #2
    نام حقيقي: Mobin

    عضو عادی
    تاریخ عضویت
    Feb 2007
    محل سکونت
    Golestan, Gonbad Qabous
    نوشته
    111
    سپاسگزاری شده
    23
    سپاسگزاری کرده
    11

    Icon1

    سلام
    تو لینوکس تا به حال تجربه ی برنامه نویسی شبکه نداشتم ولی فکر کنم چون خطای کد شما ساده هست بتونم کمکی بکنم.متغییر he شما در واقع یک اشاره گر به ساختار hostent هست و برای اشاره به یک عضو از ساختار باید به جای - از <- استفاده کنید.

    کد:
    their_addr.sin_addr = *((struct in_addr *)h->h_addr);



    vasighi سپاسگزاری کرده است.

  3. #3
    نام حقيقي: َََAmin

    عضو غیر فعال
    تاریخ عضویت
    Mar 2006
    نوشته
    464
    سپاسگزاری شده
    36
    سپاسگزاری کرده
    14
    من سر رشته ای تو این مورد ندارم ولی فکر می کنم مشکل از لایه های پایین تر باشه .



کلمات کلیدی در جستجوها:

نحوه استفاده از fork در سوکت نویسی در لینوکس

استفاده ازfork لینوکس

برچسب برای این موضوع

مجوز های ارسال و ویرایش

  • شما نمی توانید موضوع جدید ارسال کنید
  • شما نمی توانید به پست ها پاسخ دهید
  • شما نمی توانید فایل پیوست ضمیمه کنید
  • شما نمی توانید پست های خود را ویرایش کنید
  •