Trang 6 trên tổng số 6 Đầu tiênĐầu tiên ... 456
Từ 51 tới 60 trên tổng số 60 kết quả

Đề tài: Lập Trình Mạng Với Thư Viện Winsock trên VC++

  1. #51
    Ngày gia nhập
    11 2007
    Nơi ở
    Hà Nội
    Bài viết
    520

    Mặc định Lập Trình Mạng Với Thư Viện Winsock trên VC++

    Trích dẫn Nguyên bản được gửi bởi spyhunter88 Xem bài viết
    Mình đang phải làm cái này để gửi - nhận qua mạng. Mình dùng non-blocking, khai báo các sự kiện FD_READ, FD_WRITE ... Mình đang băn khoăn là có chọn TCP, nhưng làm thế nào biết được gói tin mình gửi đi có tới được đích hay không.

    Theo mình được biết, thì khi Server gọi hàm Send() thì bản tin mới chỉ gửi thành công tới bộ đệm của Socket để chờ gửi đi. Vậy quá trình tiếp sau đó : gửi tin từ bộ đệm tới Client mà lỗi thì làm sao nhận biết được.
    Liệu chỉ dùng hàm Send(), có sự kiện FD_CLOSE thì liệu gửi qua mạng có chắc yên tâm là gửi đến nơi đến chốn không? Nếu không thì sự kiện nào sẽ thông báo cho mình biết là không gửi được (sau khi dùng hàm Send() thành công).
    TCP có cơ chế tự gửi lại bạn ạ. Nếu gửi không thành công, nó tự động gửi lại Sau một số lần không gửi được nó sẽ báo lỗi, thông qua giá trị trả về là số byte đã gửi thành công.

    Để chắc chắn, bạn có thể lập trình là sau khi nhận được toàn bộ nội dung thì bên nhận sẽ reply lại , ví dụ như reply lại message OK và CRC32 của dữ liệu nhận được.

  2. #52
    Ngày gia nhập
    12 2008
    Bài viết
    53

    Trích dẫn Nguyên bản được gửi bởi quangnh89 Xem bài viết
    TCP có cơ chế tự gửi lại bạn ạ. Nếu gửi không thành công, nó tự động gửi lại Sau một số lần không gửi được nó sẽ báo lỗi, thông qua giá trị trả về là số byte đã gửi thành công.

    Để chắc chắn, bạn có thể lập trình là sau khi nhận được toàn bộ nội dung thì bên nhận sẽ reply lại , ví dụ như reply lại message OK và CRC32 của dữ liệu nhận được.
    Hồi project tháng trước làm loại này = java, cứ tự thêm vô cho client và Sever cơ chể an toàn(khi bên kia gửi, bên nhận nhận được phải gửi lại là đã nhận được) trong khi đó dùng TCP. Giờ lên đọc mới biết bị hớ
    Như vậy nếu tự code cái cơ chế an toàn thì dùng quách UDP cho rồi. Dùng TCP uổng công mấy nhà thiết kế giao thức TCP cho cái tầng transport của TCP/IP rồi

    Giờ bị bắt làm 1 ứng dụng viết Console Application trên C++, may là làm java trước đó rồi, nên đọc bài của anh Kenvin Hoàng mượt như cú trượt iPhone, code thôi ...

    (Rất tiếc 4rum ko có nút thanks + texbox để gõ số lần )
    Giấc mơ con đè nát cuộc đời con..
    void main(){
    string myWish={"Vợ","Con","Hầm","Bánh","Lầu","Múi (Cơ bụng)"};
    for( int i = 1 ; i<=6; i++){
    printf("%d %s ",i,myWish[i-1]); }}

  3. #53
    Ngày gia nhập
    05 2011
    Bài viết
    4

    đánh dấu cái.đang nghiên cứu làm đồ án liên quan đến vấn đề socket.

  4. #54
    Ngày gia nhập
    02 2012
    Bài viết
    1

    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 :((

  5. #55
    Ngày gia nhập
    12 2008
    Nơi ở
    Hà Nội
    Bài viết
    374

    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 :
    C Code:
    1. int  WSAStartup(
    2.      WORD  wVersionRequested,
    3.      LPWSADATA  lpWSAData
    4.  );
    wVersionRequested : Để 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.

    C Code:
    1. typedef  struct WSAData
    2.  {
    3.      WORD           wVersion;
    4.      WORD            wHighVersion;
    5.      char            szDescription[WSADESCRIPTION_LEN + 1];
    6.      char            szSystemStatus[WSASYS_STATUS_LEN + 1];
    7.      unsigned short  iMaxSockets;
    8.      unsigned short  iMaxUdpDg;
    9.      char FAR *     lpVendorInfo;
    10.  } 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ợ
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		Screenshot_24.png
Lần xem:	2
Size:		10.4 KB
ID:		9883

    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.
    C Code:
    1. int WSACleanup(void);

    Đã được chỉnh sửa lần cuối bởi luc13aka47 : 30-07-2012 lúc 01:54 PM.

  6. #56
    Ngày gia nhập
    12 2008
    Nơi ở
    Hà Nội
    Bài viết
    374

    Mặc định Lập Trình Mạng Với Thư Viện Winsock trên VC++

    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ụ :
    C Code:
    1. #include <winsock2.h>
    2.     void main(void)
    3.     {
    4.        WSADATA wsaData;
    5.        // Khởi tạo Winsock phiên bản2.2
    6.        if ((Ret = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0)
    7.        {
    8.                  // Chú ý rằng, hàn WSAStartup() thất bại thì ta không thể
    9.                  // sử dụng hàm WSAGetLastError() để lấy mã lỗi được. Thay
    10.               // vào đó, ta lấy giá trị trả về của hàm này.
    11.          
    12.               printf("WSAStartup failed with error %d\n", Ret);
    13.               return;
    14.        }
    15.        // Setup Winsock communication code here
    16.        // When your application is finished call WSACleanup
    17.        if (WSACleanup() == SOCKET_ERROR)
    18.        {
    19.           printf("WSACleanup failed with error %d\n", WSAGetLastError());
    20.        }
    21.     }


    Đị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 :
    C Code:
    1. struct sockaddr_in
    2. {
    3. short sin_family;
    4. u_short sin_port;
    5. struct in_addr sin_addr;
    6. char sin_zero[8];
    7. };
    - 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.
    C Code:
    1. unsigned long inet_addr
    2. (
    3. const char FAR *cp
    4. );
    - 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 :
    C Code:
    1. u_long htonl(u_long hostlong);
    2.  
    3. int WSAHtonl(
    4. SOCKET s,
    5. u_long hostlong,
    6. u_long FAR * lpnetlong
    7. );
    8.  
    9. u_short htons(u_short hostshort);
    10.  
    11. int WSAHtons(
    12. SOCKET s,
    13. u_short hostshort,
    14. u_short FAR * lpnetshort
    15. );

    Tiếp là 4 hàm chuyển từ network-byte về host-byte :
    C Code:
    1. u_long ntohl(u_long netlong);
    2.  
    3. int WSANtohl(
    4.     SOCKET s,
    5.     u_long netlong,
    6.     u_long FAR * lphostlong
    7. );
    8.  
    9. u_short ntohs(u_short netshort);
    10.  
    11. int WSANtohs(
    12.     SOCKET s,
    13.     u_short netshort,
    14.     u_short FAR * lphostshort
    15. );


    Ví dụ

    C Code:
    1. SOCKADDR_IN InternetAddr;
    2. INT nPortId = 5150;
    3.  
    4. InternetAddr.sin_family = AF_INET;
    5.  
    6. // Chuyển địa chỉ Internet dạng num-dot 136.149.3.29
    7. // về dạng nguyên 4-byte, và điền nó vào sin_addr
    8.  
    9. InternetAddr.sin_addr.s_addr = inet_addr("136.149.3.29");
    10.  
    11. // Biến nPortId lưu trữ ở dạng host-byte order. Chuyển
    12. // nPortId về dạng network-byte order, và điền nó vào sin_port.
    13.  
    14. InternetAddr.sin_port = htons(nPortId);
    Đã được chỉnh sửa lần cuối bởi luc13aka47 : 30-07-2012 lúc 03:29 PM.

  7. #57
    Ngày gia nhập
    05 2012
    Bài viết
    1

    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.

  8. #58
    Ngày gia nhập
    09 2013
    Bài viết
    2

    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?

  9. #59
    Ngày gia nhập
    04 2016
    Bài viết
    8

    pro ơi ! cho mình hơi mình muốn send và recv các giá trị kiểu int, hay float thì làm thế nào ạ !

  10. #60
    Ngày gia nhập
    06 2011
    Bài viết
    39

    xin hỏi giao tiếp giữa 2 ứng dụng trên cùng một máy thì có cách nào chỉ dùng port mà không dùng IP không ?
    Press any key to continue
    fuck china

Trang 6 trên tổng số 6 Đầu tiênĐầu tiên ... 456

Các đề tài tương tự

  1. Lập trình Winsock trong C# | Winsock programing with C#
    Gửi bởi ZCoder87 trong diễn đàn Tutorials và Thủ thuật lập trình C#, ASP.NET
    Trả lời: 27
    Bài viết cuối: 07-04-2013, 11:55 AM
  2. Cách tạo voice chat bằng winsock viết trên MFC Dialog?
    Gửi bởi phamduyhung trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 0
    Bài viết cuối: 26-06-2012, 04:39 PM
  3. Sách MFC Winsock tiếng việt tìm ở đâu?
    Gửi bởi aptx1987 trong diễn đàn Công cụ, ebooks VC++
    Trả lời: 1
    Bài viết cuối: 23-08-2011, 06:39 PM
  4. Borland C++ Lỗi Thư viện winsock,winsock2
    Gửi bởi tauit_dnmd trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 05-04-2010, 08:49 PM
  5. Lập trình winsock trên VC++. Lỗi do đâu?
    Gửi bởi vietwow trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 2
    Bài viết cuối: 02-06-2009, 04:26 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn