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)

相关推荐

  • 基于Maxwell的MySQL数据传输服务整体设计方法教程

    技术基于Maxwell的MySQL数据传输服务整体设计方法教程这篇文章主要介绍“基于Maxwell的MySQL数据传输服务整体设计方法教程”,在日常操作中,相信很多人在基于Maxwell的MySQL数据传输服务整体设计方

    攻略 2021年10月22日
  • className用法

    技术className用法 className用法className用法4.className用法例 4.1(keyIEFF.html)!DOCTYPE html PUBLIC "-//W3C//DTD

    礼包 2021年11月26日
  • SpringBoot中的Bean初始化方法是什么

    技术SpringBoot中的Bean初始化方法是什么本篇内容介绍了“SpringBoot中的Bean初始化方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这

    攻略 2021年11月29日
  • 有草有水的寓意好的字,姓王想起一个有水有草的女孩名字

    技术有草有水的寓意好的字,姓王想起一个有水有草的女孩名字展开全部 王渃有草有水的寓意好的字, 王淓,两个字就行,以后名字都三个字的,两个字姓名吃香 PS,友情提醒,千万别采纳三个字的名字。。。。看到幼儿园,小学入学名单你

    生活 2021年10月24日
  • which的用法总结,which的意思和用法

    技术which的用法总结,which的意思和用法1which的用法总结、(用作疑问代词)哪一个,哪一些Which is my seat?哪个座位是我的?2、(用做关系代词)那一个,那一些
    He also had a gu

    生活 2021年10月20日
  • segmentation调试方法(segmentfault脚本怎么写)

    技术Segmentation中anchor free方法怎么实现的小编给大家分享一下Segmentation中anchor free方法怎么实现的,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读

    攻略 2021年12月20日