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
相关推荐
zhangrelay5 分钟前
如何更环保(更省钱)的使用各类电子耗材/消耗品/易损件~电池为例
linux·笔记·学习
独隅31 分钟前
本地大模型训练与 API 服务部署全栈方案:基于 Ubuntu 22.04 LTS 的端到端实现指南
服务器·python·语言模型
dustcell.33 分钟前
高级课前复习2--RHCSA
linux·运维·服务器
胖少年35 分钟前
Ubuntu 24.04 LTS apt autoremove 误删依赖致程序崩溃 解决与预防笔记
linux·笔记·ubuntu
Anthony_2311 小时前
五、交换技术与VLAN
服务器·网络·网络协议·http·https·udp·信息与通信
fanruitian1 小时前
k8s 更新镜像
java·服务器·kubernetes
Controller-Inversion1 小时前
k8s服务部署相关问题
linux·容器·kubernetes
梁洪飞1 小时前
使用rockchip sdk提供的uboot调通网络
linux·网络·arm开发·嵌入式硬件·arm
fanruitian1 小时前
k8s 创建service 暴漏集群ip
服务器·网络·kubernetes
Source.Liu1 小时前
【办公平台】在 Ubuntu 上部署 Synapse Matrix 服务器(本地网络版)
服务器·ubuntu