Data+

#3. 소켓 프로그래밍으로 간단한 채팅프로그램 만들기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
62
63
64
65
66
67
68
69
70
71
72
#include <WinSock2.h>
#include <stdio.h>
#include <process.h>
#include <conio.h>
#pragma comment(lib, "ws2_32.lib")
 
#define bufsize 1024
 
char buf[bufsize];
int client_socket;
void read(void*) {
    while(1) {
        recv(client_socket, buf, sizeof(buf), 0);
        printf("[client] : %s\n", buf);
        memset(buf, 0, bufsize);
    }
}
 
int main(){
    WSADATA wsa;
 
    if(WSAStartup(MAKEWORD(2,2), &wsa) != 0) {
        printf("not equal version\n");
        return 0;
    }
 
    int server_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;
    }
 
    _beginthread(read, 0, (void*)1);
    while(1){
        char send_buf[bufsize];
        memset(send_buf, 0, bufsize);
        printf("input data : ");
        gets(send_buf);
        fflush(stdin);
        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
47
48
49
50
51
52
53
#include <WinSock2.h>
#include <stdio.h>
#include <process.h>
 
#pragma comment(lib, "ws2_32.lib")
 
#define bufsize 1024
 
int server_socket;
char read_buf[bufsize];
void read(void*) {
    while(1) {
        memset(read_buf, 0, bufsize);
        recv(server_socket, read_buf, bufsize, 0);
        printf("[Server] : %s\n", read_buf);
    }
}
 
int main(){
    WSADATA wsa;
    char buf[bufsize];
 
    if(WSAStartup(MAKEWORD(2,2), &wsa)) {
        printf("Not Equal Version\n");
        return 0;
    }
    
    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;
    }
    _beginthread(read, 0, (void*)1);
    while(1) {
        printf("input data : ");
        gets(buf);
        fflush(stdin);
        send(server_socket, buf, sizeof(buf), 0);
        memset(buf, 0, bufsize);
    }
    return 0;
}
cs

블로그의 정보

Data+

Qerogram

활동하기