IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 54.Linux 网络编程 -> 正文阅读

[系统运维]54.Linux 网络编程

socket函数:

? ? ? ? #include <sys/socket.h>

? ? ? ? int socket(int domain,int type,int protocol);? ? ? ? 创建一个套接字

domain(领域)? :AF_INET、AF_INET6、AF_UNIX

type:? SOCK_STREAM、SOCK_DGRAM

protocol:0

返回值:成功:新套接字所对应的文件描述符

? ? ? ? ? ? ? 失败:-1?errno

bind()函数:

????????#include <sys/types.h> ? ? ? ? ?/* See NOTES */
? ? ? ?#include <sys/socket.h>


int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);?

给socket绑定一个IP和port
sockfd:socket函数返回值

addr:(struct sockaddr *)&addr;

struct sockaddr_in addr;

addr.sin_family =?AF_INET;

addr.sin_port = htons(8888);? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//端口号

addr.sin_addr.s_addr = htol(INADDR_ANY);? ? ? ? ? //取出系统中有效的任意IP地址。二进制类型。

addrlen:sizeof(addr);

返回值:成功:0

? ? ? ? ? ? ? ?失败:-1? ? ? ? ?errno

listen函数

? ? ? ?#include <sys/types.h> ? ? ? ? ?/* See NOTES */
? ? ? ?#include <sys/socket.h>

int listen(int sockfd, int backlog);? ?

设置同时与服务器建立连接的上限数。(同时进行3次握手的客户端数量)

sockfd:socket函数返回值

backlog:上限数值,最大值128

返回值:

成功:0

失败:-1?errno

accept函数

????????#include <sys/types.h> ? ? ? ? ?/* See NOTES */
? ? ? ? #include <sys/socket.h>

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);?阻塞等待客户端建立连接

sockfd:socket函数返回值

addr:传出参数。成功与服务器建立连接的那个客户端的地址结构(IP+port)。

? ? ? ? socklen_t client_addr_len = sizeof(addr);

addrlen:传入传出? ? ? ? &client_addr_len

????????????????入:addr的大小。出:客户端addr实际大小。

返回值:能与服务器进行数据通信的socket对应的文件描述符

?????????????成功:返回一个与客户端成功连接的socket文件描述符

? ? ? ?? ? ? 失败:? -1?errno
?

connect函数

???????#include <sys/types.h> ? ? ? ? ?/* See NOTES */
? ? ? ?#include <sys/socket.h>

? ? ? ?int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
? ? ? ?使用现有的socket与服务器建立连接

sockfd:socket函数返回值

? ? ? ? struct sockaddr_in srv_addr;? ? ? ? //服务器地址结构

? ? ? ? srv_addr.sin_family=AF_INET;

? ? ? ? srv_addr.sin_port=666;? ? ? ? ? ? ? ? ? ?//跟服务器端口号一致? ??

? ? ? ? inet_pton(AF_INET,“服务器的IP号”,&srv_addr.sin_addr.s_addr);? ? ? ? ? ? ? ??

addr:传入参数。服务器的地址结构

addrlen:服务器的地址结构的长度

返回值:成功:0

? ? ? ? ? ? ? 失败·:-1

TCP通信流程分析:

? ? ? ? server:

? ? ? ? ? ? ? ? ? ? ? ? 1.socket()? ? ? 创建socket

? ? ? ? ? ? ? ? ? ? ? ? 2.bind()? ? ? ? ? 绑定服务器地址结构

? ? ? ? ? ? ? ? ? ? ? ? 3.listen()? ? ? ? ?设置监听上限

? ? ? ? ? ? ? ? ? ? ? ? 4.accept()? ? ? ?阻塞,监听客户端连接

? ? ? ? ? ? ? ? ? ? ? ? 5.read()? ? ? ? ? ?读socket获取客户端数据

? ? ? ? ? ? ? ? ? ? ? ? 6.小---大写? ? ? ?toupper():小写转大写

? ? ? ? ? ? ? ? ? ? ? ? 7.write()????????????

? ? ? ? ? ? ? ? ? ? ? ? 8.close()

? ? ? ? client:

? ? ? ? ? ? ? ? ? ? ? ? 1.socket()? ? ? ? 创建socket? ? ? ??

? ? ? ? ? ? ? ? ? ? ? ? 2.connect()? ? ? ?与服务器建立连接

? ? ? ? ? ? ? ? ? ? ? ? 3.write()? ? ? ? ? ? 写数据到socket

? ? ? ? ? ? ? ? ? ? ? ? 4.read()? ? ? ? ? ? ?读转换后的数据

? ? ? ? ? ? ? ? ? ? ? ? 5.显示读取结果??

? ? ? ? ? ? ? ? ? ? ? ? 6.close()????????????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

inet_ntop函数

inet_pton()和inet_ntop()函数允许在IPv4和IPv6地址的二进制形式和点分十进制表示法或十六进制字符串表示法之间进行转换。

? ? ? ?#include <arpa/inet.h>

? ? ? ?const char *inet_ntop(int domain, const void *addrptr,char *dst_str, socklen_t size);

这些函数名中的p表示“展现(presentation)”n表示“网络(network)”。展现形式是人类可读的字符串,如:

198.152.189.116(IPv4点分十进制地址);

::1(IPv6冒号分隔的十六进制地址);

::FFFF:198.152.189.116(IPv4映射的IPv6地址)。

inet_ntop()函数执行逆向转换。同样,

①domain应该被指定为AF_INET或AF_INET6,? ? ? ? ? ? ? ? ??

②addrptr应该指向一个待转换的in_addr或in_addr6结构

③得到的以null结尾的字符串会被放置在dst_str指向的缓冲区中。

?④len参数必须被指定为这个缓冲区的大小。

????????

服务器:

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/un.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <time.h>
#include <ctype.h>
#define SERV_PORT 666

int main(int argc,char *argv[])
{
	int sockfd,client_fd;
	struct sockaddr_in serv_addr,client_addr;
	socklen_t client_addr_len;
	int ret;
	char buf[BUFSIZ],client_IP[1024];

	serv_addr.sin_family=AF_INET;
	serv_addr.sin_port=htons(SERV_PORT);
        serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
		

	sockfd=socket(AF_INET,SOCK_STREAM,0);
	if(sockfd==-1){
		perror("socket");
		exit(1);
	}

	bind(sockfd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));

	listen(sockfd,128);
//int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
	client_addr_len=sizeof(client_addr);
	client_fd=accept(sockfd,(struct sockaddr *)&client_addr,&client_addr_len);
	if(client_fd==-1)
	{
		perror("accept");
		exit(1);
	}
//const char *inet_ntop(int af, const void *src,char *dst, socklen_t size);
	
	printf("client ip:%s port:%d\n",
			inet_ntop(AF_INET,&client_addr.sin_addr.s_addr,client_IP,sizeof(client_IP)),htons(client_addr.sin_port));

	while(1){
		ret=read(client_fd,buf,sizeof(buf));
		write(STDOUT_FILENO,buf,ret);

		for(int i=0;i<ret;i++)
			buf[i]=toupper(buf[i]);
	
		write(client_fd,buf,ret);
	}
	close(sockfd);
	close(client_fd);
	return 0;
}

? 客户端

#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/un.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <fcntl.h>
#include <time.h>
#include <ctype.h>
#include <arpa/inet.h>

#define SERV_PORT 666

int main(int argc,char *argv[])
{
	int client_fd;
	int counter=10;
	char buf[BUFSIZ];

	struct sockaddr_in serv_addr;
	serv_addr.sin_family=AF_INET;
	serv_addr.sin_port=htons(SERV_PORT);
//int inet_pton(int af, const char *src, void *dst);
	inet_pton(AF_INET,"127.0.0.1",&serv_addr.sin_addr.s_addr);	

	client_fd=socket(AF_INET,SOCK_STREAM,0);
	if(client_fd==-1)
	{
		perror("socket");
		exit(1);
	}
//int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

	int ret=connect(client_fd,(struct sockaddr *)&serv_addr,sizeof(serv_addr));
	if(ret!=0)
	{	
		perror("connect");	
		exit(1);
	}
//ssize_t write(int fd, const void *buf, size_t count);
//ssize_t read(int fd, void *buf, size_t count);
	while(counter--){
		write(client_fd,"hello",5);	
		ret=read(client_fd,buf,sizeof(buf));
		write(STDOUT_FILENO,buf,ret);
	}

	close(client_fd);
	return 0;
}

? ? ??

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-11-24 08:22:22  更:2021-11-24 08:22:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 0:34:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码