소켓의 다양한 옵션
소켓의 타입 변경
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main()
{
int tcp_sock, udp_sock;
int sock_type=-1;
socklen_t optlen;
int state;
optlen=sizeof(sock_type);
tcp_sock=socket(PF_INET, SOCK_STREAM, 0);
udp_sock=socket(PF_INET, SOCK_DGRAM, 0);
printf("SOCK_STREAM : %d \n", SOCK_STREAM);
printf("SOCK_DGRAM : %d \n", SOCK_DGRAM);
state=getsockopt(tcp_sock, SOL_SOCKET, SO_TYPE, &sock_type, &optlen);
if(state)
{
printf("tcp getsockopt error");
}
printf("첫번째 소켓의 타입은 [%d]\n", sock_type);
state=getsockopt(udp_sock, SOL_SOCKET, SO_TYPE, &sock_type, &optlen);
if(state)
{
printf("udp getsockopt error");
}
printf("두번째 소켓의 타입은 [%d]\n", sock_type);
return 0;
}
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
int main()
{
int tcp_sock, udp_sock;
int sock_type=-1;
socklen_t optlen;
int state;
optlen=sizeof(sock_type);
tcp_sock=socket(PF_INET, SOCK_STREAM, 0);
udp_sock=socket(PF_INET, SOCK_DGRAM, 0);
printf("SOCK_STREAM : %d \n", SOCK_STREAM);
printf("SOCK_DGRAM : %d \n", SOCK_DGRAM);
state=getsockopt(tcp_sock, SOL_SOCKET, SO_TYPE, &sock_type, &optlen);
if(state)
{
printf("tcp getsockopt error");
}
printf("첫번째 소켓의 타입은 [%d]\n", sock_type);
state=getsockopt(udp_sock, SOL_SOCKET, SO_TYPE, &sock_type, &optlen);
if(state)
{
printf("udp getsockopt error");
}
printf("두번째 소켓의 타입은 [%d]\n", sock_type);
return 0;
}
소켓 버퍼의 크기 변경
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
int main()
{
int sock;
int snd_buf=500;
int rcv_buf=1000;
int state;
socklen_t len;
sock=socket(PF_INET, SOCK_STREAM, 0);
/* 입출력 버퍼 크기 설정 */
state=setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &rcv_buf, sizeof(rcv_buf));
if(state)
{
printf("rcv setsockopt error");
}
state=setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &snd_buf, sizeof(snd_buf));
if(state)
{
printf("snd setsockopt error");
}
/* 입출력 버퍼 크기 추출 */
len=sizeof(rcv_buf);
state=getsockopt(sock, SOL_SOCKET,SO_RCVBUF, &rcv_buf, &len);
if(state)
{
printf("rcv getsockopt error");
}
len=sizeof(snd_buf);
state=getsockopt(sock, SOL_SOCKET,SO_SNDBUF, &snd_buf, &len);
if(state)
{
printf("snd getsockopt error");
}
printf("데이터 입력받기 위한 소켓의 버퍼 크기 : [%d]\n", rcv_buf);
printf("데이터 출력받기 위한 소켓의 버퍼 크기 : [%d]\n", snd_buf);
return 0;
}
소켓 옵션을 변경할때는 setsockopt()함수를 사용한다. 원형은 다음과 같다.
int setsockopt(int s, int level, int opt. const char *optval, int optlen);
s : 옵션을 바꿀 소켓 번호
level : 프로토콜 레벨(일반적인 옵션 일 경우 SOL_SOCKET, IP프로토콜 일 경우 IPPROTO_IP,
TCP에 관한 내용 일 경우 IPPROTO_TCP를 선택)
opt : 선택할 옵션(맨 위의 표 참조)
*optval : 옵션 지정에 필요한 값의 포인터
optlen : *optval의 크기
소켓의 현재 옵션 값을 알아내려면 getsockopt() 함수를 사용한다. 원형은 다음과 같다.
int getsockopt(int s, int level, int opt, const char *optval, int *len);
setsockopt() 함수와 같다. 단 optval,len은 입력인자가 아닌 값을 얻는 출력 인자가 된다.
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
int main()
{
int sock;
int snd_buf=500;
int rcv_buf=1000;
int state;
socklen_t len;
sock=socket(PF_INET, SOCK_STREAM, 0);
/* 입출력 버퍼 크기 설정 */
state=setsockopt(sock, SOL_SOCKET, SO_RCVBUF, &rcv_buf, sizeof(rcv_buf));
if(state)
{
printf("rcv setsockopt error");
}
state=setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &snd_buf, sizeof(snd_buf));
if(state)
{
printf("snd setsockopt error");
}
/* 입출력 버퍼 크기 추출 */
len=sizeof(rcv_buf);
state=getsockopt(sock, SOL_SOCKET,SO_RCVBUF, &rcv_buf, &len);
if(state)
{
printf("rcv getsockopt error");
}
len=sizeof(snd_buf);
state=getsockopt(sock, SOL_SOCKET,SO_SNDBUF, &snd_buf, &len);
if(state)
{
printf("snd getsockopt error");
}
printf("데이터 입력받기 위한 소켓의 버퍼 크기 : [%d]\n", rcv_buf);
printf("데이터 출력받기 위한 소켓의 버퍼 크기 : [%d]\n", snd_buf);
return 0;
}
소켓 옵션을 변경할때는 setsockopt()함수를 사용한다. 원형은 다음과 같다.
int setsockopt(int s, int level, int opt. const char *optval, int optlen);
s : 옵션을 바꿀 소켓 번호
level : 프로토콜 레벨(일반적인 옵션 일 경우 SOL_SOCKET, IP프로토콜 일 경우 IPPROTO_IP,
TCP에 관한 내용 일 경우 IPPROTO_TCP를 선택)
opt : 선택할 옵션(맨 위의 표 참조)
*optval : 옵션 지정에 필요한 값의 포인터
optlen : *optval의 크기
소켓의 현재 옵션 값을 알아내려면 getsockopt() 함수를 사용한다. 원형은 다음과 같다.
int getsockopt(int s, int level, int opt, const char *optval, int *len);
setsockopt() 함수와 같다. 단 optval,len은 입력인자가 아닌 값을 얻는 출력 인자가 된다.
'네트워크 > 리눅스 기반 강의' 카테고리의 다른 글
2010년 12월 22일 수요일 시그널 함수 (0) | 2010.12.22 |
---|---|
2010년 12월 21일 화요일 클라이언트 프로그램 작성 절차 (0) | 2010.12.21 |
2010년 12월 15일 수요일 인터넷 주소 변환 & 도메인네임으로 IP주소 알아내기 (0) | 2010.12.15 |
2010년 12월 14일 화요일 UNIX BSD 소켓 시스템 콜 (0) | 2010.12.14 |
2010년 12월 13일 월요일 (TCP/IP 기초) (0) | 2010.12.13 |