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 }
View Code
复制代码

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 }
View Code
复制代码

Makefile

all a_b:
    gcc -o srv main.c -g -Wall
    gcc -o cli client.c -g -Wall

 

posted @   NorseLZJ  阅读(296)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示