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

  • 基于TCP的本地通信(客户机):
  • 创建流程:
  • 一、创建字节流式套接字(socket函数):
	int sock_fd = socket(AF_LOCAL,SOCK_STREAM,0);
  • 二、创建客户机和服务器的本地网络信息结构体并填充客户机和服务器本地网络信息结构体 (struct sockaddr_un):
  • 本地网络信息结构体:
	#include 
	struct sockaddr_un {
	    sa_family_t sun_family;               //AF_LOCAL
	    char        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 
	#include 
	#include 
	
	#include 
	#include 
	#include 
	
	#include 
	#include 
	
	#include 
	#include 
	
	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]

你可能感兴趣的:(c语言,架构,学习,tcp/ip,网络编程,开发语言)