728x90

윈도우에서 MSG_OOB 관찰 방법

- 시그널 핸들링은 linux 계열에서 사용하는 방법이기 때문에 windows에서는 사용 불가

- 윈도우에서는 MSG_OOB 메시지 처리를 위해 select 함수를 사용

- select 함수에서 예외 발생에서 처리

int main(int argc, char *argv[])
{
	WSADATA wsaData;
	SOCKET hAcptSock, hRecvSock;
	
	fd_set read, except, readCopy, exceptCopy;
	struct timeval timeout;
	
	if(WSAStartup(MAKEWORD(2, 2), &wsaData)!=0)
		ErrorHandling("WSAStartup() error!");
	
	hAcptSock=socket(PF_INET, SOCK_STREAM, 0);
	...;
	FD_ZERO(&read);
	FD_ZERO(&except);
	FD_SET(hRecvSock, &read);
	FD_SET(hRecvSock, &except);

	while(1)
	{  
		readCopy=read;
		exceptCopy=except;
		timeout.tv_sec=5;
		timeout.tv_usec=0; 
		
		result=select(0, &readCopy, 0, &exceptCopy, &timeout);

		if(result>0)
		{
			if(FD_ISSET(hRecvSock, &exceptCopy))
			{
				strLen=recv(hRecvSock, buf, BUF_SIZE-1, MSG_OOB);
				buf[strLen]=0;
				printf("Urgent message: %s \n", buf);
			} // 긴급 메시지	

			if(FD_ISSET(hRecvSock, &readCopy))
			{
				strLen=recv(hRecvSock, buf, BUF_SIZE-1, 0);
				if(strLen==0)
				{
					break;
					closesocket(hRecvSock);
				}
				else 
				{	   
					buf[strLen]=0;
					puts(buf); 
				}	
			} // 일반 메시지				
		}
	}
	
	closesocket(hAcptSock);
	WSACleanup();
	return 0; 
}
728x90

+ Recent posts