当前位置:首页 > 编程笔记 > 正文
已解决

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%的人还看了

猜你感兴趣

版权申明

本文"C/S架构学习之基于TCP的本地通信(客户机)":http://eshow365.cn/6-37370-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!