首页 > 系统相关 >Linux TCP Socket实现进程间通信

Linux TCP Socket实现进程间通信

时间:2023-07-30 14:13:44浏览次数:35  
标签:Socket TCP 间通信 fd printf exit include servaddr socket

Linux Socket由内核实现。

服务端
初始化Socket->绑定地址和端口->监听端口->accept阻塞等待客户端连接->处理请求并响应
客户端
初始化Socket->连接服务端->发送请求->读取数据->关闭连接

common.h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define PORT 3000
#define MAX_CHARS 1000
#define MAX_CONNECTIONS 5

client.c

#include "common.h"

int main(int argc, char **argv)
{
    int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (socket_fd == -1)
    {
        printf("create socket error: %s\n", strerror(errno));
        exit(1);
    }

    struct sockaddr_in servaddr;
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(PORT);
    inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);

    if (connect(socket_fd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
    {
        printf("connect error: %s\n", strerror(errno));
        exit(1);
    }

    char msg[MAX_CHARS];
    printf("send:\n");
    fgets(msg, MAX_CHARS, stdin);
    if (send(socket_fd, msg, strlen(msg), 0) == -1)
    {
        printf("send error: %s\n", strerror(errno));
        exit(1);
    }

    char buf[MAX_CHARS];
    int n;
    n = recv(socket_fd, buf, MAX_CHARS, 0);
    if (n == -1)
    {
        perror("receive error");
        exit(1);
    }

    buf[n] = '\0';
    printf("receive: %s", buf);

    close(socket_fd);
    exit(0);
}

server.c

#include "common.h"

int main(int argc, char **argv)
{
    int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
    if (socket_fd == -1)
    {
        printf("create socket error: %s\n", strerror(errno));
        exit(1);
    }

    struct sockaddr_in servaddr;
    servaddr.sin_family = AF_INET;
    // INADDR_ANY表示本机地址
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(PORT);

    if (bind(socket_fd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
    {
        printf("bind socket error: %s\n", strerror(errno));
        exit(1);
    }

    if (listen(socket_fd, MAX_CONNECTIONS) == -1)
    {
        printf("listen socket error: %s\n", strerror(errno));
        exit(1);
    }

    printf("handle client request\n");
    while (1)
    {
        int connect_fd = accept(socket_fd, (struct sockaddr *)NULL, NULL);
        if (connect_fd == -1)
        {
            printf("accept socket error: %s", strerror(errno));
            continue;
        }

        int n;
        char buff[1000];
        n = recv(connect_fd, buff, MAX_CHARS, 0);
        // 末尾设置字符数组结束标志
        buff[n] = '\0';
        printf("receive: %s", buff);

        // 创建子进程来处理请求
        if (!fork())
        {
            char resp[100] = "handle complete\n";
            if (send(connect_fd, resp, strlen(resp), 0) == -1)
                perror("send error");
            close(connect_fd);
            exit(0);
        }

        close(connect_fd);
    }

    close(socket_fd);
    exit(0);
}

标签:Socket,TCP,间通信,fd,printf,exit,include,servaddr,socket
From: https://www.cnblogs.com/WJQ2017/p/17591367.html

相关文章

  • 深入理解TCP作为面向字节流协议的工作原理
    TCP(传输控制协议)是互联网中广泛使用的传输层协议,它负责可靠地传输数据流。一个重要的特性是TCP被称为面向字节流的协议。本文将详细介绍TCP作为面向字节流协议的含义,其工作原理以及与面向消息的协议的区别。1.什么是TCP面向字节流协议?TCP作为面向字节流的协议意味着数据在发送端......
  • websocket服务端,运行后始终无法连接的解决方案
    javax.websocket.DeploymentException:TheHTTPresponsefromtheserver[404]didnotpermittheHTTP解决办法:少两个文件:WebSocketConfig.java@ConfigurationpublicclassWebSocketConfig{/***注入一个ServerEndpointExporter,该Bean会自动注册使用@Server......
  • Modbus tcp转ETHERCAT网关modbus tcp主从站区别
    捷米JM-ECT-TCP网关能够连接到Modbustcp总线和ETHERCAT总线中,实现两种不同协议设备之间的通讯。这个网关能够大大提高工业生产的效率和生产效益,让生产变得更加智能化。捷米JM-ECT-TCP是自主研发的一款ETHERCAT 从站功能的通讯网关。该产品主要功能是将ETHERCAT 网络和MODBU......
  • MODBUS-TCP转Ethernet IP 网关连接空压机 配置案例
    本案例是工业现场应用捷米特JM-EIP-TCP的Ethernet/IP转Modbus-TCP网关连接欧姆龙PLC与空压机的配置案例。使用设备:欧姆龙PLC,捷米特JM-EIP-TCP网关,ETHERNET/IP 的电气连接  ETHERNET/IP 采用标准的 T568B 接法,支持直连和交叉接线方式,如上图所示。ETHERNET/IP 只需要连......
  • ETHERNET/IP转RS485/RS232网关ethernet和tcp/ip的区别
    网络数据传输遇到的协议不同、数据互通麻烦等问题,一直困扰着大家。然而,现在有一种神器——捷米JM-EIP-RS485/232,它将ETHERNET/IP网络和RS485/RS232总线连接在一起,让数据传输更加便捷高效。那么,它是如何实现这一功能的呢?JM-EIP-RS485/232是一款自主研发的通讯网关,可以在ETHERNET/......
  • 深入解析TCP三次握手与四次挥手:建立与断开连接的关键过程
    TCP(传输控制协议)是当今互联网最常用的传输协议之一,它为我们提供了可靠、有序、全双工的数据传输。在实现可靠数据传输的同时,TCP还通过三次握手与四次挥手这两个关键过程,确保了建立与断开连接的可靠性。本文将深入探讨TCP三次握手和四次挥手的工作原理和意义。一、TCP三次握手三次握......
  • ESP32连接云服务器【WebSocket】
    ESP32连接云服务器【ESP32+宝塔面板】......
  • TCP协议的三次握手、四次释放详解
    三次握手:  1.三次握手①第一次握手A的TCP客户进程向B发出建立连接请求报文段,其中SYN(同步位)=1,ACK(确认位)=0,seq(序号)=x。TCP规定,当报文段的SYN=1且ACK=0时,表明这是一个请求建立连接的;SYN报文段(SYN=1的报文段)不能携带数据,但是要消耗掉一个序号。在A发送完毕之后,A的TCP客户端进......
  • 高性能网络SIG月度动态:virtio新设备进入virtio规范、smc新特性IPC性能比tcp提升88% |
    高性能网络SIG:在云计算时代,软硬件高速发展,云原生、微服务等新的应用形态兴起,让更多的数据在进程之间流动,而网络则成为了这些数据流的载体,在整个云时代扮演者前所未有的重要角色。在这个万物互联的时代,云上的网络通信效率对各种服务至关重要,高性能网络兴趣组致力于利用XDP、R......
  • TCP 滑动窗口
    窗口由来按数据包进行确认应答,这样的传输方式有一个缺点:数据包的往返时间越长,通信的效率就越低。为解决这个问题,TCP引入了窗口这个概念。有了窗口,就可以指定窗口大小,窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值主要目的保证可靠、有序的数据传递,强制发送方和接收方......