*sockaddr_in 구조체 struct sockaddr_in
{
__SOCKADDR_COMMON (sin_);
in_port_t sin_port; /* Port number. */ struct in_addr sin_addr; /* Internet address. */
/* Pad to size of `struct sockaddr'. */ unsignedchar sin_zero[sizeof (struct sockaddr) -
__SOCKADDR_COMMON_SIZE - sizeof (in_port_t) - sizeof (struct in_addr)];
};
*포트번호
2바이트이므로 65535까지 사용가능하지만 1024까지는 시스템이 사용하고 그 이후의 포트번호가 할당된다
예를 들면 80번은 web서비스를 위해 사용된다
*IP주소 설정
서버에서 serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1")로 설정을 해주거나
다음과 같이 설정할 수도 있다
inet_pton(AF_INET,"127.0.0.1",&stAddr.sin_addr.s_addr );
*bind() intbind(intsockfd, structsockaddr *my_addr, socklen_t addrlen); bind()함수는 소켓을 우리가 설정한 구조체내용(iP주소,PORT번호)로 setting하는 것이다
bind함수의 두번째 인자는 (struct sockaddr*)로 캐스팅한다 (우리가 인터넷 기반으로 사용하는 sockaddr_in
구조체를 bind함수는 인자로 받지 않는다)
sockaddr과 sockaddr_in구조체를 비교해 보면 크기가 동일하고 멤버들의 갯수와 이름이 다름을 볼 수 있다
반환값-- 성공시 0을 실패시 -1을 반환
이제 서버에서 sockaddr_in구조체의 내용을 소켓에 bind하였으므로 우리는 그 IP주소와 port번호로 통신이 가능하다
클라이언트에서는 bind()대신 connect()함수를 사용해서 위와 같이 소켓 디스크립터와 sockaddr_in구조체를 연결시키는 것을 볼 수 있다
위의 소켓 setting까지는 서버와 클라이언트모두 대동소이하다
*listen()
int listen(int s,int backlog);
listen함수는 소켓에서 연결을 기다리는 역할을 한다 연결요청이 들어오면 accept()를 호출하여 다른소켓(communication socket)을 생성한다
listen함수의 두번째 인자는 연결을 기다리는 클라이언트를 저장하는 대기큐의 최대수이다
반환값-- 성공시 0을 실패시 -1을 반환
*accept()
int accept(int s, struct sockaddr *addr ,socklen_t * addrlen);
accept()함수는 클라이언트가 들어올때 까지 블로킹되어 있다
랑데뷰소켓(bind소켓)은 클라이언트에서 보내져서 큐상에서 대기하고 있는 정보(서버와 통신을 원하는 클라이언트의 정보)를 두번째 인자에 연결한 다음 클라이언트소켓과 연결된 새로운 소켓을 반환한다
앞으로 그 클라이언트와의 통신은 반환된 소켓 디스크립터를 사용한다
반환값-- 성공시 communication 소켓 디스크립터, 실패시 -1을 반환
이 communicatoin 소켓을 이용하여 통신을 한다
*예제코드
//server.c #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> int main()
{ struct sockaddr_in stAddr; struct sockaddr_in iAddr; int iAddsize =sizeof(struct sockaddr_in); int iDs; int iAccept; int rtnval; int iRet; unsignedchar ucBuff [256] ={0,};
iDs = socket(AF_INET ,SOCK_STREAM,IPPROTO_TCP); if(iDs <0)
{
perror("socket() failed\n"); return 0;
}
bzero(&stAddr,sizeof(stAddr));
stAddr.sin_family= AF_INET;
rtnval=inet_pton(AF_INET,"127.0.0.1",&stAddr.sin_addr.s_addr); if (rtnval==0)
{
perror("inet_pton() failed invalid address string\n");
close (iDs); return 0;
}