Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 6 của 6 Đầu tiênĐầu tiên ... 456
Kết quả 51 đến 56 của 56
  1. #51
    đánh dấu cái.đang nghiên cứu làm đồ án liên quan đến vấn đề socket.

  2. #52
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Có bác nào code cái gửi với nhận file TCP mode Server Client chưa post lên tham khảo với, đang bí cái đoạn file lớn phải chia ra (

  3. #53
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Hôm nay lục lọi, lại thấy cái tut mình viết từ năm ngoái, share cho mọi người cùng bổ sung.

    Giới thiệu về Winsock

    Khái niệm Winsock

    Windows Socket API ( WSA ) hay nói ngắn gọn là Winsock là kĩ thuật đặc tả cách các phần mềm mạng trên Windows truy cập dịch vụ mạng , đặc biệt là TCP/IP.

    Nó vạch ra 1 giao diện chuẩn giữa các ứng dụng Client TCP/IP trên Windows ( như FTP client hay web browser ) và bộ giao thức TCP/IP mà ứng dụng đó chạy trên.

    Lịch sử ngắn gọn

    Ban đầu , cả MS-DOS và Windows đều hỗ trợ rất giới hạn khả năng mạng, chủ yếu dựa trên NetBios. Ở thời điểm đó , MS không hỗ trợ hộ giao thức TCP/IP. Nhiều nhóm ở trường ĐH và các nhà cung cấp thương mại giới thiệu TCP/IP cho hệ điều hành MS-DOS. Khi Windows 2.0 xuất bản , 1 vài nhà cung cấp được tham gia vào việc phát triển TCP/IP cho Windows.

    Giới thiệu thêm về Winsock

    Winsock là một giao diện lập trình ứng dụng chuẩn (API) cho phép hai hay nhiều ứng dụng (hoặc các tiến trình) giao tiếp trên cùng một máy hoặc qua mạng và chủ yếu được thiết kế để tạo điều kiện truyền dữ liệu qua mạng. Điều quan trọng là phải hiểu rằng Winsock là một giao diện lập trình mạng , không phải là một giao thức. Winsock cung cấp giao diện lập trình cho các ứng dụng để chúng giao tiếp bằng cách sử dụng các giao thức mạng phổ biến như Transmission Control Protocol/Internet Protocol (TCP/IP) và Internetwork Packet Exchange (IPX). Giao diện Winsock thừa hưởng rất nhiều từ cách thức của BSD socket trên nền tảng UNIX. Trong môi trường Windows , giao diện đã phát triển thành một giao diện giao thức độc lập thực sự , đặc biệt là Winsock 2.

    Các hàm của Winsock 2 có thêm tiền tố WSA.


    Winsock Header và các thư viện

    Có 2 phiên bản Winsock chính là Winsock 1 và Winsock 2 , chúng đều sử dụng được trên tất cả nền tảng Windows trừ Windows CE ( chỉ có Winsock 1 ).

    Khi phát triển ứng dụng bạn cần
    #include <winsock2.h> // để sử dụng Winsock 2.
    hoặc
    #include <winsock.h> // để sử dụng Winsock 1.

    Khi biên dịch ứng dụng của bạn , bạn cần liên kết project của bạn với thư viện
    WS2_32.LIB ( nếu sử dụng Winsock 2 )
    hoặc
    WSOCK32.LIB ( nếu sử dụng Winsock 1 )
    Nếu bạn sử dụng các hàm API mở rộng từ thư viện MSWSOCK.H , bạn cũng phải liên kết với MSWSOCK.DLL

    Khởi tạo winsock

    Mọi ứng dụng sử dụng Winsock đều cần tải phiên bản thích hợp của DLL Winsock. Nếu bạn không tải thư viện Winsock trước khi gọi 1 hàm Winsock, các hàm đó sẽ trả về SOCKET_ERROR , lỗi phát sinh là WSANOTINITIALISED . Để tải thư viện Winsock , bạn sử dụng hàm WSAStartup :40pxwVersionRequested : Để xác định phiên bản thư viện Winsock muốn tải.
    Có thể sử dụng MAKEWORD(x,y). Ví dụ muốn tải phiên bản Winsock 2.0 : MAKEWORD(0,2).
    lpWSAData : Là 1 con trỏ trỏ tới cấu trúc
    WSADATA . Là tham số out. Hàm WSAStartup() sẽ điền các thông tin liên quan đến phiên bản cần tải vào cấu trúc này.


    Mã:
    typedef  struct WSAData  {     WORD           wVersion;     WORD            wHighVersion;     char            szDescription[WSADESCRIPTION_LEN + 1];      char            szSystemStatus[WSASYS_STATUS_LEN + 1];     unsigned short  iMaxSockets;     unsigned short  iMaxUdpDg;     char FAR *     lpVendorInfo; } WSADATA, * LPWSADATA;
    wVersion : Phiên bản của thư viện.wHighVersion : Phiên bản cao nhất mà thư viện hỗ trợ.szDescription : Mô tả về thư viện.
    szSystemStatus : Trạng thái.
    iMaxSock ets ,iMaxUdpDg : Không dùng đến.
    lpVendorInfo : Thông tin nhà cung cấp.

    Các phiên bản Winsock đã hỗ trợ


    Khi ứng dụng của bạn kết thúc việc sử dụng Winsock, bạn nên sử dụng hàm WSACleanup() để giải phóng các tài nguyên cấp phát bởi Winsock và hùy bỏ mọi cuộc gọi hàm Winsock đang chờ giải quyết.40px

  4. #54
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Kiểm tra lỗi và xử lý

    Hầu hết giá trị không thành công trả lại là SOCKET_ERROR ( -1 ).
    Nếu bạn sử dụng 1 hàm Winsock và có lỗi xảy ra, bạn có thể sử dụng hàm WSAGetLastError() để lấy mã lỗi vừa xảy ra :
    int WSAGetLastError (void);
    Ví dụ :

    Mã:
    #include <winsock2.h>    void main(void)    {       WSADATA wsaData;       // Khởi tạo Winsock phiên bản2.2       if ((Ret = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0)       {                 // Chú ý rằng, hàn WSAStartup() thất bại thì ta không thể                 // sử dụng hàm WSAGetLastError() để lấy mã lỗi được. Thay              // vào đó, ta lấy giá trị trả về của hàm này.                        printf("WSAStartup failed with error %d
    ", Ret);              return;       }       // Setup Winsock communication code here        // When your application is finished call WSACleanup       if (WSACleanup() == SOCKET_ERROR)       {          printf("WSACleanup failed with error %d
    ", WSAGetLastError());       }    }
    Địa chỉ IP

    Địa chỉ 1 giao thức

    - Trong chương này, chúng ta thảo luận cách sử dụng các hàm Winsock để thiết lập kết nối sử dụng giao thức Internet ( Internet Protocol - IP ). Winsock là 1 giao diện giao thức độc lập. - IP được sử dụng trên hầu hết các OS , các mạng cục bộ - Lan , hay các mạng diện rộng - WAN , như Internet.- IP là giao thức phi kết nối và truyển tải dữ liệu không đảm bảo.
    - Có 2 loại giao thức tốt hơn là TCP ( Giao thức điều khiển truyền tải ) và UDP ( Giao thức gói dữ liệu người dùng ). Cả 2 giao thức đều sử dụng IP để truyển tải dữ liệu nên được gọi là TCP/IP và UDP/IP.

    Địa chỉ IPv4

    - Theo IPv4 , máy tính được thể hiện dưới dạng 1 số 32 bit.
    - Khi 1 máy khách muốn kết nối với 1 máy chủ, nó phải biết địa chỉ của máy chủ và công kết nối.
    - Khi 1 máy chủ muốn nghe các yêu cầu từ máy khách chuyển tới , chúng phải chỉ định 1 địa chỉ IP và 1 cổng kết nối cụ thể.
    - Trong Winsock , thông tin địa chỉ IP và cổng dịch vụ được chứa trong cấu trúc SOCKADDR_IN :

    Mã:
    struct sockaddr_in{short sin_family;u_short sin_port;struct in_addr sin_addr;char sin_zero[8];};
    - sin_family : phải set tới AF_INET , chỉ định cho Winsock biết sử dụng địa chỉ IP.
    - sin_port : để xác định dịch vụ của server.
    - sin_addr : Được sử dụng để lưu trữ 1 địa chỉ IPv4 kiểu dữ liệu u_long .
    - Nếu sin_addr.s_addr = INADDR_ANY , thì IP là IP của chính mình. Các server thường ùng IP của chính nó để lắng nghe kết nối.
    - sin_zero : Là vùng đệm để cấu trúc SOCKADDR_IN có cùng kích cỡ với SOCKADDR. Nó hữu dụng khi sử dụng hàm inet_addr() để convert 1 đại chỉ IP dạng chấm sang dạng u_long 32 bit.

    Mã:
    unsigned long inet_addr(const char FAR *cp );
    - cp : Là chuỗi chứa địa chỉ IP dạng num-dot.
    - Nếu cp = NULL , hàm trả về INADDRY_ANY.
    - Nếu cp = " " , hàm trả về 0.
    - Nếu convert thất bại, hàm trả về INADDR_NONE.

    Thứ tự bytes

    Các vi xử lý khác nhau miêu tả các số dưới dạng big-endian và little-endian, phụ thuộc vào chúng được thiết kế như thế nào. Ví dụ, vi xử lý Intel x86 miêu tả các số multibyte dưới dạng little-endian : Các byte sắp xếp từ ít quan trọng nhất tới quan trọng nhất. Khi địa chỉ IP và số cổng được thể hiện dưới dạng số multibyte trên máy tính, chúng được miêu tả ở dạng host-byte. Tuy nhiên, khi địa chỉ IP và số cổng qua 1 mạng , mạng chuẩn mạng Internet quy định rằng các giá trị multibyte phải được miêu tả dưới dạng big-endian ( quan trọng nhất tới ít quan trọng nhất ) , tương đương với dạng network-byte.
    Trên máy tinh : little-endian ( host-byte ).
    Chuẩn mạng Internet : big-endian ( network-byte ).
    Một vài hàm được sử dụng để chuyển các số multibyte dạng host-byte sang network-byte và ngược lại.
    Bốn hàm API chuyển số host-byte sang network-byte :

    Mã:
    u_long htonl(u_long hostlong); int WSAHtonl(SOCKET s,u_long hostlong,u_long FAR * lpnetlong); u_short htons(u_short hostshort); int WSAHtons(SOCKET s,u_short hostshort,u_short FAR * lpnetshort);
    Tiếp là 4 hàm chuyển từ network-byte về host-byte :

    Mã:
    u_long ntohl(u_long netlong); int WSANtohl(    SOCKET s,    u_long netlong,    u_long FAR * lphostlong); u_short ntohs(u_short netshort); int WSANtohs(    SOCKET s,    u_short netshort,    u_short FAR * lphostshort);
    Ví dụ


    Mã:
    SOCKADDR_IN InternetAddr;INT nPortId = 5150; InternetAddr.sin_family = AF_INET; // Chuyển địa chỉ Internet dạng num-dot 136.149.3.29// về dạng nguyên 4-byte, và điền nó vào sin_addr InternetAddr.sin_addr.s_addr = inet_addr("136.149.3.29"); // Biến nPortId lưu trữ ở dạng host-byte order. Chuyển// nPortId về dạng network-byte order, và điền nó vào sin_port. InternetAddr.sin_port = htons(nPortId);

  5. #55
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trên diễn đàn có code truyền file bằng ftp ko, cho e tham khảo với. thấy giao thức kia đủ cả mà sao ko thấy FTP đâu hết.

  6. #56
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Cám ơn bài viết của bạn. Bạn có thể hướng dẫn mình cách sử dụng webservice trong C++ được k?

 

 
Trang 6 của 6 Đầu tiênĐầu tiên ... 456

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •