十度网站建设,怎么攻击网站吗,网站搭建好之后提示网页走丢了,前端需要学什么语言懒大王感谢大家的关注和三连支持~ 目录
前言
一、UDP编程
UDP特点#xff1a; UDP框架:
UDP函数学习 发送端代码案例如下#xff1a;
二、多路复用
前提讲述
select
poll
三、图解如下
总结 前言 作者简介#xff1a; 懒大王敲代码#xff0c;… 懒大王感谢大家的关注和三连支持~ 目录
前言
一、UDP编程
UDP特点 UDP框架:
UDP函数学习 发送端代码案例如下
二、多路复用
前提讲述
select
poll
三、图解如下
总结 前言 作者简介 懒大王敲代码正在学习嵌入式方向有关课程stm32网络编程数据结构C/C等 今天给大家继续详细讲解网络编程基础知识希望能够帮到大家 欢迎大家点赞 收藏 ⭐ 加关注哦 一、UDP编程
UDP特点 UDP的特点不要连接只管发送数据因此不稳定易丢包。 UDP与TCP不同之处 1没有服务器跟客户端的观念 2没有accept和connect 3UDP实际对于网络需求略高一点 UDP框架: 发送端 : 1创建socket套接字 2绑定自己的IP地址和端口号 3声明别人的IP地址和端口号 4发送数据(函数有变化) 接收端: 1创建socket套接字 2绑定自己的IP地址和端口号 3声明别人的IP地址和端口号 4接收数据(函数有变化) UDP函数学习 1sendto #include sys/types.h #include sys/socket.h int sendto(int sockfd, const void *buf, int len, unsigned int flags, const struct sockaddr *dest_addr, int addrlen); 功能: 发送数据(用第五参数定位对方的IP地址和端口号) 参数: sockfd:套接字 buf发送缓冲区 len: 发送缓冲区的长度 flags默认为0 dest_addr:结构体(包含目标的IP和端口号) addrlen结构体的长度 返回值: 成功返回发送字节数 失败返回-1并设置错误码 2recvfrom #include sys/types.h #include sys/socket.h int recvfrom(int sockfd, const void *buf, int len, unsigned int flags, const struct sockaddr *src_addr, socklen_t *addrlen); 功能: 接收数据(用第五参数定位对方的IP地址和端口号) 参数: sockfd:套接字 buf接收缓冲区 len: 接收缓冲区的长度 flags默认为0 src_addr:结构体(包含目标的IP和端口号) addrlen结构体的长度的指针 返回值: 成功返回接收字节数 失败返回-1并设置错误码 发送端代码案例如下
#include stdio.h
#include sys/types.h
#include sys/socket.h
#include arpa/inet.h
#include netinet/in.h
#include string.h
#include stdlib.h
#include unistd.h
#include pthread.h
int main(int argc,char *argv[])
{if(argc5){printf(请输入./可执行 自己IP 自己端口号 目标IP 目标端口号\n);return -1;}//1创建socket套接字int sfd;sfd socket(AF_INET,SOCK_DGRAM,0);//注意换UDP类型if(sfd0){perror(socket);return -1;}//2绑定自己的IP和端口号struct sockaddr_in myself;myself.sin_family AF_INET;myself.sin_port htons(atoi(argv[2])); //9000myself.sin_addr.s_addr inet_addr(argv[1]);if(bind(sfd,(struct sockaddr *)myself,sizeof(myself))0){perror(bind);return -1;}//3声明别人的IP和端口号struct sockaddr_in other;other.sin_family AF_INET;other.sin_port htons(atoi(argv[4])); //8888other.sin_addr.s_addr inet_addr(argv[3]);//4发送数据char buf[50];while(1){bzero(buf,sizeof(buf));scanf(%s,buf);sendto(sfd,buf,strlen(buf),0,(struct sockaddr *)other,sizeof(other));}close(sfd);return 0;
}
接收端代码案例如下 #include stdio.h
#include sys/types.h
#include sys/socket.h
#include arpa/inet.h
#include netinet/in.h
#include string.h
#include stdlib.h
#include unistd.h
#include pthread.h
int main(int argc,char *argv[])
{if(argc5){printf(请输入./可执行 自己IP 自己端口号 目标IP 目标端口号\n);return -1;}//1创建socket套接字int sfd;sfd socket(AF_INET,SOCK_DGRAM,0);//注意换UDP类型if(sfd0){perror(socket);return -1;}//2绑定自己的IP和端口号struct sockaddr_in myself;myself.sin_family AF_INET;myself.sin_port htons(atoi(argv[2])); //8888myself.sin_addr.s_addr inet_addr(argv[1]);if(bind(sfd,(struct sockaddr *)myself,sizeof(myself))0){perror(bind);return -1;}//3声明别人的IP和端口号struct sockaddr_in other;other.sin_family AF_INET;other.sin_port htons(atoi(argv[4])); //9000other.sin_addr.s_addr inet_addr(argv[3]);//4接受数据char buf[50];int len sizeof(other);while(1){bzero(buf,sizeof(buf));recvfrom(sfd,buf,sizeof(buf),0,(struct sockaddr *)other,len);printf(发送方说:%s\n,buf);}close(sfd);return 0;
}
二、多路复用
前提讲述 IO阻塞和IO非阻塞 int fcntl(int fd, int cmd, long arg); //改变文件描述符的特性 int flag flag fcntl(sockfd, F_GETFL, 0);//F_GETFL获取文件描述符的特性 flag | O_NONBLOCK;//配置非阻塞 fcntl(sockfd, F_SETFL, flag);//设置文件描述符特性为非阻塞 select select int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); 功能就是将你要关心的文件描述符放入一个集合中将这个集合交给内核判断当集合中 某个文件描述符被触发时解除阻塞。 参数 nfds:最大文件描述符1 readfds读集合 writefds:写集合 exceptfds:异常集合 timeout超时时间 返回值: 成功返回那个被触发的文件描述符 失败返回-1并设置错误码 struct timeval { long tv_sec; /* seconds */ 秒 long tv_usec; /* microseconds */ 微妙 }; void FD_ZERO(fd_set *fdset) 清除文件描述符集合 void FD_SET(int fd,fd_set *fdset) 将你要关心的文件描述符放入集合中 void FD_CLR(int fd,fd_set *fdset) 将文件描述符移除集合 int FD_ISSET(int fd,fd_set *fdset) 判断文件描述符是否在集合中 fd_set是一个数据类型本质是一个字节数组。长度为1024. readfds读集合,往读集合放入我们关心的0serfd描述符 当select解除阻塞说明这两个文件描述符有一个被触发了。 一旦有文件描述符被触发将移除集合中未触发的。再利用FD_ISSET去判断 poll poll #include poll.h int poll(struct pollfd* fds, nfds_t nfds, int timeout) 功能: 多路复用看哪个文件描述符就绪做对应操作看结构体第三参数是否被内核改变 参数: fds结构体数组记 nfds要判断的文件描述符个数 timeout超时时间0表示不阻塞;0,阻塞的时间;默认设置为-1表示阻塞 返回值 成功返回0 失败返回-1并设置错误码 struct pollfd { int fd; // 委托内核检测的文件描述符 你希望监听文件描述符0 用户设置 short events; // 委托内核检测文件描述符的什么事件 监听它被触发也就是有数据可读POLLIN 用户设置 short revents // 文件描述符实际发生的事件 内核设置 } 三、图解如下 总结 关于C/C网络编程基础知识超详细讲解第二部分的详解懒大王就先分享到这里了如果你认为这篇文章对你有帮助请给懒大王点个赞点个关注吧如果发现什么问题欢迎评论区留言