Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

マージして♡ #1

Merged
merged 2 commits into from
Nov 3, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -53,3 +53,4 @@ dkms.conf

client
server
.bash_history
50 changes: 50 additions & 0 deletions tcp/client.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>


int
main(void)
{
struct sockaddr_in server;
int sock;
char buf[32];
int n;

/* ソケットの作成 */
sock = socket(AF_INET, SOCK_STREAM, 0);

/* 接続先指定用構造体の準備 */
server.sin_family = AF_INET;
server.sin_port = htons(11111);
// server.sin_len = sizeof(server); /* Linuxでは不要 */

/* 127.0.0.1はlocalhost */
inet_pton(AF_INET, "127.0.0.1", &server.sin_addr);

/* sockaddr_in 構造体の長さを指定(Linuxでは不要) */
// server.size_len = sizeof(server);

/* サーバに接続 */
if (connect(sock, (struct sockaddr *)&server, sizeof(server)) != 0){
perror("connect");
return 1;
}

/* サーバからデータを受信 */
memset(buf, 0, sizeof(buf));
n = read(sock, buf, sizeof(buf));

printf("%d, %s\n", n, buf);

/* socketの終了 */
close(sock);


return 0;
}

5 changes: 5 additions & 0 deletions tcp/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
app:
build: ".."
volumes:
- .:/root
working_dir: /root
15 changes: 15 additions & 0 deletions tcp/run.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
gcc -o client client.c
chmod +x client

gcc -o server server.c
chmod +x server

./server &

echo "--- 1 ---"
sleep 1
./client

echo "\n--- 2 ----"
sleep 1
./client
67 changes: 67 additions & 0 deletions tcp/server.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>


int
main(void)
{
int sock0;
struct sockaddr_in addr;
struct sockaddr_in client;
socklen_t len;
int sock1, sock2;

/* ソケットの作成 */
sock0 = socket(AF_INET, SOCK_STREAM, 0);


/*** ソケットの設定 ***/

/* IPv4を利用することを指定 */
addr.sin_family = AF_INET;

/* ポート番号は11111 */
addr.sin_port = htons(11111);

/* 任意のインターフェースを指定 */
addr.sin_addr.s_addr = INADDR_ANY;

/* sockaddr_in構造体のサイズを設定(Linuxでは不要) */
// addr.sin_len = sizeof(addr);

/* ソケットをインターフェースとポートに関連付け */
bind(sock0, (struct sockaddr *)&addr, sizeof(addr));

/* TCPクライアントからの接続要求を持てる状態にする */
listen(sock0, 5);

/* TCPクライアントからの接続要求を受け付ける(1回目) */
len = sizeof(client);
sock1 = accept(sock0, (struct sockaddr *)&client, &len);

/* 6文字送信('H', 'E', 'L', 'L', 'O', '\0') */
write(sock1, "HELLO", 6);

/* TCPセッションの終了 */
close(sock1);


/* TCPクライアントからの接続要求を受け付ける(2回目) */
sock2 = accept(sock0, (struct sockaddr *)&client, &len);

/* 5文字送信 */
write(sock2, "HOGE", 5);

/* TCPセッション2の終了 */
close(sock2);


/* listenするsocketの終了 */
close(sock0);

return 0;
}

56 changes: 56 additions & 0 deletions tcp2/client.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>


int
main(void)
{
struct sockaddr_in server;
int sock;
char buf[32];
int n;
int port; /* 本に記載なし */


/* ポート番号の入力(本に記載なし) */
puts("[client] Enter server port");
scanf("%d", &port);

/* ソケットの作成 */
sock = socket(AF_INET, SOCK_STREAM, 0);

/* 接続先指定用構造体の準備 */
server.sin_family = AF_INET;
server.sin_port = htons(port);
// server.sin_len = sizeof(server); /* Linuxでは不要 */

/* 127.0.0.1はlocalhost */
inet_pton(AF_INET, "127.0.0.1", &server.sin_addr);

/* sockaddr_in 構造体の長さを指定(Linuxでは不要) */
// server.size_len = sizeof(server);

/* サーバに接続 */
if (connect(sock, (struct sockaddr *)&server, sizeof(server)) != 0){
perror("connect");
return 1;
}

/* サーバからデータを受信 */
memset(buf, 0, sizeof(buf));
n = read(sock, buf, sizeof(buf));

printf("[client] %d, %s\n", n, buf);

/* socketの終了 */
close(sock);


return 0;
}

9 changes: 9 additions & 0 deletions tcp2/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
version: '3.5'
services:
app:
build: ".."
volumes:
- .:/root/
working_dir: /root/
tty: true
stdin_open: true
9 changes: 9 additions & 0 deletions tcp2/run.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
gcc -o client client.c
chmod +x client

gcc -o server server.c
chmod +x server

./server &
sleep 1
./client
67 changes: 67 additions & 0 deletions tcp2/server.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h> /* for memset */
#include <arpa/inet.h> /* for inet_ntop */


int
main(void)
{
int sock0;
struct sockaddr_in serv;
struct sockaddr_in client;
socklen_t len;
int sock1;
char serv_name[16];
int n;


/* ソケットの作成 */
sock0 = socket(AF_INET, SOCK_STREAM, 0);


/* TCPクライアントからの接続要求を持てる状態にする */
listen(sock0, 5);
if (n != 0) {
perror("[server] listen");
}


/* getsocknameを使うための準備 */
memset(&serv, 0, sizeof(serv));
len = sizeof(serv);


/* getsocknameでソケットに付随する情報を取得 */
n = getsockname(sock0, (struct sockaddr *)&serv, &len);
if (n != 0) {
perror("[server] listen");
}


/* ソケットにつけられた「名前」をコンソールに表示 */
memset(serv_name, 0, sizeof(serv_name));
inet_ntop(serv.sin_family, &serv.sin_addr, serv_name, sizeof(serv_name));
printf("[server] ipaddr=%s, port=%d\n", serv_name, ntohs(serv.sin_port));


/* TCPクライアントからの接続要求を受け付ける(1回目) */
len = sizeof(client);
sock1 = accept(sock0, (struct sockaddr *)&client, &len);

/* 6文字送信('H', 'E', 'L', 'L', 'O', '\0') */
write(sock1, "HELLO", 6);

/* TCPセッションの終了 */
close(sock1);


/* listenするsocketの終了 */
close(sock0);

return 0;
}