c语言socket编程流程(c语言socket编程怎么实现)

技术如何使用C语言实现本地socke通讯这篇文章主要介绍了如何使用C语言实现本地socke通讯,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、概述  使

本文主要介绍如何用C语言实现本地socke通信,具有一定的参考价值。有兴趣的朋友可以参考一下。希望大家看完这篇文章后收获多多。让边肖带你去了解一下。

00-1010进程之间的通信可以通过使用本地套接字通信来实现。

相关功能描述如下:

intsocket(intdomain、inttype、int protocol);

功能描述:创建本地套接字

参数:

domain:AF_UNIXorAF_LOCAL

Type:SOCK _ STREAM或SOCK_DGRAM

Protocol:0表示使用默认协议。

函数返回值:

成功:返回文件描述符。

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

成功创建套接字后,将在内核中创建一个缓冲区。下图是客户端和服务器内核缓冲区的示意图。

intbind(intsockfd,conststructsockaddr * addr,sock len _ tad drlen);

功能描述:绑定套接字

参数:

Socket:套接字函数返回的文件描述符

Addr:本地地址

Addlen:本地地址长度

函数返回值:

成功:返回文件描述符。

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

需要注意的是,bind函数会自动创建套接字文件。如果在调用bind函数之前套接字文件已经存在,那么对bind的调用将会给出一个错误。您可以使用unlink函数在绑定前删除文件。

structsockaddr_un{

sa _ family _ tsun _ family/*AF_UNIXorAF_LOCAL*/

char sun _ path[108];/*路径名*/

};整体使用步骤与网络通信的socket类似,如下图所示:

Tcp本地套接字服务器进程:

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

强制绑定structsockaddr_un

听着听着

获取新连接接受

通信循环读写

关闭文件描述符关闭

Tcp本地套接字客户端进程:

调用套接字来创建套接字

调用bind函数将套接字文件描述与套接字文件绑定。

不会,如果没有显式绑定,会隐式绑定,但是服务器不知道连接的是谁。

调用connect函数连接服务器。

通信循环读写

关闭文件描述符关闭

一、概述

1。服务器代码示例

//本地套接字通信服务器

# includestdio.h

# includestdlib.h

#includestring.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通讯”这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/153414.html

(0)

相关推荐

  • 如何理解互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景

    技术如何理解互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景本篇内容主要讲解“如何理解互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家

    攻略 2021年10月22日
  • 数据库原理知识点有哪些

    技术数据库原理知识点有哪些这篇文章主要介绍“数据库原理知识点有哪些”,在日常操作中,相信很多人在数据库原理知识点有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”数据库原理知识点有哪些”

    攻略 2021年11月3日
  • 如何使用dtb方式启动内核

    技术如何使用dtb方式启动内核这篇文章给大家介绍如何使用dtb方式启动内核,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。主要使用dtb方式启动LINUX内核的过程。采用DTB方式启动LINUX内核,

    攻略 2021年11月2日
  • vue 组件对外暴露方法(vue 中的store如何存取数据)

    技术Vue中怎样把数据包装成reactive从而实现MDV效果Vue中怎样把数据包装成reactive从而实现MDV效果,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来

    攻略 2021年12月25日
  • VB.NET对话框怎么用

    技术VB.NET对话框怎么用这篇文章主要为大家展示了“VB.NET对话框怎么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“VB.NET对话框怎么用”这篇文章吧。VB.NET

    攻略 2021年12月2日
  • 追溯系统数据怎么做(大数据溯源)

    技术大数据中如何实现数据的高效追溯这篇文章给大家介绍大数据中如何实现数据的高效追溯,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。如何基于GES图数据库追溯服务的实现和优化。“一分钟,我要这个人的全部

    攻略 2021年12月23日