I. server.c
1 #include <stdio.h>
2 #include <sys/socket.h>
3 #include <arpa/inet.h>
4 #include <string.h>
5 #include <stdlib.h>
6 #include <unistd.h>
7
8 #define BUF_SIZE 1024
9
10 void error_handling(char* message);
11
12 int main (int argc, char* argv[]) {
13 int serv_sock, clnt_sock;
14 char message[BUF_SIZE];
15 int str_len, i;
16
17 struct sockaddr_in serv_adr;
18 struct sockaddr_in clnt_adr;
19 socklen_t clnt_adr_sz;
20
21 FILE* readfp;
22 FILE* writefp;
23
24 if(argc!=2) {
25 printf("Usage: %s <port>\n", argv[0]);
26 exit(1);
27 }
28
29 serv_sock=socket(PF_INET, SOCK_STREAM, 0);
30 if(serv_sock==-1) error_handling("socket() error");
31
32 memset(&serv_adr, 0, sizeof(serv_adr));
33 serv_adr.sin_family=AF_INET;
34 serv_adr.sin_addr.s_addr=htonl(INADDR_ANY);
35 serv_adr.sin_port=htons(atoi(argv[1]));
36
37 if(bind(serv_sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr))==-1) error_handling("bind() error");
38 if(listen(serv_sock, 5)==-1) error_handling("listen() error");
39 clnt_adr_sz=sizeof(clnt_adr);
40
41 for(i=0; i<5; i++) {
42 clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_adr, &clnt_adr_sz);
43 if(clnt_sock==-1) error_handling("accept() error");
44 else printf("Connected client %d\n", i+1);
45 readfp = fdopen(clnt_sock, "r");
46 writefp = fdopen(clnt_sock, "w");
47 while(!feof(readfp)) {
48 fgets(message, BUF_SIZE, readfp);
49 fputs(message, writefp);
50 fflush(writefp);
51 }
52 fclose(readfp);
53 fclose(writefp);
54 }
55 close(serv_sock);
56 return 0;
57 }
58
59 void error_handling(char* message) {
60 fputs(message, stderr);
61 fputc('\n', stderr);
62 exit(1);
63 }
II. client.c
1 #include <stdio.h>
2 #include <sys/socket.h>
3 #include <arpa/inet.h>
4 #include <string.h>
5 #include <stdlib.h>
6 #include <unistd.h>
7
8 #define BUF_SIZE 1024 //메시지 최대 길이. 한글 3n+1, 영문 n+1
9
10 void error_handling(char* message);
11
12 int main(int argc, char* argv[]) {
13 int sock;
14 char message[BUF_SIZE];
15 int str_len;
16 struct sockaddr_in serv_adr;
17
18 FILE* readfp;
19 FILE* writefp;
20
21 if(argc!=3) {//실행 명령어 입력 유효성 검사
22 printf("Usage: %s <IP> <port>\n", argv[0]);
23 exit(1);
24 }
25
26 sock=socket(PF_INET, SOCK_STREAM, 0);
27 if(sock==-1) error_handling("socket() error");
28
29 //서버 주소정보 초기화
30 memset(&serv_adr, 0, sizeof(serv_adr));
31 serv_adr.sin_family=AF_INET;
32 serv_adr.sin_addr.s_addr=inet_addr(argv[1]);
33 serv_adr.sin_port=htons(atoi(argv[2]));
34
35 //연결
36 if(connect(sock, (struct sockaddr*)&serv_adr, sizeof(serv_adr))==-1) error_handling("connect() error");
37 else puts("Connected...");
38
39 readfp=fdopen(sock, "r");
40 writefp=fdopen(sock, "w");
41
42 while(1) {
43 fputs("Input message(Q to quit): ", stdout);
44 fgets(message, BUF_SIZE, stdin);
45
46 if(!strcmp(message, "q\n") || !strcmp(message, "Q\n")) break;
47
48 fputs(message, writefp);
49 fflush(writefp);
50 fgets(message, BUF_SIZE, readfp);
51 printf("Message from server: %s", message);
52 }
53 fclose(writefp);
54 fclose(readfp);
55 return 0;
56 }
57
58 void error_handling(char* message) {
59 fputs(message, stderr);
60 fputc('\n', stderr);
61 exit(1);
62 }
III. 실행
같은 컴퓨터에서 실행한다면 IP 주소는 127.0.0.1 을 입력한다.
만약 서로 다른 컴퓨터에서 실행한다면 컴파일한 컴퓨터와 실행하는 컴퓨터가 서로 32bit / 64bit 가 동일한지 확인한다.
'컴퓨터 > C' 카테고리의 다른 글
C buffer 버퍼 (0) | 2022.11.07 |
---|---|
C HTTP Request, Response 요청, 응답 메시지 (0) | 2022.11.06 |
C fdopen() 스트림 열기 (0) | 2022.11.06 |
C atoi() (0) | 2022.11.06 |
C connect() (0) | 2022.11.05 |