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
相关推荐
lybugproducer15 分钟前
深入 Linux 文件系统:从数据存储到万物皆文件
linux
烦躁的大鼻嘎23 分钟前
【Linux】深入Linux多线程架构与高性能编程
linux·运维·服务器·开发语言·c++·ubuntu
羚羊角uou29 分钟前
【Linux】system V共享内存
linux·运维·服务器
林克爱塞尔达40 分钟前
Linux入门(二)
linux·运维·chrome
破烂儿43 分钟前
Ubuntu Server 安装图形界面和通过Window远程桌面连接服务器(Xrdp)
linux·服务器·ubuntu
Hello.Reader1 小时前
Kafka 运维实战基本操作含命令与最佳实践
运维·kafka·linq
存储服务专家StorageExpert1 小时前
手搓一个 DELL EMC Unity存储系统健康检查清单
linux·运维·服务器·存储维护·emc存储
笑口常开xpr2 小时前
Linux 库开发入门:静态库与动态库的 2 种构建方式 + 5 个编译差异 + 3 个加载技巧,新手速看
linux·c语言·动态库·静态库
小虾米vivian2 小时前
达梦:将sql通过shell脚本的方式放在后台执行
服务器·数据库·sql
SonOfWind03112 小时前
CentOS搭建本地源
linux·运维·centos