Created
July 26, 2019 04:50
-
-
Save surinoel/c9742ce9c4c17847b5f07e21112846a8 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| #include <unistd.h> | |
| #include <arpa/inet.h> | |
| #include <sys/socket.h> | |
| #define BUF_SIZE 1024 | |
| int main(int argc, char **argv) | |
| { | |
| int sock; | |
| char msg[BUF_SIZE]; | |
| int str_len; | |
| struct sockaddr_in serv_addr; | |
| if(argc != 3) { | |
| printf("Usage : %s <IP> <port>\n", argv[0]); | |
| return -1; | |
| } | |
| sock = socket(AF_INET, SOCK_STREAM, 0); | |
| if(sock < 0) { | |
| perror("socket"); | |
| return -1; | |
| } | |
| memset(&serv_addr, 0, sizeof(serv_addr)); | |
| serv_addr.sin_family = AF_INET; | |
| serv_addr.sin_addr.s_addr = inet_addr(argv[1]); | |
| serv_addr.sin_port = htons(atoi(argv[2])); | |
| if(connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { | |
| perror("connect"); | |
| return -1; | |
| } | |
| while(1) { | |
| fputs("Input msg(Q to quit): ", stdout); | |
| // fgets는 개행을 포함하여 반환함 | |
| fgets(msg, BUF_SIZE, stdin); | |
| if(!strcmp(msg, "q\n") || !strcmp(msg, "Q\n")) { | |
| break; | |
| } | |
| write(sock, msg, strlen(msg)); | |
| str_len = read(sock, msg, BUF_SIZE-1); | |
| msg[str_len] = 0; | |
| printf("Message from server :%s", msg); | |
| } | |
| close(sock); | |
| return 0; | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| #include <unistd.h> | |
| #include <pthread.h> | |
| #include <arpa/inet.h> | |
| #include <sys/socket.h> | |
| #define BUF_SIZE 1024 | |
| void *thread_clnt(void *arg); | |
| int main(int argc, char **argv) | |
| { | |
| int serv_sock, clnt_sock; | |
| pthread_t tid[5]; | |
| struct sockaddr_in serv_addr, clnt_addr; | |
| socklen_t clnt_addr_sz; | |
| if(argc != 2) { | |
| printf("Usage : %s <port>\n", argv[0]); | |
| return -1; | |
| } | |
| serv_sock = socket(AF_INET, SOCK_STREAM, 0); | |
| if(serv_sock < 0) { | |
| perror("socket"); | |
| return -1; | |
| } | |
| memset(&serv_addr, 0, sizeof(serv_addr)); | |
| serv_addr.sin_family = AF_INET; | |
| serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); | |
| serv_addr.sin_port = htons(atoi(argv[1])); | |
| if(bind(serv_sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) { | |
| perror("bind"); | |
| return -1; | |
| } | |
| if(listen(serv_sock, 5) < 0) { | |
| perror("listen"); | |
| return -1; | |
| } | |
| clnt_addr_sz = sizeof(clnt_addr); | |
| for(int i=0; i<5; i++) { | |
| clnt_sock = accept(serv_sock, (struct sockaddr *)&clnt_addr, &clnt_addr_sz); | |
| if(clnt_sock < 0) { | |
| perror("accept"); | |
| return -1; | |
| } | |
| printf("connected client : %d\n", i+1); | |
| if(pthread_create(&tid[i], NULL, thread_clnt, (void *)&clnt_sock) != 0) { | |
| perror("pthread_create"); | |
| return -1; | |
| } | |
| } | |
| for(int i=0; i<5; i++) { | |
| pthread_join(tid[i], NULL); | |
| } | |
| close(serv_sock); | |
| return 0; | |
| } | |
| void *thread_clnt(void *arg) { | |
| int clnt_sock = *((int *)arg); | |
| int str_len; | |
| char buf[1024]; | |
| memset(buf, 0, sizeof(buf)); | |
| // 클라이언트가 q 혹은 Q를 보낼때까지 | |
| while((str_len = read(clnt_sock, buf, sizeof(buf))) != 0) { | |
| write(clnt_sock, buf, str_len); | |
| } | |
| // 서버 소켓 다음으로 번호가 할당되기 때문에 4번부터 할당됨 | |
| printf("%d terminated...\n", clnt_sock); | |
| close(clnt_sock); | |
| return NULL; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment