udp编程c 发送python接收转成浮点型

禹多 经验 2024-04-30 75 0

UDP(用户数据报协议)是一种无连接的、不可靠的网络传输协议,适用于一些对可靠性要求不高,但对数据传输速度要求较高的场景。在进行UDP编程时,可以利用select函数来实现多路复用,以提高程序的性能和效率。

UDP编程基础

在UDP编程中,使用套接字(socket)来实现网络通信。基本的UDP编程流程包括创建套接字、绑定地址、发送数据和接收数据等步骤。

示例代码如下:

```c

include

include

include

include

include

define PORT 8888

define BUF_SIZE 1024

int main() {

int sockfd;

struct sockaddr_in serv_addr;

char buffer[BUF_SIZE];

sockfd = socket(AF_INET, SOCK_DGRAM, 0);

memset(&serv_addr, 0, sizeof(serv_addr));

serv_addr.sin_family = AF_INET;

serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");

serv_addr.sin_port = htons(PORT);

// 发送数据

sendto(sockfd, "Hello, UDP", strlen("Hello, UDP"), 0, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

// 接收数据

socklen_t addr_len = sizeof(serv_addr);

int str_len = recvfrom(sockfd, buffer, BUF_SIZE, 0, (struct sockaddr*)&serv_addr, &addr_len);

buffer[str_len] = 0;

printf("Received message: %s\n", buffer);

close(sockfd);

return 0;

}

```

select函数介绍

select函数是一种多路复用I/O的机制,可以同时监视多个文件描述符,当文件描述符就绪(可读、可写或出错)时,select函数会返回,告知程序哪些文件描述符已经就绪。在UDP编程中,可以利用select函数实现同时监听多个UDP套接字的能力。

select函数的基本使用形式如下:

```c

include

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

```

  • nfds: 最大文件描述符加1
  • readfds: 用来检查可读性的文件描述符集合
  • writefds: 用来检查可写性的文件描述符集合
  • exceptfds: 用来检查是否有异常条件出现的文件描述符集合
  • timeout: 超时时间,设为NULL表示无限等待

select函数会修改传入的fd_set集合,将就绪的文件描述符置为1,未就绪的置为0。在函数返回后,可以遍历文件描述符集合,找出就绪的文件描述符,进行相应的操作。

使用select实现UDP多路复用

以下是一个简单的使用select函数实现UDP多路复用的示例代码:

```c

include

include

include

include

include

include

include

define PORT1 8888

define PORT2 9999

define BUF_SIZE 1024

int main() {

int sockfd1, sockfd2;

struct sockaddr_in serv_addr1, serv_addr2;

char buffer[BUF_SIZE];

fd_set readfds;

struct timeval timeout;

sockfd1 = socket(AF_INET, SOCK_DGRAM, 0);

sockfd2 = socket(AF_INET, SOCK_DGRAM, 0);

// 绑定地址

memset(&serv_addr1, 0, sizeof(serv_addr1));

serv_addr1.sin_family = AF_INET;

serv_addr1.sin_addr.s_addr = htonl(INADDR_ANY);

serv_addr1.sin_port = htons(PORT1);

bind(sockfd1, (struct sockaddr*)&serv_addr1, sizeof(serv_addr1));

memset(&serv_addr2, 0, sizeof(serv_addr2));

serv_addr2.sin_family = AF_INET;

serv_addr2.sin_addr.s_addr = htonl(INADDR_ANY);

serv_addr2.sin_port = htons(PORT2);

bind(sockfd2, (struct sockaddr*)&serv_addr2, sizeof(serv_addr2));

while (1) {

FD_ZERO(&readfds);

FD_SET(sockfd1, &readfds);

FD_SET(sockfd2, &readfds);

timeout.tv_sec = 5;

timeout.tv_usec = 0;

int result = select(sockfd2 1, &readfds, NULL, NULL, &timeout);

if (result < 0) {

perror("select error");

} else if (result == 0) {

printf("timeout\n");

} else {

if (FD_ISSET(sockfd1, &readfds)) {

// 处理sockfd1的

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

分享:

扫一扫在手机阅读、分享本文

最近发表

禹多

这家伙太懒。。。

  • 暂无未发布任何投稿。