简易TCP C/S通信

效果

s.c

复制代码
root@TTT:~# cat s.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <assert.h>


int main(int argc, char *argv[])
{
        int fd = -1;
        int ret = -1;
        int opt = 1;
        struct sockaddr_in addr;
        struct sockaddr_in client;
        socklen_t len = 0;
        pid_t pid = -1;


        addr.sin_family = AF_INET;
        addr.sin_port = htons(7000);
        addr.sin_addr.s_addr = inet_addr("0.0.0.0");

        client.sin_family = AF_INET;
        client.sin_port = htons(7001);
        client.sin_addr.s_addr = inet_addr(argv[1]);

        pid = fork();
        if (pid == -1)
        {
                perror("fork:");
        }
        else if (pid > 0)
        {
                fd = socket(AF_INET, SOCK_STREAM, 0);
                setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

                printf("Server# set server IP %s Port %d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
                ret = bind(fd, (struct sockaddr *)&addr, sizeof(addr));
                assert(ret == 0);

                ret = listen(fd, 6);
                assert(ret == 0);

                printf("Server# start accept\n");
                len = sizeof(client);
                ret = accept(fd, (struct sockaddr *)&client, &len);
                printf("Server# accept IP %s Port %d connected\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
                close(ret);
                close(fd);
        }
        else
        {
                usleep(20000);
                fd = socket(AF_INET, SOCK_STREAM, 0);
                setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
                assert(fd != -1);

                printf("Client# set client IP %s Port %d\n", inet_ntoa(client.sin_addr), ntohs(client.sin_port));
                ret = bind(fd, (struct sockaddr *)&client, sizeof(client));
                assert(ret == 0);

                printf("Client# connect to IP %s Port %d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
                ret = connect(fd, (struct sockaddr *)&addr, sizeof(addr));
                close(fd);
        }
        usleep(2000);

        return 0;
}
相关推荐
深圳市快瞳科技有限公司44 分钟前
野外鸟类AI识别落地实录:输入适配、结构化输出、去重聚合与置信度分流的工程实践
算法·计算机视觉·鸟类识别·鸟类ai识别·野外鸟类观测·林业调查
叼烟扛炮1 小时前
Linux 学习笔记(四十一):TCP 并发演进——从单进程到多线程服务器
linux·运维·服务器·网络·笔记·学习·tcp/ip
叼烟扛炮1 小时前
Linux 学习笔记(四十三):网络编程进阶——自定义协议解决 TCP 粘包与守护进程
linux·开发语言·网络·笔记·tcp/ip
专注仿真2 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法
小豆庄2 小时前
视频遮罩追踪退场后ID撞号的排查—多目标场景下的失效
opencv·算法·bug·视频·python3.11
Tisfy3 小时前
LeetCode 3882.网格图中最小异或路径:动态规划
算法·leetcode·动态规划
D e re k ZH4 小时前
P5025 [SNOI2017] 炸弹
c++·算法
A boy CDEF girl4 小时前
算法题专栏:优选算法
数据结构·算法·leetcode
没落之王4 小时前
三易五行看宋朝的三界确立
大数据·人工智能·算法
wuminyu4 小时前
Java字节码学习总结:字节码如何加载、解析和执行
java·linux·c语言·jvm·c++