2012. 5. 22. 21:44

winsock 에서 사용하는 함수를 linux 소켓에서 사용하기 

혹시 나처럼 winsock.h 를 어떻게든 리눅스에 올려서 사용할 수 없을까? 를 고민하는 사람이 있다면, "그냥 linux 환경에서 다시짜는게 훨씬 속 편하다" 라는 답을 주고 싶다.


멤버십 과제로 증강현실 온라인 게임을 과제로 할 계획인데, 평소에 winsock2.h 로  소켓통신을 한지라 linux 헤더에 대한 의심을 하기 시작하던 중이다. 


예전에 winsock 공부를 할때 책에 "윈도우 소켓은 리눅스 소켓에서도 조금만 변경하여 사용 할 수 있다 " 라고 하여 그대로 복사 하였다가 수천개의 오류를 검출 했던 기억이 있던 중 indra 형이 아래와 같은 헤더를 던저 주셨다. 


아래의 헤더는 WIN32 환경일 시와 리눅스 환경일 시 어느정도 호환성을 맞춰주는 헤더이다. 


완전 매력!  헤더 원본명은 winlin.h 이고 부작용 없이 소켓을 사용 할수 있는 헤더이다. 



 

#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

#include <string.h>


/**********************************************************************

 *                             WINDOWS

 *********************************************************************/

#ifdef WIN32

#include <malloc.h>

#include <windows.h>

#include <io.h>

#include <conio.h>

#include <winsock.h>

#include <lm.h>

#include <Shlwapi.h>


#pragma comment (lib, "ws2_32")

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

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

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

#pragma comment (lib, "advapi32")


#define open            _open

#define read            _read

#define write           _write

#define lseek           _lseek


#define unlink(f) _unlink(f);

#define sleep(s)        _sleep(s*1000)

#define close(s)        \

if(closesocket(s) == SOCKET_ERROR) { \

if(_close(s) != -1) { \

s = 0; \

} \

} else { \

s = 0; \

}


#define O_RDONLY        _O_RDONLY

#define O_RDWR          _O_RDWR

#define O_APPEND _O_APPEND

#define O_CREAT         _O_CREAT

#define O_BINARY        _O_BINARY


#define DIR_DELIM '\\'


char logbuffer[4096];


#define snprintf(b, s, ...) \

        memset(b, 0x00, s); \

        _snprintf(b, s - 1, __VA_ARGS__)


#define _DEBUG(...) \

        memset(logbuffer, 0x00, sizeof(logbuffer)); \

        memcpy(logbuffer, "[DEBUG] ", 8); \

        _snprintf(logbuffer + strlen(logbuffer), sizeof(logbuffer) - strlen(logbuffer) - 1, __VA_ARGS__); \

        logbuffer[strlen(logbuffer) - 1] = (logbuffer[strlen(logbuffer) - 1] == '\n' ? ' ' : logbuffer[strlen(logbuffer) - 1]); \

        _snprintf(logbuffer + strlen(logbuffer), sizeof(logbuffer) - strlen(logbuffer) - 1, " - %s(), %d line\n", __FUNCTION__, __LINE__); \

        OutputDebugString(logbuffer)


#define _ERROR(...) \

        memset(logbuffer, 0x00, sizeof(logbuffer)); \

        memcpy(logbuffer, "[ERROR] ", 8); \

        _snprintf(logbuffer + strlen(logbuffer), sizeof(logbuffer) - strlen(logbuffer) - 1, __VA_ARGS__); \

        logbuffer[strlen(logbuffer) - 1] = (logbuffer[strlen(logbuffer) - 1] == '\n' ? ' ' : logbuffer[strlen(logbuffer) - 1]); \

        _snprintf(logbuffer + strlen(logbuffer), sizeof(logbuffer) - strlen(logbuffer) - 1, " - %s(), %d line\n", __FUNCTION__, __LINE__); \

        OutputDebugString(logbuffer)


#define system(cmdline) \

STARTUPINFO si; \

PROCESS_INFORMATION pi; \

ZeroMemory( &pi, sizeof(pi) ); \

ZeroMemory( &si, sizeof(si) ); \

si.cb = sizeof(si); \

si.wShowWindow = SW_HIDE; \

CreateProcess(NULL, cmdline, NULL, NULL,TRUE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi); \

WaitForSingleObject(pi.hProcess, INFINITE)


#else


/**********************************************************************

 *                             LINUX

 *********************************************************************/

#include <utime.h>

#include <unistd.h>

#include <netdb.h>

#include <string.h>

#include <pthread.h>

#include <sys/stat.h>

#include <sys/wait.h>

#include <sys/socket.h>

#include <sys/types.h>

#include <sys/ioctl.h>

#include <netinet/in.h>

#include <net/if.h>

#include <arpa/inet.h>


#define TRUE 1

#define FALSE 0


#define ERROR_ALREADY_EXISTS 1


#define O_BINARY 0


#define DIR_DELIM '/'


char logbuffer[4096];


#define _DEBUG(...) \

        memset(logbuffer, 0x00, sizeof(logbuffer)); \

        memcpy(logbuffer, "[DEBUG] ", 8); \

        snprintf(logbuffer + strlen(logbuffer), sizeof(logbuffer) - strlen(logbuffer), __VA_ARGS__); \

        logbuffer[strlen(logbuffer) - 1] = (logbuffer[strlen(logbuffer) - 1] == '\n' ? ' ' : logbuffer[strlen(logbuffer) - 1]); \

        snprintf(logbuffer + strlen(logbuffer), sizeof(logbuffer) - strlen(logbuffer), " - %s(), %d line\n", __func__, __LINE__); \

        fprintf(stdout, "%s", logbuffer); \

fflush(stdout)


#define _ERROR(...) \

        memset(logbuffer, 0x00, sizeof(logbuffer)); \

        memcpy(logbuffer, "[ERROR] ", 8); \

        snprintf(logbuffer + strlen(logbuffer), sizeof(logbuffer) - strlen(logbuffer), __VA_ARGS__); \

        logbuffer[strlen(logbuffer) - 1] = (logbuffer[strlen(logbuffer) - 1] == '\n' ? ' ' : logbuffer[strlen(logbuffer) - 1]); \

        snprintf(logbuffer + strlen(logbuffer), sizeof(logbuffer) - strlen(logbuffer), " - %s(), %d line\n", __func__, __LINE__); \

        fprintf(stderr, "%s", logbuffer); \

fflush(stderr)


#endif



/**********************************************************************

 *                             COMMON

 *********************************************************************/


#define CONN_TMOUT_SEC 1

#define CONN_TMOUT_USEC 0


#define RECV_TMOUT_SEC 5

#define RECV_TMOUT_USEC 0


#define MAX_LOCAL_ETHER 10


#define FSIZE 256

#define LINESIZE 1024




Posted by k1rha