Profile

THINK. CREATE. SOLVE.

JasonRecord

[TCP/IP] 구조체 보내기

소켓에서 구조체를 주고 받을 때, 구조체 자체를 주고 받는 것이 아니라

구조체를 캐릭터형으로 캐스팅하여 보내고, 받는 쪽에서도 캐릭터로 캐스팅된 구조체를 다시

구조체형으로 캐스팅하여 받는 것.

 

유저의 아이디와 패스워드를 가지고 있는 구조체를 보낸다.

 

클라이언트 부분

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int len = sizeof(root);
 
//구조체 크기
retval = send(sock, (char*)&len, sizeof(int), 0);    
if (retval == SOCKET_ERROR)
{
    err_display("send()");
    break;
}
 
//데이터 보냄
retval = send(sock, (char*)&root, sizeof(User), 0);
if (retval == SOCKET_ERROR)
{
    err_display("send()");
    break;
}
cs

 

서버 부분

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
int len;
 
//구조체 크기 받기
retval = recvn(client_sock, (char*)&len, sizeof(int), 0);
if (retval == SOCKET_ERROR)
{
    err_display("recv()");
    break;
}
else if (retval == 0)
    break;
 
//구조체 데이터 받기
retval = recv(client_sock, buf, len, 0);
if (retval == SOCKET_ERROR)
{
    err_display("recv()");
    break;
}
else if (retval == 0)
    break;
 
buf[retval] = '\0';
 
User *temp;
temp = (User*)buf;
 
if (strcmp(root.id, temp->id) == 0 && strcmp(root.pw, temp->pw) == 0)
{
    printf("[TCP 서버] 클라이언트 %s:%d 로그인\n",
    inet_ntoa(clientaddr.sin_addr), ntohs(clientaddr.sin_port));
    strcpy(msg, "로그인 성공");
}
else if (strcmp(root.id, temp->id) != 0)
{
    strcpy(msg, "아이디가 다릅니다");
}
else if (strcmp(root.pw, temp->pw) != 0)
{
    strcpy(msg, "비밀번호가 다릅니다");
}
cs