6/28/2007

[Network] TCP 서버 프로그램 작성시 사용되는 함수들

** TCP 서버 프로그램 작성시 사용되는 함수들

- 서버용 struct sockaddr_in 구조체의 주소에서 INADDR_ANY 값을 볼 수 있다. 클라이언트용 sockaddr_in 구조체의 주소 값에는 접속한 서버의 IP 주소를 넣게 되지만, 서버용 sockaddr_in 구조체의 주소 값에는 접속될 클라이언트, 즉 자신에게 접속할 클라이언트의 주소를 넣게 되어 있다. 서버용 struct sockaddr_in에 특정 IP 주소를 넣으면 해당 클라이언트에서만 접속할 수 있는 문제가 생기므로 INADDR_ANY 값을 넣어서 모든 클라이언트에서 접속할 수 있게 만든다.

- INADDR_ANY 값은 0으로 정의되어 있다.

#define INADDR_ANY ((unsigned long int) 0x00000000)

- INADDR_ANY 값을 넣을 때 사용하는 htonl 함수는 htons 함수와 비슷하게 long형 숫자에 네트워크 바이트 오더를 적용해서 반환하는 역할을 한다. htons 함수는 short형 숫자를 변환할때 사용하지만 htonl 함수는 long형 숫자를 변환할 때 사용한다.


* htonl 함수 : 32비트 네트워크 바이트 오더형 숫자 htonl (32비트 호스트 오더형 숫자)

-> 32비트의 호스트 오더형 숫자를 네트워크 바이트 오더의 숫자로 변경한다. 인텔 CPU에서는 리틀 엔디안인 32비트 숫자 변수를 네트워크 바이트 오더인 빅 엔디안을 적용한 후 반환한다.

#include <netinet/in.h>
uint32_t htonl (uint32_t hostlong)


* bind 함수 : 성공 여부 반환 bind (소켓 디스크립터, 로컬 주소, 로컬 주소 구조체 크기)

-> 생성된 소켓에 로컬 주소를 할당한다. 로컬 주소에 설정할 수 있는 옵션은 연결될 클라이언트의 주소 패밀리, IP 정보, 포트 정보가 있다. 성공하면 0을 반환하고 오류가 발생하면 -1을 반환하면서 errno에 오류 번호를 넣는다.

#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen)


* listen 함수 : 성공 여부 반환 listen (소켓 디스크립터, 최대 연결할 큐의 길이)

-> 해당 소켓에서 연결을 기다린다. 연결의 큐의 길이만큼만 가능하며 일반적으로 5를 많이 사용한다. 성공하면 0을 반환하고 오류가 발생하면 -1을 반환하면서 errno에 오류 번호를 넣는다.

#include <sys/socket.h>
int listen(int s, int backlog)


* accept 함수 : 성공한 소켓 디스크립터 accept (소켓 디스크립터, 접속한 상대편 연결 정보, 연결 정보 길이)

-> 해당 소켓에 연결 요청이 들어왔을 때 연결을 받아들인다. 연결 요청이 없는 경우에는 연결 요청이 발생할 때까지 대기 상태에서 해당 소켓을 계속 감시한다. 오류가 발생하면 -1을 반환하고 연결에 성공하면 해당 소켓 디스크립터인 음이 아닌 정수를 반환한다.

#include <sys/types.h>
#include <sys/socket.h>
int accept(int s, struct sockaddr *addr, socklen_t *addrlen)


* write 함수 : 성공 시 쓰여진 데이터 길이 write (파일 디스크립터, 전송할 버퍼, 전송할 데이터 길이)

-> 버퍼에서 데이터를 읽어서 파일 디스크립터에 인수로 주어진 크기만큼 쓴다. 쓰기에 성공하면 쓰기에 성공한 길이를 반환하고 오류가 발생하면 -1을 반환하면서 errno에 오류 번호를 넣는다.

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count)


* close 함수 : 성공 여부 반환 close (파일 디스크립터)

-> close 함수는 파일 디스크립터를 닫는다. 닫혀진 파일 디스크립터는 더 이상 어떤 파일에 의해서 참조되거나 사용될 수 없다. 닫기에 성공하면 0을 반환하고 오류가 발생하면 -1을 반환한다.

#include <unistd.h>
int close(int fd)