Ошибки программирования сокета C - PullRequest
0 голосов
/ 12 февраля 2019

Прошел час с тех пор, как я начал искать ошибку.Я только начал C розетки.Программа выходит с кодом -1 после печати «Ошибка подключения 1».Сервер в сети, это сервер netcat.Где я все испортил?

#include <stdio.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>

#define HOST "127.0.0.1"
#define PORT 4444

int main(int argc, const char *argv[])
{
    struct sockaddr_in addr;
    int sock = 0;
    int ret;
    struct sockaddr_in server_addr;
    char *msg = "Hello world !\n";
    char inBuffer[1024] = { 0 };
    if (sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) < 0)
    {
        printf("Error %d socket creating.\n", sock);
        exit(-1);
    }
    else
    {
        memset(&server_addr, '0', sizeof(server_addr));

        server_addr.sin_family = AF_INET;
        server_addr.sin_port = htons(PORT);
        if (ret = inet_pton(AF_INET, HOST, &server_addr.sin_addr) <= 0)
        {
            printf("Error %d unsuported address: %d\n", ret);
            exit(-2);
        }
        else
        {
            if (ret = connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)
            {
                printf("Error %d connection error\n", ret);
                exit(-3);
            }
            else
            {
                send(sock, msg, strlen(msg), 0);
                read(sock, inBuffer, 1024);
                printf("%s\n", inBuffer);
                return 0;
            }
        }
    }



}

1 Ответ

0 голосов
/ 12 февраля 2019

Из-за приоритета оператора выражение

sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) < 0

фактически равно

sock = (socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) < 0)

То есть вы присваиваетерезультат сравнения socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) < 0 с переменной sock.Результат этого сравнения всегда будет либо 0 (для false), либо 1 (для true).Ни 0, ни 1 не должны быть действительными сокетами.

Вам необходимо явно добавить круглые скобки для назначения:

(sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0

То же самое необходимо сделать для connectзвоните и сравнение там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...