gethostbyname : 도메인 이름 -> 바이너리 IP 주소


gethostbyaddr : 바이너리 IP 주소 -> 도메인 이름


inet_addr : 10진 문자열 IP -> 바이너리 IP주소


inet_ntoa : 바이너리 IP 주소 -> 10진 문자열 IP이다.



'서버프로그래밍' 카테고리의 다른 글

내 머릿속에 남아있는 HANDlE의 의의  (0) 2018.05.27
가변길이 패킷  (0) 2018.05.27
브로드 캐스트 주소 구하기  (0) 2018.05.27
간단한 Multi클라이언트  (0) 2018.05.27
간단한 서버  (0) 2018.05.27
이번 학기는 팀 작업이 유난히 많다.

처음 해보는 팀작업을 두 세개씩 하다보면  시행착오를 거쳐서 요령이 생기는 것 같다. 

일단 작업 분배에 있어서 정확하지 않고 어중간하면 너무 어중간하게 빈틈이 많이 나오는 것 같았다. 

부분 부분 만들어지지 않은 곳이 많아서 모여서 볼 시간도 없는데 그러한 빈틈을 메꾸는데 1주일의 시간이 더 걸렸다.

두 번째로 스크립트 작성 시 항상 범용성을 생각하며 작성하도록 노력하고 그것을 팀원에게도 요구 하는 것이다.
이러한 과정을 통해서 팀원의 스크립트를 가져다 쓰기 편리해졌고 내 코딩도 깨끗해 진 느낌이 들었다.

그런데 한 번은 러닝게임에서 오브젝트풀링을 구현하는데 이 스크립트를 사용할 사람을 위해 오브젝트 출현시간, 오브젝트 갯수, 위치 등 많은 것을 조정할 수 있게 해줬었는데 그렇게 되다보니 오히려 코드작성보다 더 어려운 사용법이 되버렸었다.

사용자의 의향을 너무 자세하게 맞춰주려고 하다보니 오히려 번거로워서 쓰기 싫어지는 것이다.  마치 레스토랑 서비스에서 웨이터가 손님에게 하나부터 열까지 전부다 물어봐서 손님이 화났다는 이야기가 생각났다.

그리고 자기가 만든 스크립트가 확실히 애착가고 소중하지만 잘못만들었거나 제대로 됬음에도 팀작업간 효율이 떨어진다 싶으면 인정하고 바꾸는 것은 생각보다 중요하다고 생각했다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
 
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
 
 
#include <iostream>
#include <WinSock2.h>
#include <tchar.h>
#include <string.h>
using namespace std;
 
 
#pragma comment(lib,"ws2_32.LIB")
 
#define COUNT 5
 
#define SIZEOFTHREAD 3
 
 
 
class MultiClient {
    char ServerIp[100];
    char ClientIp[100];
    SOCKET sock;
    SOCKET Mysock;
    struct sockaddr_in myaddr;
 
public:
    MultiClient() {
        memset(ClientIp, '\0'sizeof(char* 100);
        cout << "Server Ip :";
        cin >> ServerIp;
        sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
        Mysock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
        int size = sizeof(myaddr);
        bool result = getsockname(Mysock, (struct sockaddr*)&myaddr, &size);
        
        if (result) {
            strcpy_s(ClientIp, inet_ntoa(myaddr.sin_addr));
            cout << "ClientIp : " << ClientIp << endl;
        }
        else {
            cout << "Get My Ip failed" << endl;
            return;
        }
 
    }
 
    void Run() {
 
        try {
            if (sock == INVALID_SOCKET)
                throw "Do not make Socket";
            struct sockaddr_in addr;
            addr.sin_family = AF_INET;
            addr.sin_port = htons(9000);
            addr.sin_addr.s_addr = inet_addr(ServerIp);//문자열 10진수 주소를 바이너리주소로 바꿔줌
            if (connect(sock, (struct sockaddr*)&addr, sizeof(addr)) == SOCKET_ERROR) {
                throw "connect error";
            }
            int count = COUNT;
            while (count > 0) {
                send(sock, ClientIp, strlen(ClientIp), 0);
                char recvbuf[200];
                memset(recvbuf, '\0'sizeof(char* 200);
                
                int recvsize = recv(sock, recvbuf, 2000);
                    cout << "Recive buf :" << recvbuf << " how many recive ? : "<< recvsize << endl;
                int temp = atoi(recvbuf);
                temp += 10;
                cout << "temp : " << temp << endl;
                
                char sendBuf[10];
                memset(sendBuf, '\0'sizeof(char* 10);
                
                _itoa(temp, sendBuf, 10);
                cout << "Send buf : " << sendBuf << endl;
                send(sock, sendBuf, strlen(sendBuf), 0);
                cout <<"after buf : "<<sendBuf <<" count : " << count << endl;
                count--;
            }
            char quit[10= "quit";
            send(sock, quit, strlen(quit), 0);
        }
        catch (char* msg) {
            cout << msg << endl;
            LPVOID lpOSMsg;
            FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
                FORMAT_MESSAGE_FROM_SYSTEM |
                FORMAT_MESSAGE_IGNORE_INSERTS,
                NULL, WSAGetLastError(),
                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                (LPSTR)&lpOSMsg, 0NULL);
            cout << "[" << (char*)lpOSMsg << "]" << endl;
            LocalFree(lpOSMsg);
        }
        if (sock != INVALID_SOCKET) {
            //Sleep(1000);
            cout << "close socket" << endl;
            closesocket(sock);
        }
 
    }
 
};
 
DWORD WINAPI ThreadProc(LPVOID pParam) {
 
    cout << "Enter Thread" << endl;
    MultiClient* mc = (MultiClient*)pParam;
    mc->Run();
    return 0;
}
int main(int argc, char* argv[]) {
 
    WSADATA wsaData;
    BYTE nMajor = 2, nMinor = 2;
    WORD wVersionRequested = MAKEWORD(nMinor, nMajor);
    if (WSAStartup(wVersionRequested, &wsaData) == SOCKET_ERROR) {
        cout << "socket initialize failed" << endl;
        return -1;
    }
 
    if (LOBYTE(wsaData.wVersion) != nMajor || HIBYTE(wsaData.wVersion) != nMinor) {
        cout << "socket version not equal" << endl;
        WSACleanup();
        return -1;
    }
 
 
    while (true) {
        MultiClient mc[SIZEOFTHREAD];
 
        HANDLE hThread[SIZEOFTHREAD];
        DWORD dwThreadId[SIZEOFTHREAD];
        for (int i = 0; i < SIZEOFTHREAD; i++) {
            hThread[i] = CreateThread(NULL0, ThreadProc, (LPVOID)&mc[i], 0&dwThreadId[i]);
        }
        WaitForMultipleObjects(SIZEOFTHREAD, hThread, TRUE, INFINITE);
    
        /*for (int i = 0; i < SIZEOFTHREAD; i++)
            mc[i].Run();
*/
        cout << "IF exit : exit" << endl;
        char temp[10];
        cin >> temp;
        if (strcmp(temp, "exit"== 0break;
        
    }
    WSACleanup();
    
 
    return 0;
}
cs


'서버프로그래밍' 카테고리의 다른 글

내 머릿속에 남아있는 HANDlE의 의의  (0) 2018.05.27
가변길이 패킷  (0) 2018.05.27
브로드 캐스트 주소 구하기  (0) 2018.05.27
서버 주소 변환 함수  (0) 2018.05.27
간단한 서버  (0) 2018.05.27

+ Recent posts