百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

进程间通信——套接字 进程和套接字

yuyutoo 2024-12-22 21:47 3 浏览 0 评论

进程间通信是计算机网络中的重要概念,通过进程间通信,不同的进程可以互相交换数据,实现分布式计算,提高系统的处理效率。

套接字是一种常用的进程间通信机制。套接字是两个进程之间的通信端点,每个套接字包含一个IP地址和一个端口地址,它们用于唯一地标识这个套接字。套接字通信方式包括面向连接的TCP和无连接的UDP两种方式。

在本文中,我们将介绍如何使用套接字实现进程间通信,并给出相应的代码示例。


套接字的创建

在使用套接字进行通信之前,需要创建一个套接字。在Linux系统中,可以使用socket函数来创建套接字。

socket函数的原型如下:

#include <sys/types.h>
#include <sys/socket.h>

int socket(int domain, int type, int protocol);
  • domain参数指定套接字的协议族,常用的有AF_INET和AF_INET6两种协议族。
  • type参数指定套接字的类型,常用的有SOCK_STREAM和SOCK_DGRAM两种套接字类型。
  • protocol参数指定使用的具体协议,可以在指定类型的同时指定为0,表示使用默认协议。

以下是一个创建TCP套接字的示例:

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

int main(int argc, char **argv)
{
    int sockfd = 0;
    struct sockaddr_in serv_addr;
    char buffer[1024];

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
    {
        perror("Error creating socket");
        exit(1);
    }

    memset(&serv_addr, '0', sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(5000);

    if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0)
    {
        perror("inet_pton error occured\n");
        exit(1);
    }

    if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
    {
        perror("Error connecting to the server");
        exit(1);
    }

    close(sockfd);
    return 0;
}

在上述代码中,我们通过socket函数创建了一个TCP套接字,并将其与本地IP地址的5000端口进行了绑定,并指定了需要与其建立连接的目标IP地址。通过connect函数可以将其与目标套接字连接。为了关闭套接字,我们调用了close函数。


套接字的通信

套接字创建成功之后,就可以使用相关函数进行通信。使用TCP套接字进行通信时,需要使用send和recv函数来发送和接收数据。使用UDP套接字进行通信时,需要使用sendto和recvfrom函数来发送和接收数据。

以下是一个使用TCP套接字进行通信的示例:

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

int main(int argc, char **argv)
{
    int sockfd = 0, n = 0;
    char recvBuff[1024];
    struct sockaddr_in serv_addr;

    memset(recvBuff, '0', sizeof(recvBuff));

    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0)
    {
        perror("Error creating socket");
        exit(1);
    }

    memset(&serv_addr, '0', sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(5000);

    if (inet_pton(AF_INET, "127.0.0.1", &serv_addr.sin_addr) <= 0)
    {
        perror("inet_pton error occured\n");
        exit(1);
    }

    if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)
    {
        perror("Error connecting to the server");
        exit(1);
    }

    while ((n = read(sockfd, recvBuff, sizeof(recvBuff) - 1)) > 0)
    {
        recvBuff[n] = 0;
        if (fputs(recvBuff, stdout) == EOF)
        {
            perror("Error printing received data");
        }
    }

    if (n < 0)
    {
        perror("Error receiving data");
    }

    close(sockfd);
    return 0;
}

在上述代码中,我们使用read函数从套接字中读取数据,并通过fputs函数将其打印到标准输出。

以上就是套接字的基本使用方法,使用套接字可以方便快捷地实现进程间通信。同时,套接字也是网络编程的重要基础。

相关推荐

牛逼哄哄的数据库连接池,底层原理是个啥?

作者:敦格来源:https://blog.csdn.net/shuaihj/article/details/14223015这次我们采取技术演进的方式来谈谈数据库连接池的技术出现过程及其原理,以及当下...

如何实现一个连接池?一文带你深入浅出,彻底搞懂

-前言-【2w1h】是技术领域中一种非常有效的思考和学习方式,即What、Why和How;坚持【2w1h】,可以快速提升我们的深度思考能力。今天我们通过【2w1h】方式来讨论“连接池”:什么是连接...

什么是连接池?如何实现一个Java连接池?

什么是连接池?结构连接池对外提供接口:获得连接归还连接并暴露客户端可配置的参数:...

什么是数据库连接池? 什么是数据库连接池?如何使用

在JDBC编程中,每次创建和断开Connection对象都会消耗一定的时间和IO资源。这是因为在Java程序与数据库之间建立连接时,数据库端要验证用户名和密码,并且要为这个连接分配资源,Java程序则...

男生怎么插入对方话题,分享这2点,可以快速搭讪

在日常生活中,男生怎么插入对方的话题呢?来分享一下几个小妙招,让男生快速搭讪。1、同女性聊天.普通的女性可以先有礼貌的打招呼,询问对方聊天内容,对方的话题适不适合自己发表观点,如果不适合可以等着对方说...

PDF文件如何插入、删除、替换、旋转页面

Hello,各位小伙伴们大家好,我是爱学习的小助手。...

SQL——INSERT:插入数据 sqlinsert怎么插入

INSERT语句用于向数据库表中插入数据。1、插入一条数据insert into adm_user(login_name,password,name,mobile_no)&...

近乎变态的USB发展史,命名混乱到了极致,一篇文章让你读懂

USB3.0经历过多次改名,到最后没有任何规律!特别是USB3.0居然“升格”到USB3.2,搞得人头大!同1个蓝色USB口好像说3.0/3.1/3.2的都有,究竟谁对?今天为大家缕一缕。点赞收藏!【...

女大学生把30厘米“兔兔管”插入体内:上瘾性行为,害了多少人?

轻触关注,打开知识的大门,我在这里将与您共享更多精彩内容!女大学生小玲身高160厘米,体重却高达170斤。她曾尝试过节许多减肥方法,但无一例外均以失败告终。...

大年初二铁棍插入10岁女童脑内,上海值班医生手术取出

澎湃新闻记者陈斯斯来自浙江嘉兴的10岁女童逛商场遭遇意外,一根铁棍插入其脑内,随后被120急救车急送上海交大医学院附属新华医院(简称上海新华医院)实施急诊手术。2月3日,澎湃新闻(www.thep...

插入语和状语的区别 where引导的定语从句和状语从句的区别

1.插入语是在一个句子中插入一个成分,它不是句子的成分,而是表示说话人的态度或进行解释补充说明等。...

用户数据之存量——DAU/MAU 用户数据到底是什么

编辑导语:数据分析是设计师了解用户行为的一个重要手段。本文作者分享了不同指标的核心含义,从用户数据的存量、Active活跃度、User用户展开分析,一起来学习一下吧,希望对你有帮助。随着设计师对产品设...

键盘上这些被厂商抠掉的功能键,到底有多没用?

最近呢,办公室流行起了客制化键盘这个东西,简单来讲就是可以根据自己的需求和喜好来定制独一无二的键盘。...

如何制作Windows系统安装U盘 最简单的方法 有手就行

前段时间一位朋友问我,能不能给他安装系统,他随后补了一句:给你钱。其实安装Windows系统是一件非常简单的事情,所以我想着,不如告诉大家最简单的操作方法,让大家能够省一笔安装系统的钱。该教程会分为两...

大模型给你的答案,也要插入广告了?

英伟达创始人CEO黄仁勋曾在被问到他是否使用ChatGPT或Bard时,他回答称,“我一般用Perplexity,而且几乎每天都在用。”Perplexity旨在用AI技术打造一个没有广告的“谷歌搜索...

取消回复欢迎 发表评论: