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
相关推荐
C++忠实粉丝32 分钟前
Linux环境基础开发工具使用(2)
linux·运维·服务器
康熙38bdc1 小时前
Linux 环境变量
linux·运维·服务器
存储服务专家StorageExpert1 小时前
DELL SC compellent存储的四种访问方式
运维·服务器·存储维护·emc存储
hakesashou2 小时前
python如何比较字符串
linux·开发语言·python
Ljubim.te2 小时前
Linux基于CentOS学习【进程状态】【进程优先级】【调度与切换】【进程挂起】【进程饥饿】
linux·学习·centos
cooldream20092 小时前
Linux性能调优技巧
linux
大G哥2 小时前
记一次K8S 环境应用nginx stable-alpine 解析内部域名失败排查思路
运维·nginx·云原生·容器·kubernetes
长天一色2 小时前
【ECMAScript 从入门到进阶教程】第三部分:高级主题(高级函数与范式,元编程,正则表达式,性能优化)
服务器·开发语言·前端·javascript·性能优化·ecmascript
醉颜凉2 小时前
银河麒麟桌面操作系统修改默认Shell为Bash
运维·服务器·开发语言·bash·kylin·国产化·银河麒麟操作系统
QMCY_jason3 小时前
Ubuntu 安装RUST
linux·ubuntu·rust