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)

相关推荐

  • 香橙派Orange Pi 4开发板在Ubuntu系统下怎样使用python控制GPIO

    技术香橙派Orange Pi 4开发板在Ubuntu系统下怎样使用python控制GPIO这篇文章给大家分享的是有关香橙派Orange Pi 4开发板在Ubuntu系统下怎样使用python控制GPIO的内容。小编觉得挺

    攻略 2021年11月12日
  • babyletsgo女生英文歌,奔跑吧第一季第四期插曲

    技术babyletsgo女生英文歌,奔跑吧第一季第四期插曲奔跑吧兄弟第4期插曲如下babyletsgo女生英文歌:1、angelababy叫权烈踢毽子插曲 David Campbell《ducant take my ey

    生活 2021年10月22日
  • 如何使用ML.NET实现基于RFM模型的客户价值分析

    技术如何使用ML.NET实现基于RFM模型的客户价值分析本篇文章为大家展示了如何使用ML.NET实现基于RFM模型的客户价值分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。RF

    攻略 2021年11月10日
  • mssql邮件无法初始化(winxp命令启动sql)

    技术当MSSQL无法调用Xp_CmdShell时该怎么办这期内容当中小编将会给大家带来有关当MSSQL无法调用Xp_CmdShell时该怎么办,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收

    攻略 2021年12月14日
  • 选择经济实惠的美国服务器如何影响业务增长

    技术选择经济实惠的美国服务器如何影响业务增长对于跨境企业来说,公司网站所体现出的在线形象对您来说非常重要。很多出于成本考虑租用共享服务器的企业可能并没有意识到他们的服务器被数百甚至数千个其他网站共同适用使用。实际上,无论

    礼包 2021年12月24日
  • UML序列图怎么用

    技术UML序列图怎么用小编给大家分享一下UML序列图怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!UML序列图UML序列图显示具体用例(

    攻略 2021年12月4日