linux 套接字通信 课程设计,Linux网络编程(7)本地套接字通信

**TCP本地套接字通信:**为了实现没有血缘关系的进程之间通信,通常会采用本地套接字进行通信,在两个进程分别绑定好了套接字文件(.sock),运行程序后将产生两个套接字文件,这两个文件共享同一片内核缓冲区,内核将完成两个进程之间的数据传输

a8348d0a7c24e035131cd441ca28bb9c.png

在不同通信中采用不同的结构体

30b1b1138593e5e7c0297e4d6d90e7ae.png

实现流程(TCP实现)

服务器

1.创建套接字

int lfd = socket(AF_LOCAL,SOCK_STREAM,0);

2.绑定

struct sockaddr_un serv;

serv.sun_family = af_local;

strcpy(serv.sun_path,“server.socket”);

bind(lfd,(struct sockaddr*)&serv,len);

3.设置监听

listen();

4.等待接收连接请求

struct sockaddr_un client;

int len = sizeof(client);

int cfd = accept(lfd,&client,&len);

5.通信

发送数据:send

接收数据:recv

6.断开连接

close(cfd);

close(lfd);

客户端

1.创建套接字

int fd =socket(af_local,sock_stream,0);

2.绑定套接字文件

struct sockaddr_un client;

client.sun_family = af_local;

strcpy(client.sun_path,“client.socket”);

bind(fd,(strcut sockaddr*)&client,len);

3.建立连接

struct sockaddr_un serv;

serv.sun_family = af_local;

strcpy(serv.sun_path,“server.soket”);

connetc(fd,&serv,sizeof(server));

4.通信

发送数据:send();

接收数据:recv();

5.关闭连接

close(fd);

完整代码

服务器

#include #include #include #include #include #include #include #include int main(int argc, const char* argv[])

{

int lfd = socket(AF_LOCAL, SOCK_STREAM, 0);

if(lfd == -1)

{

perror("socket error");

exit(1);

}

// 如果套接字文件存在, 删除套接字文件

unlink("server.sock");

// 绑定

struct sockaddr_un serv;

serv.sun_family = AF_LOCAL;

strcpy(serv.sun_path, "server.sock");

int ret = bind(lfd, (struct sockaddr*)&serv, sizeof(serv));

if(ret == -1)

{

perror("bind error");

exit(1);

}

// 监听

ret = listen(lfd, 36);

if(ret == -1)

{

perror("listen error");

exit(1);

}

// 等待接收连接请求

struct sockaddr_un client;

socklen_t len = sizeof(client);

int cfd = accept(lfd, (struct sockaddr*)&client, &len);

if(cfd == -1)

{

perror("accept error");

exit(1);

}

printf("======client bind file: %s\n", client.sun_path);

// 通信

while(1)

{

char buf[1024] = {0};

int recvlen = recv(cfd, buf, sizeof(buf), 0);

if(recvlen == -1)

{

perror("recv error");

exit(1);

}

else if(recvlen == 0)

{

printf("clietn disconnect ....\n");

close(cfd);

break;

}

else

{

printf("recv buf: %s\n", buf);

send(cfd, buf, recvlen, 0);

}

}

close(cfd);

close(lfd);

return 0;

}

客户端

#include #include #include #include #include #include #include #include int main(int argc, const char* argv[])

{

int fd = socket(AF_LOCAL, SOCK_STREAM, 0);

if(fd == -1)

{

perror("socket error");

exit(1);

}

unlink("client.sock");

// ================================

// 给客户端绑定一个套接字文件

struct sockaddr_un client;

client.sun_family = AF_LOCAL;

strcpy(client.sun_path, "client.sock");

int ret = bind(fd, (struct sockaddr*)&client, sizeof(client));

if(ret == -1)

{

perror("bind error");

exit(1);

}

// 初始化server信息

struct sockaddr_un serv;

serv.sun_family = AF_LOCAL;

strcpy(serv.sun_path, "server.sock");

// 连接服务器

connect(fd, (struct sockaddr*)&serv, sizeof(serv));

// 通信

while(1)

{

char buf[1024] = {0};

fgets(buf, sizeof(buf), stdin);

send(fd, buf, strlen(buf)+1, 0);

// 接收数据

recv(fd, buf, sizeof(buf), 0);

printf("recv buf: %s\n", buf);

}

close(fd);

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值