Khi bạn đã tạo một socket, bạn có thể dùng nó để thiết lập một kết nối đến server . Ta dùng hàm connect() để thực hiện việc này:int connect (SOCKET s, const struct sockaddr *name, int namelen ).Tham số đầu tiên, s, xác định socket descriptor được trả về bởi hàm socket() .
Nội dung trích xuất từ tài liệu:
Lập trình mạng bằng pocket PC-part 6 Kết nối đến Server ( từ Client ) : Khi bạn đã tạo một socket, bạn có thể dùng nó để thiết lập một kết nốiđến server . Ta dùng hàm connect() để thực hiện việc này: int connect (SOCKET s, const struct sockaddr *name, int namelen ). Tham số đầu tiên, s, xác định socket descriptor được trả về bởi hàm socket(). Tham số name là socket address structure , SOCKADDR_IN , xác định server màta định kết nối .Tham số namelen là chiều dài của bộ đệm dành cho tham s ốnameNếu ta thành công trong việc thiết lập một kết nối đến Server xác định bởi thamsố name , thì hàm này sẽ trả về giá trị 0, ngược lại lỗi một SOCKET_ERROERsẽ xảy ra. Để tìm xem thông tin vì sao không thiết lập được kết nối ta gọi hàmWSAGetLastError () . Nên nhớ rằng ta không thể gọi hàm connect() trên mộtsocket đã được kết nối. Một khi một kết nối đã được thiết lập, thì socket sẵn sàng gửi và nhận dữliệu . Chú ý rằng: Nếu một kết nối đã bị đứt (broken) trong lúc Client và Serverđang truyền tin với nhau thì ứng dụng của ta cần phải bỏ socket cũ và tạo mộtsocket mới để thiết lập lại việc truyền tin giữa Client và Server. Ví dụ sau trình bày cách kết nối đến Server : // First, get the host information HOSTENT *hostServer = gethostbyname(www.microsoft.com); if(hostServer == NULL) { int iSocketError = WSAGetLastError(); return FALSE; } // Set up the target device address structure SOCKADDR_IN sinServer; memset(&sinServer, 0, sizeof(SOCKADDR_IN)); sinServer.sin_family = AF_INET; sinServer.sin_port = htons(80); sinServer.sin_addr = *((IN_ADDR *)hostServer->h_addr_list[0]); // Connect with a valid socket if(connect(s, (SOCKADDR *)&sinServer, sizeof(sinServer)) == SOCKET_ERROR) { int iSocketError = WSAGetLastError(); return FALSE; } // Do something with the socket closesocket(s); Gửi và nhận dữ liệu : Chúng ta đã thiết lập một kết nối đến server, đã sẵn sàng cho việc gửi vànhận dữ liệu giữa hai máy trên mạng. Trên một kết nối socket, dữ liệu có thểđược truyền cả hai hướng, Server và Client có thể dùng cùng phương thức đểtruyền tin với nhau. Để truyền dữ liệu trên một kết nối socket ta dùng phương thức send(),được xác định như sau: int send (SOCKET s, const char *buf, int len, int flags) ; Tham số s là socket handle mà ta đã dùng với hàm connect () ở trên, và nóđược tạo lúc đầu bằng hàm socket(). Tham số buf là một con trỏ, trỏ đến bộđệm chứa dữ liệu mà ta muốn gửi, và chiều dài của nó được xác định bởi thamsố len. Tham số cuối cùng, flags, được dùng để xác định cách dữ liệu đ ược gửi,có giá trị là 0 hoặc MSG_DONTROUTE. Thông thường, tham số này được thiếtlập là 0, và MSG_DONTROUTE chỉ dùng cho việc kiểm tra hoặc định đường đicho thông điệp. Giá trị trả về của hàm send() là số byte thực sự được gửi trên mạng hoặcmột SOCKET_ERROR nếu có lỗi trong việc truyền dữ liệu. Để nhận dữ liệu trên một socket, ta dùng hàm recv(): int recv ( SOCKET s , char *buf , int len , int flags ) ; Tương tự như trên, tham số s chỉ socket mà chúng ta thiết lập để nhận dữliệu . Tham số thứ hai, buf, là một bộ đệm để nhận dữ liệu, kích thước của nóđược xác định bởi tham số len. Cuối cùng, tham số flags, thường được thiết lậplà 0. Giá trị trả về của hàm recv() là số byte nhận được hoặc là 0 nếu kết nốibị đóng . Hàm cũng sẽ trả về một SOCKET_ERROR nếu có lỗi xảy ra . Chú ý rằng: cả hai hàm send() và recv() không luôn luôn đọc hoặc ghichính xác số lượng dữ liệu mà ta đã yêu cầu. Điều này là do TCP/IP cấp phátmột số lượng không gian bộ đệm có hạn cho hàng đợi dữ liệu đi và vào, vàthường thì bộ đệm này đầy khá nhanh. Ví dụ, nếu chúng ta yêu cầu một file 10MB từ một trang web, hàng đợi dữ liệu vào của ta sẽ khóa cho đ ến khi ta đ ọcđược dữ liệu từ hàng đợi này (dùng hàm receive()). Việc truyền dữ liệu cũngtương tự như thế, cho nên chúng ta cần đảm bảo rằng: tất cả dữ liệu ra củachúng ta đã được gửi.Ví dụ sau thể hiện việc gửi dữ liệu bộ đệm trên TCP: // Send a request to the server char cBuffer[1024] = ; int nBytesSent = 0; int nBytesIndex = 0; // Set up the buffer to send sprintf(cBuffer, GET / HTTP/1.0
); int nBytesLeft = strlen(cBuffer); // Send the entire buffer while(nBytesLeft > 0) { nBytesSent = send(s, &cBuffer[nBytesIndex], nBytesLeft, 0); if(nBytesSent == SOCKET_ERROR) break; // See how many bytes are left. If we still need to send, loop nBytesLeft -= nBytesSent; nBytesIndex += nBytesSent; } Ví dụ: Ví dụ sau trình bày cách dùng socket TCP để tạo một client cơ bản đ ể kếtnối với một trang web, gửi yêu cầu, và nhận trang web HTML mặc đ ịnh. Khithực hiện thành công, ...