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
相关推荐
roboko_23 分钟前
TCP详解——流量控制、滑动窗口
服务器·网络·tcp/ip
笑稀了的野生俊34 分钟前
ImportError: /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.32‘ not found
linux·人工智能·ubuntu·大模型·glibc·flash-attn
步、步、为营37 分钟前
.net服务器Kestrel配置Nginx作为反向代理
服务器·nginx·.net
千帐灯无此声1 小时前
Linux 测开:日志分析 + 定位 Bug
linux·c语言·c++·bug
誰能久伴不乏1 小时前
深入了解 Vim 编辑器:从入门到精通
linux·编辑器·vim
ghie90901 小时前
在Centos系统上如何有效删除文件和目录的指令汇总
linux·运维·centos
Linux-palpitate1 小时前
Keepalived+LVS实现LNMP网站的高可用部署
linux·运维·服务器·mysql·lvs
潇-xiao2 小时前
进程状态 + 进程优先级切换调度-进程概念(5)
linux·笔记
CZZDg2 小时前
LVS负载均衡-DR模式配置
运维·负载均衡·lvs
FileLink跨网文件交换2 小时前
跨网文件交换?内外网文件交换十大方法构建安全合规的数据传输通道
运维·服务器·网络