Data+

#2. 소켓 프로그래밍으로 간단한 채팅프로그램 만들기 in C

by Qerogram

서론

간단한 채팅 자체는 이전 게시글로도 충분히 구현이 가능하다.

어느정도 개발 후엔 흥미가 싹 사라져서 더 이상 소켓에 관한 게시글은 업로드 되지 않을 것이다.

 

진행과정

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
#include <WinSock2.h>
#include <stdio.h>
 
#pragma comment(lib, "ws2_32.lib")
 
#define bufsize 1024
 
int main(){
    WSADATA wsa;
    char buf[bufsize];
 
    if(WSAStartup(MAKEWORD(2,2), &wsa) != 0) {
        printf("not equal version\n");
        return 0;
    }
 
    int server_socket, client_socket, client_addr_size;
    server_socket = socket(PF_INET, SOCK_STREAM, 0);
    if(SOCKET_ERROR == server_socket){
        printf("Create Socket Fail\n");
        return 0;
    }
 
    SOCKADDR_IN server_addr, client_addr;
    memset(&server_addr, 0sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(4777);
    server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
 
    if(SOCKET_ERROR == bind(server_socket , (const sockaddr*)&server_addr, sizeof(server_addr))) {
        printf("Fail binding\n");
        return 0;
    }
 
    if(SOCKET_ERROR == listen(server_socket, 5)) {
        printf("대기상태 설정 실패\n");
        return 0;
    }
    
    client_addr_size = sizeof(client_addr);
    client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &client_addr_size);
 
    if(SOCKET_ERROR == client_socket) {
        printf("Client Connect Fail\n");
        return 0;
    }
 
    while(1){
        recv(client_socket, buf, sizeof(buf), 0);
        printf("[client] : %s\n", buf);
        char send_buf[bufsize];
        memset(send_buf, 0, bufsize);
        printf("input data : ");
        scanf("%s", send_buf);
        send(client_socket, send_buf, sizeof(send_buf), 0);
    }
    closesocket(client_socket);
    closesocket(server_socket);
    WSACleanup();
    return 0;
}
cs

2. 클라이언트 측 코드

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
#include <WinSock2.h>
#include <stdio.h>
 
#pragma comment(lib, "ws2_32.lib")
 
#define bufsize 1024
 
int main(){
    WSADATA wsa;
    char buf[bufsize];
    if(WSAStartup(MAKEWORD(2,2), &wsa)) {
        printf("Not Equal Version\n");
        return 0;
    }
    
    int server_socket;
 
    server_socket = socket(PF_INET, SOCK_STREAM, 0);
    if(SOCKET_ERROR == server_socket) {
        printf("Socket Create Error\n");
        return 0;
    }
 
    SOCKADDR_IN server_addr;
    memset(&server_addr, 0sizeof(server_addr));
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(4777);
    server_addr.sin_addr.S_un.S_addr = htonl(0x7F000001);
 
    if(SOCKET_ERROR == connect(server_socket, (const sockaddr*)&server_addr, sizeof(server_addr))){
        printf("not connect\n");
        return 0;
    }
 
    while(1) {
        printf("input data : ");
        scanf("%s", buf);
        send(server_socket, buf, sizeof(buf), 0);
        memset(buf, 0, bufsize);
        recv(server_socket, buf, bufsize, 0);
        printf("[Server] : %s\n", buf);
        memset(buf, 0, bufsize);
    }
    return 0;
}
 
cs

 

Reference

#1. 소켓 프로그래밍 기초 in C

http://forum.falinux.com/zbxe/index.php?document_srl=438301&mid=C_LIB

블로그의 정보

Data+

Qerogram

활동하기