本文主要介绍如何用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