C语言中实现并行往多个IP地址发送数据包

如果你想要在C语言中实现并行往多个IP地址发送数据包,可以使用多线程编程以及网络编程技术。

首先,你需要创建一个套接字(socket),然后使用多个线程将数据包发送到目标IP地址。为了实现并行操作,你可以考虑使用线程池技术,即创建一组线程来并发处理发送任务。

下面是一个基本的示例代码,可以实现并行往多个IP地址发送UDP数据包:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pthread.h>
#include <sys/socket.h>
#include <unistd.h>
​
#define THREAD_COUNT 8
#define PACKET_SIZE  1024
​
typedef struct {
    char *ip;
    int port;
} Target;
​
void *send_packet(void *arg) {
    Target *target = (Target *)arg;
​
    int sockfd;
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("socket error");
        return NULL;
    }
​
    struct sockaddr_in addr;
    bzero(&addr, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr(target->ip);
    addr.sin_port = htons(target->port);
​
    int n;
    char buf[PACKET_SIZE];
    memset(buf, 'A', sizeof(buf));
​
    while (1) {
        if ((n = sendto(sockfd, buf, sizeof(buf), 0, (struct sockaddr *)&addr, sizeof(addr))) == -1) {
            perror("sendto error");
            break;
        } else {
            printf("sent %d bytes to %s:%d\n", n, target->ip, target->port);
        }
    }
​
    close(sockfd);
    free(target->ip);
    free(target);
​
    return NULL;
}
​
int main(int argc, char **argv) {
    if (argc < 3) {
        fprintf(stderr, "usage: %s <ip_list_path> <port>\n", argv[0]);
        return -1;
    }
​
    FILE *fp;
    if ((fp = fopen(argv[1], "r")) == NULL) {
        perror("open file error");
        return -1;
    }
​
    int port = atoi(argv[2]);
​
    pthread_t threads[THREAD_COUNT];
    Target *targets[THREAD_COUNT];
​
    int i;
    for (i = 0; i < THREAD_COUNT; i++) {
        targets[i] = malloc(sizeof(Target));
        if (fscanf(fp, "%ms", &targets[i]->ip) == EOF) {
            break;
        }
        targets[i]->port = port;
        pthread_create(&threads[i], NULL, send_packet, targets[i]);
    }
​
    fclose(fp);
​
    for (i = 0; i < THREAD_COUNT; i++) {
        if (threads[i]) {
            pthread_join(threads[i], NULL);
        }
        free(targets[i]);
    }
​
    return 0;
}

在这个示例中,我们使用了 pthread_create() 创建了一组子线程,每个线程都是通过调用 send_packet() 函数来发送数据包的。其中, send_packet() 函数根据传入的 Target 结构体参数,创建一个UDP套接字,然后不断发送数据包到目标IP地址。当发送失败时,线程退出。

main() 函数中,我们读取了一个IP地址列表文件,将每个IP地址封装成一个 Target 结构体,并启用一个子线程将其发送到目标地址。一旦所有子线程都完成发送任务或发送任务失败,主线程就会退出。

本文福利, 免费领取C++学习资料包、技术视频/代码,内容包括(C++基础,网络编程,数据库,中间件,后端开发,音视频开发,Qt开发)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

猜你喜欢

转载自blog.csdn.net/m0_73443478/article/details/130367214