linux TCP通信实现 服务器端 - 客户端

服务器端: 
复制代码
 1 //TCP通信的服务器端
 2 
 3 #include <stdio.h>
 4 #include <arpa/inet.h>
 5 #include <unistd.h>
 6 #include <string.h>
 7 int main()
 8 {
 9     //1.创建 socket(用于监听的套接字)
10     int lfd = socket(AF_INET, SOCK_STREAM, 0);//IPv4 流式协议 TCP  lfd = 获取的文件描述符
11     if(lfd == -1)
12     {
13         perror("socket");
14         exit(-1);
15     }
16     //2.绑定 
17     struct sockaddr_in saddr;
18     //初始化  否则创建的变量会自动被赋予随机值
19     saddr.sin_family = AF_INET;//AF_INET 与 PF_INET值相等
20     //inet_pton(AF_INET, "192.168.192.128", saddr.sin_addr.s_addr);// 主机字节序转换为网络字节序
21     saddr.sin_addr.s_addr = INADDR_ANY; // 0.0.0.0      INADDR_ANY宏值为0
22     saddr.sin_port = htons(9999);//主机字节序9999通过 htons转换为网络字节序
23     int ret = bind(lfd, (struct sockaddr *)&saddr, sizeof(saddr));
24     if(ret == -1)
25     {
26         perror("bind");
27         exit(-1);
28     }
29     //3.监听
30     ret = listen(lfd, 8);
31     if(ret == -1)
32     {
33         perror("listen");
34         exit(-1);
35     }
36     //4.接收客户端连接
37     struct sockaddr_in clientaddr;//客户端地址
38     socklen_t len = sizeof(clientaddr);
39     int cfd = accept(lfd, (struct sockaddr *)&clientaddr, &len);
40     if(cfd == -1)
41     {
42         perror("accept");
43         exit(-1);
44     }
45     //输出客户端的信息
46     char clientIP[16];
47     inet_ntop(AF_INET, &clientaddr.sin_addr.s_addr, clientIP, sizeof(clientIP));
48     unsigned short clientPort = ntohs(clientaddr.sin_port);
49     printf("client ip is %s, port is %d\n", clientIP, clientPort);
50     //5.通信 
51     //服务器端先接收数据后返回数据
52     //获取客户的数据
53     char recvBuf[1024] = {0};
54     int len = read(cfd, recvBuf, sizeof(recvBuf));
55     if( len == -1)
56     {
57         perror("read");
58         exit(-1);
59     }
60     else if(len > 0)
61     {
62         printf("recv client data: %s\n",recvBuf);
63     }
64     else if( len == 0)
65     {
66         //表示客户端断开连接
67         printf("client closed...\n");
68     }
69     //给客户端发送数据
70     char * data = "hello, i am server";
71     write(cfd, data, strlen(data));
72     //6.关闭文件描述符
73     close(cfd);
74     close(lfd);
75     return 0;
76 }
复制代码

客户端:

复制代码
 1 //TCP通信的客户端
 2 
 3 #include <stdio.h>
 4 #include <arpa/inet.h>
 5 #include <unistd.h>
 6 #include <string.h>
 7 #include <stdlib.h>
 8 int main()
 9 {
10     //1.创建套接字
11     int fd = socket(AF_INET, SOCK_STREAM, 0);
12     if(fd == -1)
13     {
14         perror("socket");
15         exit(-1);
16     }
17     //2.连接服务器端
18     struct sockaddr_in serveraddr;
19     serveraddr.sin_family = AF_INET;
20     inet_pton(AF_INET, "10.0.8.5", &serveraddr.sin_addr.s_addr);//本机 ip
21     serveraddr.sin_port = htons(9999);
22     int ret = connect(fd, (struct sockaddr *)&serveraddr, sizeof(serveraddr));
23     if(ret == -1)
24     {
25         perror("connect");
26         exit(-1);
27     }
28     //3.通信
29     char recvBuf[1024] = {0};
30     while(1)
31     {
32         char * data = "hello, i am client";
33         //给服务器端发送数据
34         write(fd, data, strlen(data));
35         sleep(1);
36         //读取数据
37         int len = read(fd, recvBuf, sizeof(recvBuf));
38         if(len == -1)
39         {
40             perror("read");
41             exit(-1);
42         }
43         else if(len > 0)
44         {
45             printf("recv server data: %s\n",recvBuf);
46         }
47         else if(len == 0)
48         {
49             //表示客户端断开连接
50             printf("server closed...\n");
51             break;
52         }
53     }
54     //关闭连接
55     close(fd);
56     return 0;
57 }
复制代码

 

posted on   廿陆  阅读(62)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2021-10-12 VS Code初下载--解决官网下载慢的问题
点击右上角即可分享
微信分享提示