Wikipedia에서 http://en.wikipedia.org/wiki/Berkeley_sockets#bind.28.29
잇다():
connect () 시스템 호출은 파일 설명 자로 식별되는 소켓을 인수 목록에서 해당 호스트의 주소로 지정된 원격 호스트에 연결합니다.
특정 유형의 소켓은 비 연결형이며 가장 일반적으로 사용자 데이터 그램 프로토콜 소켓입니다. 이러한 소켓의 경우 connect는 특별한 의미를 갖습니다. 데이터를 보내고 받기위한 기본 대상이 주어진 주소로 설정되어 연결없는 소켓에서 send () 및 recv ()와 같은 함수를 사용할 수 있습니다.
connect ()는 오류 코드를 나타내는 정수를 반환합니다. 0은 성공을 나타내고 -1은 오류를 나타냅니다.
묶다():
bind ()는 소켓을 주소에 할당합니다. socket ()을 사용하여 소켓을 만들면 프로토콜 패밀리 만 제공되고 주소는 할당되지 않습니다. 주소와의이 연관은 소켓이 다른 호스트에 대한 연결을 허용하기 전에 bind () 시스템 호출로 수행되어야합니다. bind ()는 세 가지 인수를 사용합니다.
sockfd, 바인드를 수행 할 소켓을 나타내는 설명자. my_addr, 바인딩 할 주소를 나타내는 sockaddr 구조에 대한 포인터. addrlen, sockaddr 구조의 크기를 지정하는 socklen_t 필드. Bind ()는 성공하면 0을 반환하고 오류가 발생하면 -1을 반환합니다.
예 : 1.) 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.) 결합 예 :
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);
}
그 차이를 명확히 해주기를 바랍니다.
선언하는 소켓 유형은 필요한 사항에 따라 다르며 이는 매우 중요합니다.