C/S架构学习之基于TCP的本地通信(客户机)

  • 基于TCP的本地通信(客户机):
  • 创建流程:
  • 一、创建字节流式套接字(socket函数):
c 复制代码
	int sock_fd = socket(AF_LOCAL,SOCK_STREAM,0);
  • 二、创建客户机和服务器的本地网络信息结构体并填充客户机和服务器本地网络信息结构体 (struct sockaddr_un):
  • 本地网络信息结构体:
c 复制代码
	#include <sys/un.h>
	struct sockaddr_un {
	    sa_family_t sun_family;               //AF_LOCAL
	    char        sun_path[108];            //pathname
	};
c 复制代码
	//填充服务器和客户机网络信息结构体
    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函数):
c 复制代码
	bind(sock_fd, (struct sockaddr *)&clientaddr, clientaddr_len);
  • 四、与服务器建立连接(connect函数):
c 复制代码
	connect(sock_fd, (struct sockaddr *)&serveraddr, serveraddr_len);
  • 五、客户机端发收数据(send函数、recv函数):
c 复制代码
		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函数):
c 复制代码
	close(sock_fd);
  • 示例代码:
c 复制代码
	#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;
	}
  • 运行结果:
c 复制代码
	本地通信之TCP客户机成功连接服务器!!!
	hello
	服务器的应答消息[hello-------k]
	hi
	服务器的应答消息[hi-------k]
	I Love China!!!
	服务器的应答消息[I Love China!!!-------k]
相关推荐
KoalaShane15 分钟前
El-slider 增加鼠标滚动滑块事件
开发语言·前端·javascript
PNP Robotics19 分钟前
PNP机器人受邀参加英业达具身智能活动
大数据·人工智能·python·学习·机器人
iconball21 分钟前
个人用云计算学习笔记 --24 虚拟化、KVM 基础使用与热迁移实验、VMware ESXi笔记
运维·笔记·学习·云计算
智算菩萨26 分钟前
【Python进阶】搭建AI工程:Python模块、包与版本控制
开发语言·人工智能·python
C_心欲无痕28 分钟前
vue3 - watchSyncEffect同步执行的响应式副作用
开发语言·前端·javascript·vue.js·vue3
墨雪不会编程33 分钟前
C++【string篇1遍历方式】:从零开始到熟悉使用string类
java·开发语言·c++
特立独行的猫a36 分钟前
QT开发鸿蒙PC应用:环境搭建及第一个HelloWorld
开发语言·qt·harmonyos·环境搭建·鸿蒙pc
a努力。43 分钟前
字节Java面试被问:系统限流的实现方式
java·开发语言·后端·面试·职场和发展·golang
独自破碎E1 小时前
Java中的Exception和Error有什么区别?
java·开发语言
zyx没烦恼1 小时前
YAML模块
开发语言·python