// 윈도우 기반이고 함수가 리눅스와 거의 동일함으로 예체를 치고 주석을 첨부하는 식으로 구성한다.


인터넷 주소 할당 ------------


#include <stdio.h>

#include <string.h>

#include <winsock2.h>

void ErrorHandling(char* message);


int main(int argc, char *argv[])

{

WSADATA wsaData;

if( WSAStartup( MAKEWORK(2, 2), &wsaData ) != 0 ) -> 소켓의 버전 생성 및 wsaData 초기화

ErrorHandling( "WSAStartup() error!" );


char *addr = "127.212.124.78";

unsigned long conv_addr = inet_addr(addr); -> 문자열 주소를 빅에디안으로 변환된 32비트형 정수형 주소로 변환한다.

if(conv_addr == INADDR_NONE) 

printf( "Error occured! \n" );

else

printf( "Network orddered integer addr : %#1x \n", conv_addr );

}


// 주소 구조체를 현재 PC에 맞춰서 주소를 넣는다.

{

struct sockaddr_in addr; -> 귀찮은 주소변환을 위해서 할당하는 구조체

char *strPtr;

char strArr[20];


addr.sin_addr.s_addr = htonl( 0x1020304 ); 

strPtr = inet_ntoa(addr.sin_addr);

strcpy(strArr, strPtr);

printf( "Dotted-Decimal notation3 %s \n", strArr );

}


WSACleanup();


return 0;

}


void ErrorHandling( char* message )

{

fputs(message, stderr);

fputc('\n', stderr);

exit(1);

}


소켓에 주소 할당하기 ------------


SOCKET servSock;

struct sockaddr_in servAddr;

char *servPort = "9190";


// 소켓 생성

servSock = socket( PF_INET, SOCK_STREAM, 0 );


// 주소 정보 초기화

memset( &servAddr, 0, sizeof(servAddr) );

servAddr.sin_family = AF_INET;

servAddr.sin_addr.s_addr = htonl( INADDR_ANY );

servAddr.sin_port = htons( atoi(servPort) );


// 주소 할당

bind(servSock, (struct sockaddr*)&servAddr, sizeof(servAddr)  );


윈도우 운영체제용 주소 변환함수(윈도우에서만 사용가능 편하지만 범용성이 없다고 생각하자.) ------------


// 이 함수는 주소정보를 나타내는 문자열을 가지고 주소정보 구조체 변수를 적절히 채워 넣을 때 호출하는 함수이다.

INT WSAAPI WSAStringToAddress( _In_      LPTSTR AddressString, -> IP와 PORT번호를 담고 있는 문자열의 주소값 _In_      INT AddressFamily, -> 첫 번째 인자로 전달된 주소정보가 속하는 주소체계 정보전달. _In_opt_  LPWSAPROTOCOL_INFO lpProtocolInfo, -> 프로토콜 프로바이더(Provider) 설정, 일반적으로 NULL전달 _Out_     LPSOCKADDR lpAddress, -> 주소 정보를 담을 구조체 변수의 주소 값 전달 _Inout_   LPINT lpAddressLength -> 네 번째 인자로 전달된 주소 값의 변수 크기를 담고 있는 변수의 주소 값 );


// 구조체 변수에 저장된 데이터를 참조하여 주소정보를 담고 있는 문자열을 만들어서 반환한다.

INT WSAAPI WSAAddressToString( _In_      LPSOCKADDR lpsaAddress, -> 문자열로 변환할 주소정보를 지니는 구조체 변수의 주소 값 전달 _In_      DWORD dwAddressLength, -> 첫번째 인자로 전달된 구조체 변수의 크기 전달 _In_opt_  LPWSAPROTOCOL_INFO lpProtocolInfo, -> 프로토콜 프로바이더(Provider) 설정, 일반적으로 NULL전달 _Inout_   LPTSTR lpszAddressString, -> 문자열로 변환된 결과를 저장할 배열의 주소 값 전달 _Inout_   LPDWORD lpdwAddressStringLength -> 네 번째 인자로 전달된 주소 값의 배열 크기를 담고 있는 변수의 주소 값 전달 );



Posted by JJOREG