Last active
July 22, 2019 08:49
-
-
Save surinoel/3ad1ea6f7fbf347c4c7337460088b354 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 <unistd.h> | |
#include <string.h> | |
#include <stdlib.h> | |
#include <arpa/inet.h> | |
#include <sys/socket.h> | |
void error_handler(const char *msg); | |
int main(int argc, char **argv) | |
{ | |
int sock; | |
struct sockaddr_in servaddr; | |
char msg[30]; | |
int str_len = 0; | |
int idx = 0, read_len = 0; | |
if(argc != 3) { | |
printf("usage : %s <IP> <port> \n", argv[0]); | |
exit(1); | |
} | |
sock = socket(AF_INET, SOCK_STREAM, 0); | |
if(sock < 0) { | |
error_handler("socket"); | |
} | |
memset(&servaddr, 0, sizeof(servaddr)); | |
servaddr.sin_family = AF_INET; | |
servaddr.sin_addr.s_addr = inet_addr(argv[1]); | |
servaddr.sin_port = htons(atoi(argv[2])); | |
if(connect(sock, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { | |
error_handler("connect"); | |
} | |
while(read_len = read(sock, &msg[idx++], 1)) { | |
// EOF까지 값을 읽는다. read는 EOF를 만났을 때, 0을 반환한다 | |
if(read_len == 0) break; | |
str_len += read_len; | |
} | |
printf("Message from server : %s\n", msg); | |
printf("function read call count : %d\n", str_len); | |
close(sock); | |
return 0; | |
} | |
void error_handler(const char *msg) | |
{ | |
fputs(msg, stderr); | |
fputc('\n', stderr); | |
exit(1); | |
} |
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 <string.h> | |
#include <stdlib.h> | |
#include <unistd.h> | |
#include <arpa/inet.h> | |
#include <sys/socket.h> | |
void error_handle(char *msg); | |
int main(int argc, char **argv) | |
{ | |
int serv_sock, cli_sock; | |
struct sockaddr_in serv_addr, cli_addr; | |
socklen_t cli_addr_size; | |
char msg[256] = "Hello world!"; | |
if(argc != 2) { | |
printf("usage : %s <port>\n", argv[0]); | |
exit(1); | |
} | |
serv_sock = socket(PF_INET, SOCK_STREAM, 0); | |
if(serv_sock == -1) { | |
error_handle("socket() error"); | |
} | |
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) { | |
error_handle("bind() error"); | |
} | |
if(listen(serv_sock, 5) < 0) { | |
error_handle("listen() error"); | |
} | |
cli_addr_size = sizeof(cli_addr); | |
cli_sock = accept(serv_sock, (struct sockaddr *)&cli_addr, &cli_addr_size); | |
if(cli_sock < 0){ | |
error_handle("accept() error"); | |
} | |
// sizeof가 아닌 strlen을 써서 EOF까지 버퍼를 전달 | |
// 만일 배열을 []로 선언했다면 sizeof가 strlen과 비슷하다 | |
write(cli_sock, msg, strlen(msg)); | |
close(cli_sock); | |
close(serv_sock); | |
return 0; | |
} | |
void error_handle(char *msg) | |
{ | |
fputs(msg, stderr); | |
fputc('\n', stderr); | |
exit(1); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment