使用原始套接字的方法

时间:2019-03-30 09:17:45

标签: c sockets networking raw-sockets

我第一次使用原始套接字,因此,如果我的问题表现出对该领域的知识严重缺乏,请原谅。 我的目标是使用原始套接字制作一个客户机-服务器程序,其中客户机可以向服务器发送字符串,服务器可以发送答复。我的代码如下:

/* server.c */
#include "../cn.h"
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

int main(int argc, char const *argv[]) {
    int sfd = socket(AF_INET, SOCK_RAW, 253);
    if (sfd < 0) {
        perror("Could not create socket");
        exit(0);
    }
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
    if (bind(sfd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
        perror("Could not bind");
    }
    int nsfd = accept(sfd, NULL, NULL);
    if (nsfd < 0) {
        perror("Could not accept");
        exit(0);
    }
    char buffer[20];
    int sz;
    while (1) {
        if ((sz = read(nsfd, buffer, 20)) < 0) {
            perror("Could not read");
        } else {
            buffer[sz] = '\0';
            strcat(buffer, " form server");
            if (write(nsfd, buffer, strlen(buffer)) < 0) {
                perror("Could not send");
            }
        }
    }
    return 0;
}

客户代码:

#include "../cn.h"
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>

int main(int argc, char const *argv[]) {
    int sfd = socket(AF_INET, SOCK_RAW, 253);
    if (sfd < 0) {
        perror("Could not create socket");
        exit(0);
    }
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
    if (connect(sfd, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
        perror("Could not connect");
        exit(0);
    }
    char buffer[20];
    int sz;
    while (1) {
        scanf("%[^\n]s", buffer);
        while (getchar() != '\n')
            ;
        if (write(sfd, buffer, strlen(buffer)) < 0) {
            perror("Could not write");
        } else
        if ((sz = read(sfd,buffer, 20)) < 0) {
            perror("Could not read");
        } else {
            buffer[sz] = '\0';
            printf("Reading: %s\n", buffer);
        }
    }
    return 0;
}

每当我尝试运行程序时,套接字创建时就显示错误:

Could not create socket: Operation not permitted

我的问题是:

  1. 在这种情况下我想念什么?为什么不允许执行此操作?

  2. 尽管这是一个广泛的问题,但是,如何使用具有自定义协议ID的原始套接字?

  3. 是否可以使用具有自定义协议的原始套接字的优质材料?

0 个答案:

没有答案