본문 바로가기

[+] Information/[-] Network

[2009/06/22] 옵션 예제소스(sock_type.c, set_buf.c, get_buf.c, get_buf_win.c)

/* sock_type.c */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>

void error_handling(char *message);

int main(int argc, char **argv)
{
 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)
  error_handling("getsockopt() error!");
 printf("첫 번째 소켓의 타입은 %d \n", sock_type);
 
 state=getsockopt(udp_sock, SOL_SOCKET, SO_TYPE, &sock_type, &optlen);
 if(state)
  error_handling("getsockopt() error!");
 printf("두 번째 소켓의 타입은 %d \n", sock_type);
 
 return 0;
}

void error_handling(char *message)
{
 fputs(message, stderr);
 fputc('\n', stderr);
 exit(1);
}





/* set_buf.c */

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>

void error_handling(char *message);

int main(int argc, char **argv)
{
 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)
  error_handling("getsockopt() error!");
 
 state = setsockopt(sock, SOL_SOCKET, SO_SNDBUF, &snd_buf, sizeof(snd_buf));
 if(state)
  error_handling("getsockopt() error!");
 
 len = sizeof(snd_buf);
 state = getsockopt(sock, SOL_SOCKET, SO_SNDBUF, &snd_buf, &len);
 if(state)
  error_handling("setsockopt() error!");
 
 len = sizeof(rcv_buf);
 state = getsockopt(sock, SOL_SOCKET, SO_RCVBUF, &rcv_buf, &len);
 if(state)
  error_handling("setsockopt() error!");
 
 printf("데이터 입력을 위한 소켓의 버퍼 크기 : %d \n", rcv_buf);
 printf("데이터 출력을 위한 소켓의 버퍼 크기 : %d \n", snd_buf);
 
 return 0;
}

void error_handling(char *message)
{
 fputs(message, stderr);
 fputc('\n', stderr);
 exit(1);
}





/* get_buf.c */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>

void error_handling(char *message);

int main(int argc, char **argv)
{
 int sock; 
 
 int snd_buf;
 int rcv_buf;
 
 int state;
 socklen_t len;
 
 sock = socket(PF_INET, SOCK_STREAM, 0);
 
 len = sizeof(snd_buf);
 state = getsockopt(sock, SOL_SOCKET, SO_SNDBUF, &snd_buf, &len);
 if(state)
  error_handling("getsockopt() error");
 
 len = sizeof(rcv_buf);
 state = getsockopt(sock, SOL_SOCKET, SO_RCVBUF, &rcv_buf, &len);
 if(state)
  error_handling("getsockopt() error");
 
 printf("데이터 입력을 위한 소켓의 버퍼 크기 : %d \n", rcv_buf);
 printf("데이터 출력을 위한 소켓의 버퍼 크기 : %d \n", snd_buf);
 
 return 0;
}

void error_handling(char *message)
{
 fputs(message, stderr);
 fputc('\n', stderr);
 exit(1);
}





/* get_buf_win.c */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>

#define BUFSIZE 30

void ErrorHandling(char *message);

int main(int argc, char **argv)
{
 WSADATA  wsaData;
 SOCKET hSocket;
 
 int sndBuf;
 int rcvBuf;
 int state;
 int len;
 
 if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
  ErrorHandling("WSAStartup() error!");
 
 hSocket = socket(PF_INET, SOCK_STREAM, 0);
 
 len=sizeof(sndBuf);
 state=getsockopt(hSocket, SOL_SOCKET, SO_SNDBUF, (char*)&sndBuf, &len);
 if(state==SOCKET_ERROR)
  ErrorHandling("getsockopt() error");
 
 len=sizeof(rcvBuf);
 state=getsockopt(hSocket, SOL_SOCKET, SO_RCVBUF, (char*)&rcvBuf, &len);
 if(state==SOCKET_ERROR)
  ErrorHandling("getsockopt() error");
 
 printf("윈도우즈 입력 버퍼 크기 : %d \n", rcvBuf);
 printf("윈도우즈 출력 버퍼 크기 : %d \n", sndBuf);
 
 WSACleanup();
 return 0;
}

void ErrorHandling(char *message)
{
 fputs(message, stderr);
 fputc('\n', stderr);
 exit(1);
}