Thông tin tài liệu:
Một khi đã hoàn thành việc sử dụng socket, dù ở trên Server hay Client, chúng ta phải giải phóng tài nguyên thiết bị đã được liên kết với socket đó.Trước khi ta thực sự đóng một socket, ta nên gọi hàm shutdown (). Chúng ta có thể trực tiếp hủy một socket bằng cách đóng nó, nhưng tốt hơn ta nên gọi hàm shutdown() trước tiên bởi vì điều này đảm bảo rằng: tất cả dữ liệu trong hàng đợi vận chuyển TCP đã được gửi hoặc nhận hết trước khi socket bị đóng....
Nội dung trích xuất từ tài liệu:
Lập trình mạng bằng pocket PC-part 7 Đóng Socket : Một khi đã hoàn thành việc sử dụng socket, dù ở trên Server hay Client,chúng ta phải giải phóng tài nguyên thiết bị đã được liên kết với socket đó. Trước khi ta thực sự đóng một socket, ta nên gọi hàm shutdown (). Chúngta có thể trực tiếp hủy một socket bằng cách đóng nó, nhưng tốt hơn ta nên gọihàm shutdown() trước tiên bởi vì điều này đảm bảo rằng: tất cả dữ liệu tronghàng đợi vận chuyển TCP đã được gửi hoặc nhận hết trước khi socket bị đóng: int shutdown( SOCKET s , int how) ; Tham số s là handle của socket mà ta muốn đóng. Tham số how xác địnhcách thức những hàm socket xảy ra sau được xử lý trên socket này. Có ba tùychọn: SD_RECEIVE, SD_SEND, SE_BOTH. Chọn SD_RECEIVE sẽ ngăn chặnviệc gọi hàm recv() và SD_SEND sẽ ngăn chặn việc gọi hàm send(). Rõ ràngSD_BOTH sẽ dừng việc gửi và nhận dữ liệu trên socket (tuy nhiên, tất cả dữliệu đã nằm trong hàng đợi sẽ được xử lý ). Nếu không có lỗi, hàm shutdown() sẽ trả về 0. Một khi socket đã bịshutdown(), chúng ta không thể dùng nó được nữa, trừ khi chúng ta đóng nó bằnghàm closesocket(). int closesocket(SOCKET s) ; với s làm handle của socket mà ta muốn đóng. Sử dụng MFC: Giới thiệu về lớp CSocket: Hình 3.41 Sơ đồ kế thừa của lớp CSocket. Lớp CSocket kết thừa từ lớp cha của nó là CAsyncSocket, do đó nó thừahưởng những thành phần Windows sockets API của lớp CasyncSocket.Xem chitiết trong MSDN. Những phần tiếp theo chúng ta sẽ khảo sát những thành phần cơ bản củalớp CSocket hỗ trợ cho việc lập trình mạng. Client: Để có thể sử dụng được thư viện CSocket, cần phải làm hai công việc,một là thêm dòng #include vào đầu tập tin có sử dụng lớp Csocket. Công việc thứ hai cần làm là để có thể sử dụng thư viện CSocket là phảigọi hàm AfxSocketInit(NULL) trước khi sử dụng các hàm của lớp Csocket, mụcđích là để khởi tạo thư viện. Nếu không, mọi hàm sử dụng thư viện tuy đượcbiên dịch thành công nhưng vẫn báo lỗi khi thi hành chương trình. Để kết nối đến một cổng chở kết nối, trước tiên ta phải khởi tạo mộtsocket với hàm như sau: BOOL Create(): Hàm tạo socket ở phia Client không có tham số. Nếuviệc tạo socket thành công thì hàm sẽ trả về kết quả khác 0; nếu xảy ra l ỗi thìhàm sẽ trả về kết quả là 0. Ta có thể dùng hàm int GetLastError() để lấy thôngtin mã lỗi. Sau khi đã tạo một socket thành công, bước tiếp theo là ta sẽ dùng socketđó để kết nối đến Server đang mở dịch vụ, ta sẽ dùng hàm sau để kết nối: BOOL Connect(LPCTSTR lpszHostAddress, UINT nHostPort). lpszHostAddress: là địa chỉ của Server mà ta cần kết nối đến. Ta có thểtruyền cho tham số này theo tên miền hoặc theo địa chỉ IP. Ví dụ:“ftp.microsoft.com” hoặc “128.56.22.8” đều được. Mỗi máy tính đều có một địachỉ IP mặc định là “127.0.0.1” hoặc “localhost”. Do đó, nếu như chúng ta thựchành kết nối cho cả Server và Client trên cùng một máy thì ta có thể kết nối đ ếnđịa chỉ này. nHostPort: Là số cổng của dịch vụ mà server đang mở. Ví dụ cổng củadịch vụ web là 80, cổng của dịch vụ ftp là 21...... Sau đây là ví dụ cho việc tạo và kết nối đến dịch vụ cổng 1111 trênServer.CSocket skConnect; If(!skConnect.Create() || !skConnect.Connect(“localhost”,1111)) { coutVí dụ sau sẽ trình bày minh họa cho việc gửi và nhận dữ liệu:Char msg[1000];Int msg_len;While(1){cout While(1) { cout Giá trị khác 0 sẽ được hàm này trả về nếu không có lỗi xảy ra. Ngược lạilà 0.Chúng ta có thể tham khảo mã lỗi thông qua hàm int GetLastError(); Trong CSocket, chúng không cần thiết phải gọi hàm bind(), bởi vì sau khigọi hàm Create() thì tự động hàm bind() sẽ được gọi để kết buộc socket đến địachỉ xác định. Sau khi đã khởi tạo socket thành công, tiếp theo ta sử dụng hàm Listen đ ểnghe ngóng kết nối.BOOL Listen(int backlog = 5 ); backlog: Chiều dài tối đa có mà hàng đợi của những kết nối vào có thểchứa được. Giá trị này giới hạn trong khoảng từ 1 đến 5; mặc định là 5. Nếu không có lỗi thì hàm này sẽ trả về giá trị khác 0; ngược lại sẽ cho giátrị là 0 và mã lỗi sẽ được xác định thông qua hàm GetLastError. Để chấp nhận một kết nối vào trước tiên cần phải khởi tạo socket bằnghàm Create, sau đó một backlog (dãy) các kết nối vào sẽ được xác đ ịnh bởi hàmListen. Sau đó những kết nối này sẽ được chấp nhận bởi hàm Accept. HàmListen chỉ áp dụng cho những socket hỗ trợ kết nối, điển hình là dạngSOCK_STREAM. Socket này được đặt ở chế độ “bị động”_ chế độ mà nhữngkết nối vào được thừa nhận và được xếp hàng chờ đợi bởi tiến trình này. Hàm này thường được sử dụng ở Server( hoặc có thể ở bất kỳ ứng dụngnào muốn chấp nhận kết nối vào) cho phép có nhiều hơn một kết nối được yêucầu ở cùng một thời điểm. Nếu có yêu cầu kết nối nhưng hàng đ ợi đãđầy(nConnectionBacklog ...