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)

相关推荐

  • 深圳前海新区,深圳什么地方经济最发达

    技术深圳前海新区,深圳什么地方经济最发达目前(未算前海)有两个街道算是最发达的 粤海街道约占南山区1/2、全市1/10GDP, 坂田街道约占龙岗区1/2、全市近1/10深圳前海新区, 以上两个街道比上海黄埔区还要小很多,

    生活 2021年10月29日
  • 怎么解决php验证码不变的问题

    技术怎么解决php验证码不变的问题这篇文章主要介绍“怎么解决php验证码不变的问题”,在日常操作中,相信很多人在怎么解决php验证码不变的问题问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”

    攻略 2021年10月25日
  • 为什么应该选择美国服务器服务器租用美国

    技术为什么应该选择美国服务器服务器租用美国在海外服务器上搭建您的网站时,美国服务器都是您应该考虑的选项。以下是为什么应该选择美国服务器的原因专业技术支持 人们应该选择美国服务器租用服务的主要原因是它提供的技术支持。无论发

    礼包 2021年12月17日
  • 如何使用Mybatis注解方式完成输入参数为list的SQL语句拼接方式

    技术如何使用Mybatis注解方式完成输入参数为list的SQL语句拼接方式这篇文章给大家分享的是有关如何使用Mybatis注解方式完成输入参数为list的SQL语句拼接方式的内容。小编觉得挺实用的,因此分享给大家做个参

    攻略 2021年11月30日
  • 如何用Python实现图像文字识别OCR工具

    技术如何用Python实现图像文字识别OCR工具这篇文章主要介绍“如何用Python实现图像文字识别OCR工具”,在日常操作中,相信很多人在如何用Python实现图像文字识别OCR工具问题上存在疑惑,小编查阅了各式资料,

    攻略 2021年12月11日
  • jquery如何检查一个表格有多少行

    技术jquery如何检查一个表格有多少行这篇文章主要为大家展示了“jquery如何检查一个表格有多少行”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“jquery如何检查一个表

    攻略 2021年11月21日