mrjbom
@mrjbom

Функция recv взращает ошибку при работе с сокетом?

Я пытаюсь отправить сообщение с клиента на сервер и что-бы сервер вывел это сообщение:
Есть такой код сервера
//server for Linux

#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <clocale>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main()
{
    setlocale(LC_ALL, "Russian");
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in sa; //структура для bind
    sa.sin_family = AF_INET; //дублируем домен
    sa.sin_port = htons(12345); //указываем порт,
    //функция htons приводит к сетевому порядку байт
    sa.sin_addr.s_addr = htonl(INADDR_LOOPBACK); //тут мы указываем локальный IP-адрес
    bind(sock, (struct sockaddr *)&sa, sizeof(sa)); //привязали сокет
    listen(sock, SOMAXCONN); //слушаем
    //SOMAXCONN - максимальная длинна очереди
    //теперь мы должны начать принимать соединения
    char buff[32] = "default";
    std::cout << "Начинаем слушать\n";
    while(int s1 = accept(sock, 0, 0)) //принимаем соединения для работы с ними
    {
        std::cout << "Поймали\n";
        int k = recv(sock, &buff, sizeof(buff), MSG_NOSIGNAL);
        std::cout << "k = " << k << "\n";
        if(k == -1)
            std::cout << "Какая-то ошибка...\n";
        if(!k)
            std::cout << "Отсутствии записанных в сокет процессом-поставщиком данных\n";
        if(k > 0) 
            std::cout << "Сообщение: " << buff << "\n";
    }
    printf("Работа завершена!");
    return 0;
}


И такой клиента

//client for Linux

#include <stdlib.h>
//#include <stdio.h>
#include <iostream>
#include <clocale>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main()
{
    setlocale(LC_ALL, "Russian");
    char buff[32] = "It's my message! YEY!";
    int sock = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in sa; //структура для bind
    sa.sin_family = AF_INET; //дублируем домен
    sa.sin_port = htons(12345); //указываем порт,
    //функция htons приводит к сетевому порядку байт
    sa.sin_addr.s_addr = htonl(INADDR_LOOPBACK); //тут мы указываем локальный IP-адрес
    std::cout << "Коннектимся\n";
    connect(sock, (struct sockaddr *)&sa, sizeof(sa)); //соединяемся
    std::cout << "Отправляем сообщение: " << buff << "\n";
    //write(sock, buff, 32);
    send(sock, &buff, sizeof(buff), MSG_NOSIGNAL);
    std::cout << "shutdown\n";
    shutdown(sock, SHUT_RDWR);
    std::cout << "close\n";
    close(sock);
    return 0;
}


В моём случае recv взращает -1, что говорит о том что произошла ошибка, какая и почему?.
И если я что-то неправильно написал в комментариях, исправьте пожалуйста.
  • Вопрос задан
  • 298 просмотров
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
В моём случае recv взращает -1, что говорит о том что произошла ошибка, какая и почему?.

Зря вы спрашиваете у нас -- спрашивайте у него. errno, perror, вот это всё.

Хотя в данном случае всё очевидно:
while(int s1 = accept(sock, 0, 0)) //принимаем соединения для работы с ними
    {
        int k = recv(sock, &buff, sizeof(buff), MSG_NOSIGNAL);

-- новое соединение установлено на сокете s1, а recv читает из sock.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы