• #1
    Tham gia
    07-11-2002
    Bài viết
    10
    Like
    0
    Thanked 0 Times in 0 Posts

    [Q] Lập trình socket của Linux

    Tôi đang lập chương trình giao tiếp file giữa 2 tiến trình theo mo hình server/client:cụ thể là trình khách gửi yêu cầu cần file nào đó,trình chủ tiếp nhận và gửi file cho trình khách.Lập trình xong ,biên dịch ko có lỗi nhưng ko đạt kết quả như ý muốn.Mong các bạn chỉ giáo cho mình,sau đây là nội dung 2 file
    Quote Quote

  • #2
    Tham gia
    07-11-2002
    Bài viết
    10
    Like
    0
    Thanked 0 Times in 0 Posts

    server.c

    server.c

    #include <stdio.h>
    #include <netinet/in.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <arpa/inet.h>
    #include <fcntl.h>
    #include <sys/stat.h>
    int main()
    {
    int server_sockfd,client_sockfd,n;
    int server_len,client_len;
    struct sockaddr_in server_address;
    struct sockaddr_in client_address;

    // Loai bo cac ten hay lien ket socket khac truoc do neu co
    // Dong thoi khoi tao socket moi cho trinh chu

    server_sockfd=socket(AF_INET,SOCK_STREAM,0);

    // Dat ten cho socket cua trinh chu
    server_address.sin_family=AF_INET;
    server_address.sin_addr.s_addr=inet_addr("127.0.0. 1");
    server_address.sin_port=htons(9782);
    server_len=sizeof(server_address);

    // Rang buoc ten voi socket vua tao ra
    bind(server_sockfd,(struct sockaddr*)&server_address,server_len);

    //Mo hang doi cho ket noi,cho fep dat hang doi toi da 5 ket noi
    listen(server_sockfd,5);

    //Lap lien tuc cho de ket noi trinh khach
    while(1)
    {
    char GetFileName[50];
    int f_read;
    size_t rf;
    char buf[1000];
    printf("server dang cho ket noi\n");

    //Cho va cap nhan ket noi
    client_sockfd=accept(server_sockfd,(struct sockaddr*)&client_address,&client_len);

    //Doc du lieu do trinh khach gui den
    n=read(client_sockfd,&GetFileName,50);
    // printf("Nhan yeu cau tu trinh khach :%d %s\n",n,GetFileName);

    //Thuc hien yeu cau tu trinh khach
    f_read=open(GetFileName,O_RDONLY);
    if(f_read<0){
    printf("Khong co file nao ten la %s",GetFileName);
    exit(1);
    }
    while((rf=read(f_read,&buf,sizeof(buf)))>0)
    write(client_sockfd,&buf,rf);
    // write(client_sockfd,&ch,strlen(ch));
    //Dong ket noi
    close(f_read);
    close(client_sockfd);
    }
    }

  • #3
    Tham gia
    07-11-2002
    Bài viết
    10
    Like
    0
    Thanked 0 Times in 0 Posts

    Client.c

    client.c


    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <unistd.h>
    #include <arpa/inet.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    int main(int argc,char*argv[])
    {
    int sockfd;
    int len;
    struct sockaddr_in address;
    int result;
    char buf[1000];
    char *filename;
    int f_write;
    size_t wf,rf;

    //Doc doi so dong lenh
    if(argc!=2||!argv[1]){
    fprintf(stderr,"Hay nhap theo mau:%s <ten file>\n",argv[0]);
    exit(1);
    }

    //Luu duong dan tu doi so thu nhat
    filename=argv[1];

    // tao socket cho trinh khach .Luu lai so mo ta socket
    sockfd=socket(AF_INET,SOCK_STREAM,0);
    address.sin_family=AF_INET;
    address.sin_addr.s_addr=inet_addr("127.0.0.1");
    address.sin_port=htons(9782);
    len=sizeof(address);

    //Thuc hien ket noi
    result=connect(sockfd,(struct sockaddr*)&address,len);
    if(result==-1)
    {
    perror("Loi client");
    exit(1);
    }

    //Sau khi socket ket noi chung ta co the doc ghi du lieu cua socket tuong tu doc ghi tren file
    write(sockfd,&(*filename),sizeof(filename));
    f_write=open(filename,O_WRONLY|O_CREAT|O_TRUNC);
    while((rf=read(sockfd,&buf,sizeof(buf)))>0)
    write(f_write,&buf,rf);
    close(f_write);
    close(sockfd);
    exit(0);
    }

  • #4
    Tham gia
    03-04-2003
    Location
    MTL
    Bài viết
    79
    Like
    0
    Thanked 0 Times in 0 Posts
    Bạn thử lại như sau coi chạy không ?
    server.c
    //Tạo permanent socket for listening service //request, khi client kết nối vô server, thì một //socket tạm thời sẽ được tạo

    struct sockaddr_in sin;
    struct sockaddr_in pin;
    int sock_descriptor;
    int temp_sock_descriptor;
    int address_size;

    //Định nghĩa phần socket descriptor
    sock_descriptor = socket (AF_INET, SOCK_STREAM, 0);
    //fill in required fields
    bzero(&sin, sizeof (sin));
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = INADDR_ANY;
    sin.sin_port = htons(8000); // dùng port 8000
    //kết nối vô port 8000
    bind(sock_descriptor, (struct sockaddr *)&sin,sizeof(sin));
    //start listening on the new socket
    listen(sock_descriptor,20);// up to 20 //connections
    /* server.c sẽ đi một vòng lập vô hạn trong khi chờ kết nốt từ cliént */
    while(1){
    //socket tạm thời cho client kết nối
    temp_sock_descriptor = accept(sock_descriptor ,(struct sockaddr *)&pin,&address_size);
    //nhận dử liệu từ client
    recv(temp_sock_descriptor, buf, 16384, 0);
    // proces yêu cầu client ở đây......
    //return dử liệu cho client
    send(temp_sock_descriptor , buf, len, 0);
    //đóng socket tạm thời
    close(temp_sock_descriptor);
    }

  • #5
    Tham gia
    31-07-2008
    Bài viết
    6
    Like
    0
    Thanked 0 Times in 0 Posts

    Vui lắm !

    Ai quan tâm thì vào đây tham khảo Template của nó này. Cả TCP và UDP luôn.
    Vào đây nha --> http://etalks.vn/forum/upload/showthread.php?t=298

    [=========> Bổ sung bài viết <=========]

    Quote Được gửi bởi vison View Post
    Tôi đang lập chương trình giao tiếp file giữa 2 tiến trình theo mo hình server/client:cụ thể là trình khách gửi yêu cầu cần file nào đó,trình chủ tiếp nhận và gửi file cho trình khách.Lập trình xong ,biên dịch ko có lỗi nhưng ko đạt kết quả như ý muốn.Mong các bạn chỉ giáo cho mình,sau đây là nội dung 2 file

    Vào đây tham khảo Template đi bạn nha -->http://etalks.vn/forum/upload/showthread.php?t=298
    Cả TCP & UDP luôn
    Được sửa bởi hnb1988 lúc 22:20 ngày 09-11-2009 Reason: Bổ sung bài viết

  • Chưa có bình luận nào, bạn hãy là người đầu tiên bình luận cho bài viết này.
    Bạn cần Đăng nhập để bình luận bài viết
    ĐĂNG KÝ THIẾT KẾ

    CHAT VỚI

    X HOME - THINKDIFFERENTLY * NGÔI NHÀ ĐẶC BIỆT - SUY NGHĨ KHÁC BIỆT chuyên thiết kế, thi công xây dựng, nội thất, sơn bả thạch cao, mỹ thuật, sân vườn tiểu cảnh, cây cảnh, cây công trình. Hotline: 0965.163.169 - 0975.163.169 - 0949.163.169 - 0902.112.114 - 0915.511.577