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 |
'C,C++ ' 카테고리의 다른 글
IOCP Server & Client C 예제코드 (winsock2) [IOCP Server & Client using winsock2 via C (0) | 2012.06.06 |
---|---|
C언어로 MYSQL 사용하기 [윈도우] (Access MySQL via C language) [windows] (0) | 2012.05.24 |
ohhara 덤프 코드 출력 코드 헤더 [펌] (0) | 2012.04.27 |
음성채팅 프로그램 분석 [client] (Analysis about Voice chat) (1) | 2012.04.13 |
음성 파일 보낼때 음성타입 구조체 (The structure WAVE for Matex) (0) | 2012.04.12 |