- 基于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是一个套接字类型的文件
c
复制代码
bind(sock_fd, (struct sockaddr *)&clientaddr, clientaddr_len);
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);
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]