Skip to content

Instantly share code, notes, and snippets.

@surinoel
Last active July 22, 2019 08:49
Show Gist options
  • Save surinoel/3ad1ea6f7fbf347c4c7337460088b354 to your computer and use it in GitHub Desktop.
Save surinoel/3ad1ea6f7fbf347c4c7337460088b354 to your computer and use it in GitHub Desktop.
#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);
}
#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