Linux C++ UDP Socket(超详细)_c+

Linux C++ UDP Socket(超详细)_c+int socket(int domain, int type, int protocol);
/* 其中 “int domain”参数表示套接字要使用的协议簇,协议簇

int套接字(int域,int类型,int协议);

/*

“int domain”参数表示套接字使用的协议簇。协议簇在“linux/socket.h”中详细定义。

AF_UNIX(本机通信)

AF_INET(TCP/IP IPv4)

AF_INET6(TCP/IP IPv6)

“type”参数指的是常用的套接字类型。

SOCK_STREAM(TCP 流)

SOCK_DGRAM(UDP数据报)

SOCK_RAW(原始套接字)

最后一个“协议”通常设置为“0”。也就是说,在确定socket使用的协议族和类型时,该参数的值为0,但是在创建原始socket时,你可能知道也可能不知道使用哪一种。如果协议族和类型或域参数未知,则协议参数可以影响和确定协议类型。

由于socket是一个函数,它也有一个返回值,如果socket创建成功,则返回“-1”,并将错误代码写入“errno”。

*/

//插图

#include sys/types.h

#include sys/socket.h

#include linux/socket.h

int sock_fd_tcp;

int sock_fd_udp;

sock_fd_tcp=socket(AF_INET, SOCK_STREAM, 0); //创建用于TCP 通信的套接字。

sock_fd_udp=socket(AF_INET, SOCK_DGRAM, 0); //创建用于UDP 通信的套接字。

如果(sock_fd_tcp 0){

perror(“TCP套接字错误!\\n”);

结束(-1);

}

如果(sock_fd_udp 0){

perror(\’UDP 套接字错误!\\n\’);

结束(-1);

}

* **地址和端口配置结构体sockaddr\\_in**

#include netinet/in.h

结构体sockaddr_in{

无符号短sin_family;

无符号短整型sin_port;

结构in_addr sin_addr;

无符号字符sin_zero[8];

};

结构体in_addr{

无符号长s_addr;

};

/*

对于基于TCP/IP 传输协议的通信,sin_family 只能取值AF_INET。

sin_prot 代表端口号。例如,21、80、27015 或0 到65535。

sin_addr 表示32 位IP 地址,例如192.168.1.5 或202.96.134.133。

sin_zero 表示填充字节,通常值为0。

套接字数据分配示例:

*/

//插图

结构体sockaddr_in地址;

memset(addr, 0, sizeof(addr)); //将结构清零。主要是sin_zero 意味着填充字节为零。

addr.sin_family=AF_INET; //(TCP/IP IPv4)

addr.sin_port=htons(port_out); //绑定端口号htons 将无符号短整数值转换为网络字节顺序。

addr.sin_addr.s_addr=htonl(INADDR_ANY); //绑定IP htonl将IP字节顺序转换为网络字节顺序。

//有些计算机有多个网卡,因此INADDR_ANY 通常指的是机器上的所有IP。

* **将名称与套接字的bind()关联起来**

int 绑定( int sockfd, const struct sockaddr * addr, socklen_t * addrlen);

/*

当使用socket() 函数创建套接字时,它存在于命名空间(网络地址族)中,但没有分配给它的地址。 bind()将addr指定的地址分配给文件描述符表示的套接字sockfd。 addrlen指定addr指向的地址结构的字节长度。此操作通常称为“命名套接字”。

通常,在SOCK_STREAM 套接字接受连接之前,必须使用bind() 函数用本地地址命名套接字。

*/

//插图

#include sys/types.h

#include sys/socket.h

sockfd=套接字(AF_INET, SOCK_DGRAM, 0);

结构体sockaddr_in地址;

socklen_t addr_len=sizeof(addr);

if (bind(sockfd, (struct sockaddr*)addr, addr_len)==-1){

printf(“无法在端口%d 上绑定套接字\\n”, port_out);

关闭(sockfd);

返回假。

}

* **接收消息的函数recvfrom()**

int recvfrom(int sockfd, void * buf, size_t len, int flags, struct sockaddr * src_addr, socklen_t * addrlen);

/*

recvfrom:用于接收数据

sockfd:用于接收UDP数据的套接字;buf:保存接收到的数据的缓冲区的地址;len:可以接收的最大字节数(不能超过buf缓冲区的大小)。没有路径0; src_addr:存储发送者地址信息的sockaddr结构体变量的地址; addrlen:存储参数src_addr结构体变量的长度的变量地址值。

*/

* **函数sendto()用于发送消息**

int sendto(int sockfd, const void * buf, size_t len, int flags, const struct sockaddr * dest_addr, socklen_t addrlen);

/*

sendto:用于发送数据

sockfd:用于发送UDP数据的socket;buf:存放要发送的数据的缓冲区的地址;len:要发送的数据的长度(以字节为单位);flags:如果没有传递,则为address目标地址; information 要存储的sockaddr 结构体变量的长度; addrlen:传递给参数dest_addr 的地址值结构体变量的长度。

*/

**注意:UDP套接字不维护连接状态,因此每次发送数据时都必须添加目标地址信息。这与邮寄包裹之前输入收件人地址相同。 **

### 3.测试程序

* **服务器**

#includesys/select.h

#includeunistd.h

#includesys/types.h

#includesys/socket.h

#includearpa/inet.h

#includenetinet/in.h

包括

包括

包括

包括

int main(){

//同一台电脑测试需要两个端口

int port_in=12321;

int 端口输出=12322;

int sockfd;

//创建套接字

sockfd=套接字(AF_INET, SOCK_DGRAM, 0);

如果(-1==sockfd){

返回假。

put(\’创建套接字失败\’);

}

//设置地址和端口

struct sockaddr\\_in addr;

socklen_t addr_len=sizeof(addr);

memset(addr, 0, sizeof(addr));

addr.sin_family=AF_INET; //使用IPV4。

addr.sin_port=htons(port_out); //

addr.sin_addr.s_addr=htonl(INADDR_ANY);

//暂停

结构时间电视;

电视.tv_sec=0;

tv.tv_usec=200000 //200 毫秒

setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)tv, sizeof(struct timeval));

//绑定端口用于接受从先前配置的地址和端口发送的信息。接收方必须绑定端口,并且端口号与发送方匹配。

if (bind(sockfd, (struct sockaddr\\*)addr, addr_len)==-1){

printf(\’无法在端口%d\\n 上绑定套接字\’, port_out);

关闭(sockfd);

返回假。

}

字符缓冲区[128];

memset(缓冲区, 0, 128);

整数计数器=0;

而(1){

struct sockaddr\\_in src;

socklen_t src_len=sizeof(src);

memset(src, 0, sizeof(src));

//阻止接收消息

int sz=recvfrom(sockfd, buffer, 128, 0, (sockaddr\\*)src, src_len);

如果(尺寸0){

缓冲区[大小]=0;

printf(\’获取消息%d: %s\\n\’, counter++, buffer);

}

除此之外{

put(\’超时\’);

}

}

关闭(sockfd);

返回0。

}

* **客户**

#includesys/select.h

#includeunistd.h

#includesys/types.h

#includesys/socket.h

#includearpa/inet.h

#includenetinet/in.h

包括

包括

包括

包括

int main(){

int port_in=12321;

int 端口输出=12322;

int sockfd;

//创建套接字

sockfd=套接字(AF_INET, SOCK_DGRAM, 0);

如果(-1==sockfd){

返回假。

put(\’创建套接字失败\’);

}

//设置地址和端口

struct sockaddr\\_in addr;

socklen_t addr_len=sizeof(addr);

memset(addr, 0, sizeof(addr));

addr.sin_family=AF_INET; //使用IPV4。

addr.sin_port=htons(port_in); //

addr.sin_addr.s_addr=htonl(INADDR_ANY);

//暂停

结构时间电视;

电视.tv_sec=0;

tv.tv_usec=200000 //200 毫秒

setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char\\*)tv, sizeof(struct timeval));

//绑定数据采集端口。无法绑定为发件人。

if (bind(sockfd, (struct sockaddr\\*)addr, addr_len)==-1){

printf(\’无法在端口%d\\n 上绑定套接字\’, port_in);

关闭(sockfd);

返回假。

}

整数计数器=0;

而(1){

addr.sin_family=AF_INET;

我们整理了上百道【运维技术栈面试题】,成为您运维面试路上的好助手。这样,你就可以安心参加面试并获得高薪offer。

这些面试题涵盖了从Shell、MySQL到K8s等云原生技术栈,适合运维行业新人以及运维行业新人的面试需求。升职或换工作以增加薪水。

本次访谈集内容为

174 运维工程师面试题128 k8s 面试题108 shell 脚本面试题200 Linux 面试题51 Docker 面试题35 Jenkis 面试题78 MongoDB 面试题17 ansible 面试题60 dubbo 面试题53 Kafka 面试题18 mysql 面试题40 nginx 面试题77 Redis 面试题Zookeeper 题28

总共1000多道面试题,内容全面且有价值。

174 道运营工程师面试问题

1.什么是运维?

2、运维人员经常需要在工作场所与操作人员进行交互。运营人员做什么工作?

3. 给定300台服务器,如何管理它们?

4.我们简单解释一下raid0、raid1和raid5这两种运行模式的运行原理和特点。

5、LVS、Nginx、HAproxy有什么区别?

6. Squid、Varinsh、Nginx 有什么区别,你在工作中如何选择?

7.Tomcat和Resin有什么区别?

8.什么是中间件?

9. Tomcat 的三个端口8005、8009、8080 是什么意思?

10.什么是CDN?

11.什么是网站灰度发布?

12、请简单说明一下DNS域名解析的过程。

13.什么是RabbitMQ?

14.Keepalived如何工作?

15.描述LVS工作流程的三种模式。

16、mysql的innodb如何识别锁定问题以及mysql如何减少主从复制延迟?

和罗克西有什么区别?

6. Squid、Varinsh、Nginx 有什么区别,你在工作中如何选择?

7.Tomcat和Resin有什么区别?

8.什么是中间件?

9. Tomcat 的三个端口8005、8009、8080 是什么意思?

10.什么是CDN?

11.什么是网站灰度发布?

12、请简单说明一下DNS域名解析的过程。

13.什么是RabbitMQ?

14.Keepalived如何工作?

15.描述LVS工作流程的三种模式。

16、mysql的innodb如何识别锁定问题以及mysql如何减少主从复制延迟?

17.如何重置mysql root密码?

以上#Linux C++ UDP Sockets(超详解)_c+相关内容来源网络,仅供参考。相关信息请参见官方公告。

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92973.html

(0)
CSDN的头像CSDN
上一篇 2024年7月4日
下一篇 2024年7月4日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注