linux_c_tcp_example
server
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <unistd.h> 5 #include <arpa/inet.h> 6 #include <sys/socket.h> 7 8 9 #define BUF_SIZE 1024 10 11 void err_handler(char *msg); 12 13 int main(int argc, char **argv) { 14 int srv_sock, cli_sock; 15 char msg[BUF_SIZE]; 16 int str_len; 17 18 struct sockaddr_in srv_addr, cli_addr; 19 socklen_t cli_adr_sz; 20 21 if (argc != 2) { 22 printf("Usage : %s <port>", argv[0]); 23 exit(1); 24 } 25 26 srv_sock = socket(PF_INET, SOCK_STREAM, 0); 27 if (srv_sock == -1) { 28 err_handler("socket() error"); 29 } 30 31 memset(&srv_addr, 0, sizeof(srv_addr)); 32 srv_addr.sin_family = AF_INET; 33 srv_addr.sin_addr.s_addr = htonl(INADDR_ANY); 34 srv_addr.sin_port = htons(atoi(argv[1])); 35 36 if (bind(srv_sock, (struct sockaddr *) &srv_addr, sizeof(srv_addr)) == -1) { 37 err_handler("bind() error"); 38 } 39 40 if (listen(srv_sock, 5) == -1) { 41 err_handler("listen() error"); 42 } 43 44 cli_adr_sz = sizeof(cli_addr); 45 46 for (int i = 0; i < 5; ++i) { 47 cli_sock = accept(srv_sock, (struct sockaddr *) &cli_addr, &cli_adr_sz); 48 if (cli_sock == -1) { 49 err_handler("accept() error"); 50 } else { 51 printf("connected client %d\n", i + i); 52 } 53 54 while ((str_len = read(cli_sock, msg, BUF_SIZE)) != 0) { 55 write(cli_sock, msg, str_len); 56 } 57 close(cli_sock); 58 } 59 60 close(srv_sock); 61 return 0; 62 } 63 64 void err_handler(char *msg) { 65 fputs(msg, stderr); 66 fputc('\n', stderr); 67 exit(1); 68 }
client
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <unistd.h> 5 #include <arpa/inet.h> 6 #include <sys/socket.h> 7 8 9 #define BUF_SIZE 1024 10 11 void err_handler(char *msg); 12 13 int main(int argc, char **argv) { 14 int sock; 15 char msg[BUF_SIZE]; 16 int str_len; 17 struct sockaddr_in srv_addr; 18 19 if (argc != 3) { 20 printf("Usage : %s <port>", argv[0]); 21 exit(1); 22 } 23 24 sock = socket(PF_INET, SOCK_STREAM, 0); 25 if (sock == -1) { 26 err_handler("socket() error"); 27 } 28 29 memset(&srv_addr, 0, sizeof(srv_addr)); 30 srv_addr.sin_family = AF_INET; 31 srv_addr.sin_addr.s_addr = inet_addr(argv[1]); 32 srv_addr.sin_port = htons(atoi(argv[2])); 33 34 if (connect(sock, (struct sockaddr *) &srv_addr, sizeof(srv_addr)) == -1) { 35 err_handler("connect() error"); 36 } else { 37 printf("connected ........."); 38 } 39 40 while (1) { 41 fputs("Input msg(Q to quit):", stdout); 42 fgets(msg, BUF_SIZE, stdin); 43 if (!strcmp(msg, "q\n") || !strcmp(msg, "Q\n")) { 44 break; 45 } 46 write(sock, msg, strlen(msg)); 47 str_len = read(sock, msg, BUF_SIZE - 1); 48 msg[str_len] = 0; 49 printf("Msg form srv : %s", msg); 50 } 51 52 close(sock); 53 return 0; 54 } 55 56 void err_handler(char *msg) { 57 fputs(msg, stderr); 58 fputc('\n', stderr); 59 exit(1); 60 }
Makefile
all a_b: gcc -o srv main.c -g -Wall gcc -o cli client.c -g -Wall