본문 바로가기
IT창고/Network

소켓 옵션

by 창구창고 2007. 1. 22.
반응형
SetSockOpt();
1. 멀티캐스트 그룹가입
  IP_ADD_MEMBERSHIP
2. TP_TTL
  1로 놓으면 라우터 하나만 지나면 패기된다.
3. SO_REVSE_ADDR -> 윈도우에서 잘 사용하지 않음...
#define WIN32_LEAN_AND_MEAN // windows.h 에서 자주 사용하지 않은 것은 컴파일에서 제외 한다.
							// winsock2.h외의 충돌을 막아 준다.

#include<stdio.h>
#include<windows.h>
#include<winsock2.h>

#pragma comment(lib, "ws2_32.lib")

void main()
{
	WSADATA wsadata;

	//if(WSAStartup(0x0202, &wsadata) != 0)			//0x0202는 뒤에서부터 읽어서 2.2버젼을 쓰라는 이야기다.
	if(WSAStartup(MAKEWORD(2,2), &wsadata) != 0)	//많이 사용... 앞에서 부터 읽는다.
	{
		printf("Can't Initialize Socket !\n");
		return ;
	}	
	//------------------------------------------
	char url[256] = { 0 };
	printf("접속할 URL을 입력하세요 >> ");
	scanf("%s",url);fflush(stdin);

	//URL -> IP로 변경하기.
	HOSTENT * p = gethostbyname(url);
	int index = 0;
	while(p->h_addr_list[index])
	{

	in_addr addr = *((in_addr *)(p->h_addr_list[index]));

	printf("IP Address : %s\n", inet_ntoa( addr ));
	index++;
	}
	//------------------------------------------
	in_addr serverip = *((in_addr *)(p->h_addr_list[0]));

	SOCKET s = socket( AF_INET, SOCK_STREAM, 0 );
	//------------------------소켓옵션 추가 부분-----------------------------

	//서버 단의 소켓은 종료 후에도 TIME_WAIT 만큼 대기 하므로 종료후 즉시 다시 실행 했을때 bind() 가 실패한다.(리눅스/유닉스 에서)
	//서버 종료후 바로 재시동 할 수 있게 하려면 아래 Option 을 지정해야 한다.
	
	BOOL b = TRUE;
	setsockopt(s, SOL_SOCKET, //option level
		SO_REUSEADDR, // option name
		(char*)&b,  //option 설정값
		sizeof(b)); //option 값의 크기
	
	//수신 버퍼를 키우려면 역시 option 을 지정해야 한다.
	
	int sz = 8192;
	
	setsockopt(s, SOL_SOCKET, SO_RCVBUF, (char*)&sz, sizeof(sz));
	
	//UDP client 가 BROADCAST 가 가능하게 하는 optin(x.x.x.255)
	BOOL bBroad = TRUE;
	setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*)&bBroad, sizeof(bBroad));

	//------------------------소켓옵션 추가 부분-----------------------------

	SOCKADDR_IN addr_in = { 0 };
	addr_in.sin_family				= AF_INET;
	addr_in.sin_port				= htons(80);//웹서버 포트번호
	addr_in.sin_addr				= serverip;

	if(connect(s, (SOCKADDR* )&addr_in, sizeof(addr_in)) == -1)
	{
		printf("Can't connect to server!!\n");
		closesocket(s);
		return ;
	}
	printf("Connected server!!\n");

	//서버에 HTTP 요청 팻킷을 보낸다.
	char buf[256] ="GET / HTTP/1.0\r\n\r\n";

	send(s, buf, strlen(buf)+1, 0);

	//서버에서 오는 data를 수신한다.
	char data[4096] = { 0};
	recv(s, data, 4096, 0 );
	 
	printf("%s\n",data);

	closesocket(s);

	//------------------------------------------
	WSACleanup();
}
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."