Способ использования сырых сокетов - PullRequest
1 голос
/ 30 марта 2019

Я впервые использую необработанные сокеты, поэтому извините, если мой вопрос показывает серьезную нехватку знаний в этой области.Моя цель - создать клиент-серверную программу с использованием необработанных сокетов, где клиент может отправить строку на сервер, а сервер может отправить ответ.Мои коды следующие:

/* 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. Хотя это общий вопрос, но как использовать необработанные сокеты с идентификатором пользовательского протокола?

  3. Есть ли какой-нибудь хороший материал для использования необработанных розеток с пользовательским протоколом?

...