返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >使用C语言实现本地socke通讯的方法
  • 540
分享到

使用C语言实现本地socke通讯的方法

2024-04-02 19:04:59 540人浏览 独家记忆
摘要

一、概述   使用本地Socket通讯可以实现进程之间的通讯。   相关函数描述如下: int socket(int domain, int type, int protocol

一、概述

  使用本地Socket通讯可以实现进程之间的通讯。

  相关函数描述如下:


int socket(int domain, int type, int protocol);

函数说明: 创建本地域socket

函数参数:    

    domain: AF_UNIX or AF_LOCAL

    type: SOCK_STREAM或者SOCK_DGRAM

    protocol: 0 表示使用默认协议

函数返回值:

    成功: 返回文件描述符.

    失败: 返回-1, 并设置errno值.

创建socket成功以后, 会在内核创建缓冲区, 下图是客户端和服务端内核缓冲区示意图.

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

函数说明: 绑定套接字

函数参数:

    socket: 由socket函数返回的文件描述符

    addr: 本地地址

    addlen: 本地地址长度

函数返回值:

    成功: 返回文件描述符.

    失败: 返回-1, 并设置errno值.

需要注意的是: bind函数会自动创建socket文件, 若在调用bind函数之前socket文件已经存在, 则调用bind会报错, 可以使用unlink函数在bind之前先删除文件.

struct sockaddr_un {

    sa_family_t sun_family;  

    char sun_path[108];  

};

  整体使用步骤和网络通讯的socket是差不多的,如下所示:


tcp的本地套接字服务器流程:

    创建套接字  socket(AF_UNIX,SOCK_STREAM,0)

    绑定 struct sockaddr_un &强转

    侦听 listen 

    获得新连接 accept 

    循环通信 read-write 

    关闭文件描述符 close

tcp本地套接字客户端流程:

    调用socket创建套接字

    调用bind函数将socket文件描述和socket文件进行绑定.

        不是必须的, 若无显示绑定会进行隐式绑定,但服务器不知道谁连接了.

    调用connect函数连接服务端

    循环通信read-write

    关闭文件描述符 close

二、代码示例

  1.服务端代码示例


//本地socket通讯服务端

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/types.h>

#include <unistd.h>

#include <arpa/inet.h>

#include <netinet/in.h>

#include <sys/un.h>

int main(){

    //创建socket

    int lfd = socket(AF_UNIX,SOCK_STREAM,0);

    if(lfd<0){

        perror("socket error");

        return -1;

    }

    //删除socket文件,避免bind失败

    unlink("./server.sock");

    //绑定

    struct sockaddr_un serv;

    bzero(&serv,sizeof(serv));

    serv.sun_family = AF_UNIX;

    strcpy(serv.sun_path,"./server.sock");

    int ret = bind(lfd,(struct sockaddr *)&serv,sizeof(serv));

    if(ret<0){

        perror("bind error");

        return -1;

    }

    //监听

    listen(lfd,10);

    //接收新的链接-accept

    struct sockaddr_un client;

    bzero(&client,sizeof(client));

    socklen_t len = sizeof(client);

    int cfd = accept(lfd,(struct sockaddr*)&client,&len);

    if(cfd<0){

        perror("accept error");

        return -1;

    }

    printf("cient->[%s]\n",client.sun_path);

    int n;

    char buf[1024];

    while(1){

        //读取数据

        memset(buf,0x00,sizeof(buf));

        n = read(cfd,buf,sizeof(buf));

        if(n<=0){

            printf("read error or client close ,n=[%d]\n",n);

            break;

        }

        printf("n=[%d],buf=[%s]\n",n,buf);

        //发送数据

        write(cfd,buf,n);

    }

    //关闭套接字

    close(lfd);

    return 0;

}

  2.客户端代码示例


//本地socket通信客户端

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/types.h>

#include <unistd.h>

#include <arpa/inet.h>

#include <netinet/in.h>

#include <sys/un.h>

int main(){

    //创建socket

    int cfd = socket(AF_UNIX,SOCK_STREAM,0);

    if(cfd<0){

        perror("socket error");

        return -1;

    }

    //删除socket文件,避免bind失败

    unlink("./client.sock");

    //绑定

    struct sockaddr_un client;

    bzero(&client,sizeof(client));

    client.sun_family= AF_UNIX;

    strcpy(client.sun_path,"./client.sock");

    int ret = bind(cfd,(struct sockaddr*)&client,sizeof(client));

    if(ret<0){

        perror("bind error");

        return -1;

    }

    struct sockaddr_un serv;

    bzero(&serv,sizeof(serv));

    serv.sun_family = AF_UNIX;

    strcpy(serv.sun_path,"./server.sock");

    ret = connect(cfd,(struct sockaddr*)&serv,sizeof(serv));

    if(ret<0){

        perror("connect error");

        return -1;

    }

    int n;

    char buf[1024];

    while(1){

        memset(buf,0x00,sizeof(buf));

        n = read(STDIN_FILENO,buf,sizeof(buf));

        //发送数据

        write(cfd,buf,n);

        //读取数据

        memset(buf,0x00,sizeof(buf));

        n = read(cfd,buf,sizeof(buf));

        if(n<=0){

            printf("read error or client close ,n=[%d]",n);

            break;

        }

        printf("n=[%d],buf=[%s]",n,buf);

    }

    close(cfd);

    return 0;

}

到此这篇关于 使用C语言实现本地socke通讯的文章就介绍到这了,更多相关C语言本地socke通讯内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 使用C语言实现本地socke通讯的方法

本文链接: https://lsjlt.com/news/160347.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 使用C语言实现本地socke通讯的方法
    一、概述   使用本地socket通讯可以实现进程之间的通讯。   相关函数描述如下: int socket(int domain, int type, int protocol...
    99+
    2024-04-02
  • 如何使用C语言实现本地socke通讯
    这篇文章主要介绍了如何使用C语言实现本地socke通讯,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、概述  使用本地socket通讯可以实现进程之间的通讯。  相关函数描...
    99+
    2023-06-22
  • 用C语言实现通讯录
    相信大家都见识过通讯录,通讯录里面一般有的内容为姓名,联系方式,年龄等信息。通讯录的主要功能有:增加、删除、查找、排序、修改、展示等操作。 那么具体应该用C语言怎么实现这个呢?接下来...
    99+
    2024-04-02
  • C语言实现通讯录的方法(包括静态版本和动态版本)
    目录1.静态通讯录的实现实现的方法:2.动态通讯录的实现实现的方法:3.总结1.静态通讯录的实现 实现的方法: 我们采用的方法就是工程形势,实现将功能和定义以及测试分成三个文件,其中...
    99+
    2024-04-02
  • C语言通过三种方法实现属于你的通讯录
    目录一、基础版本1.1 通讯录的个人信息(结构体来实现)1.2通讯录名单1.3人员初始化1.4菜单1.5主函数二、功能的实现2.1、增加人数2.2、删除人数2.3、查找2.4、展示2...
    99+
    2022-11-21
    C语言实现通讯录 C语言 通讯录
  • 怎么用C语言脚本实现简易通讯录
    这篇文章主要介绍“怎么用C语言脚本实现简易通讯录”,在日常操作中,相信很多人在怎么用C语言脚本实现简易通讯录问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用C语言脚本实现简易通讯录”的疑惑有所帮助!接下来...
    99+
    2023-06-29
  • C语言实现通讯录程序
    本文实例为大家分享了C语言实现通讯录程序的具体代码,供大家参考,具体内容如下 设计要求: 可以存放1000个人的信息,每个人的信息包括姓名、年龄、性别、电话、住址 通讯录功能包括: ...
    99+
    2024-04-02
  • C语言动态与静态分别实现通讯录的方法
    这篇文章主要讲解了“C语言动态与静态分别实现通讯录的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言动态与静态分别实现通讯录的方法”吧!一.静态通讯录的实现1.环境的分工逻辑由于过程...
    99+
    2023-06-29
  • C语言实现通讯录小项目
    本文实例为大家分享了C语言实现通讯录小项目的具体代码,供大家参考,具体内容如下 编写程序实现通讯录的基本功能,可以做到增,删,查,改,打印通讯录,等等功能 test.c #inc...
    99+
    2024-04-02
  • C语言实现通讯录小功能
    本文实例为大家分享了C语言实现通讯录功能的具体代码,供大家参考,具体内容如下 头文件contact.h #pragma once #define _CRT_SECURE_NO_...
    99+
    2024-04-02
  • 详解C语言之实现通讯录
    目录基本思路和代码实现其他探讨总结基本思路和代码实现 为了代码清晰易读,我们创建一个Main.c源文件用来实现代码的基本逻辑。创建一个Contact.h源文件用于封装实现功能的函数,...
    99+
    2024-04-02
  • C语言实现简易通讯录实例
    目录一、问题描述二、功能介绍二、实现流程1.创建通讯录2.创建源文件test.c3.创建源文件contact.c4.删除通讯录联系人信息 (DelContact函数实现)5...
    99+
    2024-04-02
  • 如何使用C语言代码实现通讯录功能
    今天小编给大家分享一下如何使用C语言代码实现通讯录功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。首先创建一个test.c...
    99+
    2023-07-02
  • C语言静态与动态通讯录的实现方法是什么
    这篇文章主要讲解了“C语言静态与动态通讯录的实现方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言静态与动态通讯录的实现方法是什么”吧!静态通讯录在我们学习完C语言的结构体、指针...
    99+
    2023-06-25
  • C语言实现通讯录的示例代码
    目录一、Contact.h文件二、Contact.c文件三、test.c文件一、Contact.h文件 包含函数的声明 #pragma once #define _CRT_SECUR...
    99+
    2022-11-13
    C语言实现通讯录 C语言 通讯录
  • C语言实现通讯录的详细代码
    目录(一)实现思路1.通讯录功能2.模块化实现各方面的功能3.代码实现(二)源代码A.test.cB.Contact.hC.Contact.c(一)实现思路 1.通讯录功能 添加好友...
    99+
    2024-04-02
  • C语言使用realloc函数实现通讯录源码分析
    目录一、ContactInit初始化二、ContactCheckCapacity检查通讯录内存是否够用三、ContactDistory释放动态开辟的空间四、源码一、ContactIn...
    99+
    2023-02-01
    C语言通讯录 C语言realloc函数实现通讯录
  • C语言链表实现简易通讯录
    本文实例为大家分享了C语言链表实现简易通讯录的具体代码,供大家参考,具体内容如下 链表实现通讯录功能: 1.添加–(输入 姓名,电话) 2.删除-- (输入人名,删除该人) 3.查询...
    99+
    2024-04-02
  • C语言模拟实现动态通讯录
    目录1.模拟实现通讯录总体架构一览图2.文件执行任务3.分模块实现 测试模块 test.c头文件 功能函数声明 contact.h功能函数逐一实现1.模拟实现通讯录总体架构...
    99+
    2024-04-02
  • C语言实现简单通讯录系统
    本文实例为大家分享了C语言通讯录系统(增删改查),供大家参考,具体内容如下 全部代码如下所示: #include <iostream> #include <s...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作