Từ Wikipedia http://en.wikipedia.org/wiki/Berkeley_sockets#bind.28.29
kết nối():
Lệnh gọi hệ thống connect () kết nối một ổ cắm, được xác định bởi bộ mô tả tệp của nó, với một máy chủ từ xa được chỉ định bởi địa chỉ của máy chủ đó trong danh sách đối số.
Một số loại ổ cắm không có kết nối, thông thường nhất là ổ cắm giao thức datagram của người dùng. Đối với các ổ cắm này, kết nối có một ý nghĩa đặc biệt: mục tiêu mặc định để gửi và nhận dữ liệu được đặt thành địa chỉ đã cho, cho phép sử dụng các hàm như send () và recv () trên các ổ cắm không kết nối.
connect () trả về một số nguyên đại diện cho mã lỗi: 0 đại diện cho thành công, trong khi -1 đại diện cho một lỗi.
trói buộc():
bind () gán một socket cho một địa chỉ. Khi một ổ cắm được tạo bằng socket (), nó chỉ được cấp một họ giao thức, nhưng không được gán một địa chỉ. Việc liên kết với một địa chỉ này phải được thực hiện với lệnh gọi hệ thống bind () trước khi socket có thể chấp nhận kết nối với các máy chủ khác. bind () có ba đối số:
sockfd, một bộ mô tả đại diện cho socket để thực hiện liên kết. my_addr, một con trỏ đến cấu trúc sockaddr đại diện cho địa chỉ để liên kết. addrlen, một trường socklen_t xác định kích thước của cấu trúc sockaddr. Bind () trả về 0 khi thành công và -1 nếu xảy ra lỗi.
Ví dụ: 1.) Sử dụng Connect
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
int main(){
int clientSocket;
char buffer[1024];
struct sockaddr_in serverAddr;
socklen_t addr_size;
/*---- Create the socket. The three arguments are: ----*/
/* 1) Internet domain 2) Stream socket 3) Default protocol (TCP in this case) */
clientSocket = socket(PF_INET, SOCK_STREAM, 0);
/*---- Configure settings of the server address struct ----*/
/* Address family = Internet */
serverAddr.sin_family = AF_INET;
/* Set port number, using htons function to use proper byte order */
serverAddr.sin_port = htons(7891);
/* Set the IP address to desired host to connect to */
serverAddr.sin_addr.s_addr = inet_addr("192.168.1.17");
/* Set all bits of the padding field to 0 */
memset(serverAddr.sin_zero, '\0', sizeof serverAddr.sin_zero);
/*---- Connect the socket to the server using the address struct ----*/
addr_size = sizeof serverAddr;
connect(clientSocket, (struct sockaddr *) &serverAddr, addr_size);
/*---- Read the message from the server into the buffer ----*/
recv(clientSocket, buffer, 1024, 0);
/*---- Print the received message ----*/
printf("Data received: %s",buffer);
return 0;
}
2.) Ví dụ ràng buộc:
int main()
{
struct sockaddr_in source, destination = {}; //two sockets declared as previously
int sock = 0;
int datalen = 0;
int pkt = 0;
uint8_t *send_buffer, *recv_buffer;
struct sockaddr_storage fromAddr; // same as the previous entity struct sockaddr_storage serverStorage;
unsigned int addrlen; //in the previous example socklen_t addr_size;
struct timeval tv;
tv.tv_sec = 3; /* 3 Seconds Time-out */
tv.tv_usec = 0;
/* creating the socket */
if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
printf("Failed to create socket\n");
/*set the socket options*/
setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval));
/*Inititalize source to zero*/
memset(&source, 0, sizeof(source)); //source is an instance of sockaddr_in. Initialization to zero
/*Inititalize destinaton to zero*/
memset(&destination, 0, sizeof(destination));
/*---- Configure settings of the source address struct, WHERE THE PACKET IS COMING FROM ----*/
/* Address family = Internet */
source.sin_family = AF_INET;
/* Set IP address to localhost */
source.sin_addr.s_addr = INADDR_ANY; //INADDR_ANY = 0.0.0.0
/* Set port number, using htons function to use proper byte order */
source.sin_port = htons(7005);
/* Set all bits of the padding field to 0 */
memset(source.sin_zero, '\0', sizeof source.sin_zero); //optional
/*bind socket to the source WHERE THE PACKET IS COMING FROM*/
if (bind(sock, (struct sockaddr *) &source, sizeof(source)) < 0)
printf("Failed to bind socket");
/* setting the destination, i.e our OWN IP ADDRESS AND PORT */
destination.sin_family = AF_INET;
destination.sin_addr.s_addr = inet_addr("127.0.0.1");
destination.sin_port = htons(7005);
//Creating a Buffer;
send_buffer=(uint8_t *) malloc(350);
recv_buffer=(uint8_t *) malloc(250);
addrlen=sizeof(fromAddr);
memset((void *) recv_buffer, 0, 250);
memset((void *) send_buffer, 0, 350);
sendto(sock, send_buffer, 20, 0,(struct sockaddr *) &destination, sizeof(destination));
pkt=recvfrom(sock, recv_buffer, 98,0,(struct sockaddr *)&destination, &addrlen);
if(pkt > 0)
printf("%u bytes received\n", pkt);
}
Tôi hy vọng điều đó làm rõ sự khác biệt
Xin lưu ý rằng loại ổ cắm mà bạn khai báo sẽ phụ thuộc vào những gì bạn yêu cầu, điều này cực kỳ quan trọng