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]
相关推荐
IT爱学堂1 小时前
QT原理与源码分析可以学到什么 QT视频课程 QT课程推荐 最新推荐
开发语言·qt
wuyk5551 小时前
Python 零基础入门第七章:字典 Dict
开发语言·python
躺着听Jay1 小时前
QT交叉编译
开发语言·qt
2601_966949651 小时前
如何判断盘中最新价相对昨日收盘涨跌幅,并实时触发止盈止损条件单:QuantDash Python 实战
开发语言·python·量化策略·量化·quantdash
treesforest1 小时前
前端表单提效实践:基于IP地理位置实现国家区号智能预填
前端·网络协议·tcp/ip·ip定位·ip属地
跨境技工小黎1 小时前
YouTube联盟营销如何变现?如何利用IP代理提高流量变现效果?
服务器·网络·tcp/ip
下辈子不要当码农1 小时前
Day7-Linux软件编程(进程与线程(3))
java·开发语言
骐骥11 小时前
学习:Webview的runJavaScript和runJavaScriptExt有什么区别
学习·鸿蒙
存在morning1 小时前
【Flink SQL 学习笔记 二】实时聚合:用窗口和 Watermark 把订单按时段统计
sql·学习·flink
高亦真1 小时前
今天是学习嵌入式的第31天
linux·学习·算法