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]
相关推荐
萧鼎1 小时前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
学地理的小胖砸1 小时前
【一些关于Python的信息和帮助】
开发语言·python
疯一样的码农1 小时前
Python 继承、多态、封装、抽象
开发语言·python
^velpro^1 小时前
数据库连接池的创建
java·开发语言·数据库
秋の花1 小时前
【JAVA基础】Java集合基础
java·开发语言·windows
小松学前端1 小时前
第六章 7.0 LinkList
java·开发语言·网络
可峰科技1 小时前
斗破QT编程入门系列之二:认识Qt:编写一个HelloWorld程序(四星斗师)
开发语言·qt
全栈开发圈1 小时前
新书速览|Java网络爬虫精解与实践
java·开发语言·爬虫
城南vision1 小时前
计算机网络——TCP篇
网络·tcp/ip·计算机网络
面试鸭1 小时前
离谱!买个人信息买到网安公司头上???
java·开发语言·职场和发展