Linux--socket编程--服务端代码

查看struct sockaddr_in包含的东西:

在/user/include下搜索:grep "struct sockaddr_in { " * -nir

r : 递归

i : 不区分大小写

n : 显示行号

socket编程--服务端代码

c 复制代码
/*
1、调用 socket 创建套接字
2、调用 bind 添加地址
3、listen 监听
4、accept 连接
5、read
6、write
*/

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
//#include <linux/in.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>


int main()
{
	int s_fd;

//1、创建套接字 socket
	s_fd = socket(AF_INET,SOCK_STREAM,0);//用到IPV4,TCP协议,0自动配合起来
	if(s_fd == -1){						//返回-1,错误
		perror("socket");
		exit(-1);
	}
	
	
//2、添加地址 bind		
	struct sockaddr_in s_addr;		//定义结构体
	s_addr.sin_family = AF_INET;	//协议族
	s_addr.sin_port = htons(8989);	//端口号,一般为5000--9000
	//电脑为x86是小端字节序,网络字节序为大端字节序。所以要进行转换用htons
	inet_aton("172.0.0.1",&s_addr.sin_addr);
	//把字符串形式的127.0.0.1转换成网络能识别的格式。用到inet_aton


	bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct socket_in));
	

//3、监听listen
	listen(s_fd,10);//监听10个
	
//4、连接 accept
	int c_fd = accept(s_fd,NULL,NULL);
	//连接到客户端之后,后续的操作用返回值c_fd来操作
	
//5、read


//6、write
	
	
	printf("connect\n");//数据连接之后打印
	while(1);
	
	return 0;
}

编译运行此代码;

windos+R 输入cmd指令,然后ping + ip是否接通;通过之后,输入telnet + ip + 端口号。则该服务器连接客户端成功代码向下运行,打印出connect字符。

windos10系统默认不开启telnet,需要查询开启方法进行开启,再使用该命令。

数据互通:

c 复制代码
/*
1、调用 socket 创建套接字
2、调用 bind 添加地址
3、listen 监听
4、accept 连接
5、read
6、write
*/

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
//#include <linux/in.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>


int main()
{
	int s_fd;
	int n_read;
	char redBuf[128];
	
	char *retmessage = "I get your message!\n";
	
	struct sockaddr_in s_addr;		//定义结构体
	struct sockaddr_in c_addr;
	
	//数据清空
	memset(&s_addr,0,sizeof(struct sockaddr_in));
	memset(&c_addr,0,sizeof(struct sockaddr_in));
	

//1、创建套接字 socket
	s_fd = socket(AF_INET,SOCK_STREAM,0);//用到IPV4,TCP协议,0自动配合起来
	if(s_fd == -1){						//返回-1,错误
		perror("socket");
		exit(-1);
	}
	
	
//2、添加地址 bind		
	
	s_addr.sin_family = AF_INET;	//协议族
	s_addr.sin_port = htons(8989);	//端口号,一般为5000--9000
	//电脑为x86是小端字节序,网络字节序为大端字节序。所以要进行转换用htons
	inet_aton("172.0.0.1",&s_addr.sin_addr);
	//把字符串形式的127.0.0.1转换成网络能识别的格式。用到inet_aton


	bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct socket_in));
	

//3、监听listen
	listen(s_fd,10);//监听10个
	
//4、连接 accept
	int clen = sizeof(struct socket_in);
	int c_fd = accept(s_fd,(struct sockaddr *)&c_addr ,&clen);
	//连接到客户端之后,后续的操作用返回值c_fd来操作
	
	if(c_fd == -1){
		perror("accept");
	}

	printf("get connect : %s\n",inet_ntoa(c_addr.sin_addr));//把网络格式的IP转换为字符格式
	
//5、read
	n_read = read(c_fd,redBuf,128);
	if(n_read == -1){
		perror("read");
	}else{
		printf("get message : %d,%s\n",n_read,redBuf);
	}

//6、write
	write(c_fd,retmessage,strlen(retmessage));

	return 0;
}

在新的界面,telnet + ip + 端口号,实现连接

输出结果:

bash 复制代码
Trying 172.0.0.1...
Connected to 172.0.0.1.
Escape character is '^]'.
laowang
I get your message!
Connection closed by foreign host.

另一个界面:

bash 复制代码
get connect : 172.0.0.1
get message : 8,laowang
相关推荐
回忆是昨天里的海几秒前
k8s安装-kubeadm join,将工作节点加入k8s集群
java·服务器·kubernetes
TG_yunshuguoji38 分钟前
亚马逊云代理:AWS的EC2, S3, RDS,Lambda具体简介
服务器·云计算·aws
王道长服务器 | 亚马逊云42 分钟前
AWS CloudFormation —— 自动化部署的“云中脚本大师”
运维·服务器·网络·自动化·云计算·aws
christine-rr1 小时前
MySQL数据库管理、DDL、DQL、DML、DCL等总结
linux·数据库·mysql
奥尔特星云大使1 小时前
CentOS 7 上通过 RPM 包安装 Zabbix 4.x
linux·centos·zabbix
Bruce_Liuxiaowei1 小时前
解决Kali虚拟机中VMnet1(仅主机模式)网卡无法获取IP地址的问题
运维·网络·网络协议·tcp/ip
key_Go1 小时前
12.docker swarm
运维·docker·容器·docker swarm
程序员勾践1 小时前
安装nginx
linux·nginx·centos
馨谙1 小时前
SSH密钥认证:从密码到密钥的安全升级指南
运维·安全·ssh
郝学胜-神的一滴1 小时前
Linux 进程控制块(PCB)解析:深入理解进程管理机制
linux·服务器·开发语言