已解决
C/S架构学习之基于TCP的本地通信(客户机)
来自网友在路上 167867提问 提问时间:2023-11-11 00:06:46阅读次数: 67
最佳答案 问答题库678位专家为你答疑解惑
- 基于TCP的本地通信(客户机):
- 创建流程:
- 一、创建字节流式套接字(socket函数):
int sock_fd = socket(AF_LOCAL,SOCK_STREAM,0);
- 二、创建客户机和服务器的本地网络信息结构体并填充客户机和服务器本地网络信息结构体 (struct sockaddr_un):
- 本地网络信息结构体:
#include <sys/un.h>struct sockaddr_un {sa_family_t sun_family; //AF_LOCALchar sun_path[108]; //pathname};
//填充服务器和客户机网络信息结构体struct sockaddr_un serveraddr, clientaddr;socklen_t serveraddr_len = sizeof(serveraddr);socklen_t clientaddr_len = sizeof(clientaddr);memset(&serveraddr, 0, serveraddr_len);memset(&clientaddr, 0, clientaddr_len);serveraddr.sun_family = AF_LOCAL;clientaddr.sun_family = AF_LOCAL;strcpy(serveraddr.sun_path, "./tcpserver"); //tcpserver是一个套接字类型的文件strcpy(clientaddr.sun_path, "./tcpclient"); //tcpclient是一个套接字类型的文件
- 三、客户机绑定字节流式套接字(bind函数):、
bind(sock_fd, (struct sockaddr *)&clientaddr, clientaddr_len);
- 四、与服务器建立连接(connect函数):
connect(sock_fd, (struct sockaddr *)&serveraddr, serveraddr_len);
- 五、客户机端发收数据(send函数、recv函数):
memset(buf, 0, sizeof(buf));fgets(buf,sizeof(buf),stdin);buf[strlen(buf) - 1] = '\0';//给服务器发送消息int ret1 = send(sock_fd,buf,sizeof(buf),0);if(-1 == ret1){perror("send error");exit(-1);}memset(buf,0,sizeof(buf));//接收服务器的应答消息int ret2 = recv(sock_fd,buf,sizeof(buf),0);if(-1 == ret2){perror("recv error");exit(-1);}printf("服务器的应答消息[%s]\n",buf);
- 六、关闭套接字(close函数):
close(sock_fd);
- 示例代码:
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <sys/socket.h>#include <sys/types.h>#include <netinet/ip.h>#include <sys/un.h>#include <arpa/inet.h>#include <stdbool.h>int main(int argc, char const *argv[]){// 创建套接字int sock_fd = socket(AF_LOCAL, SOCK_STREAM, 0);if (-1 == sock_fd){perror("socket error");exit(-1);}// 填充客户机和服务器网络信息结构体struct sockaddr_un serveraddr, clientaddr;socklen_t serveraddr_len = sizeof(serveraddr);socklen_t clientaddr_len = sizeof(clientaddr);memset(&serveraddr, 0, serveraddr_len);memset(&clientaddr, 0, clientaddr_len);serveraddr.sun_family = AF_LOCAL;clientaddr.sun_family = AF_LOCAL;strcpy(serveraddr.sun_path, "./tcpserver"); //tcpserver是一个套接字类型的文件strcpy(clientaddr.sun_path, "./tcpclient"); //tcpclient是一个套接字类型的文件// 客户机绑定套接字if (-1 == bind(sock_fd, (struct sockaddr *)&clientaddr, clientaddr_len)){perror("bind error");exit(-1);}// 与服务器建立连接if (-1 == connect(sock_fd, (struct sockaddr *)&serveraddr, serveraddr_len)){perror("connect error");exit(-1);}char buf[128] = {0};int ret1 = 0;int ret2 = 0;// 提示信息printf("本地通信之TCP客户机成功连接服务器!!!\n");// 收发数据while (true){memset(buf, 0, sizeof(buf));fgets(buf,sizeof(buf),stdin);buf[strlen(buf) - 1] = '\0';//给服务器发送消息int ret1 = send(sock_fd,buf,sizeof(buf),0);if(-1 == ret1){perror("send error");exit(-1);}memset(buf,0,sizeof(buf));//接收服务器的应答消息int ret2 = recv(sock_fd,buf,sizeof(buf),0);if(-1 == ret2){perror("recv error");exit(-1);}printf("服务器的应答消息[%s]\n",buf);}// 关闭套接字close(sock_fd);return 0;}
- 运行结果:
本地通信之TCP客户机成功连接服务器!!!hello服务器的应答消息[hello-------k]hi服务器的应答消息[hi-------k]I Love China!!!服务器的应答消息[I Love China!!!-------k]
查看全文
99%的人还看了
相似问题
- Docker篇之利用docker搭建ftp服务器可实现多用户上传
- 【Vue3】解决Vue打包后上传服务器 资源路径加载错误
- 【史上最细教程】服务器MySQL数据库完成主从复制
- 中间件安全:Apache Tomcat 弱口令.(反弹 shell 拿到服务器的最高控制权.)
- 服务器端请求伪造(SSRF)
- VMware 系列:戴尔服务器配置(格式数据、RAID5、安装ESXI)以及相关问题
- 超详细 | 实验室linux服务器非root账号 | 安装pip | 安装conda
- 腾讯云4核8G服务器配置价格表,轻量和CVM标准型S5实例
- 推荐一个windows上传linux服务器/linux服务器的docker镜像的工具,摆脱docker cp,以及解决常见问题。
- 2.6文件服务器
猜你感兴趣
版权申明
本文"C/S架构学习之基于TCP的本地通信(客户机)":http://eshow365.cn/6-37370-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!