Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с получением данных от сервера 
:(
    Опции темы
UserNet
Дата 15.8.2010, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 226
Регистрация: 13.12.2006
Где: Новосибирск

Репутация: нет
Всего: 3



Есть клиент и сервер, сервер слушает обычный сокет и unix socket, клиент подключается к обоим сокетам и отправляет данные, данные от клиента доходят, а вот от сервера нет, причём у сервера ошибка "Bad address". В чём проблема?

Клиент
Код

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
#include <string.h>
#include <pthread.h>

char        message   [] = "test1.txt";
char        buf       [sizeof(message)];
int        n = 12;
void           *
thread_proc_inet(void *data)
{
    char        buf_inet  [10];
    int        sock      , rcv, i, tmp;
    struct sockaddr_in addr;
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if (sock < 0) {
        perror("inet socket");
        _exit(1);
    }
    printf("1");
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = htonl(0);
    if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
        perror("connect");
        _exit(2);
    }
    send(sock, message, sizeof(message), 0);
    //for (i = 0; i < n; i++)
        //{
        //recv(sock, buf_inet, 2, 0);
        recv(sock, tmp, sizeof(int), 0);
        perror("WTF:");
        printf("ID1 value = %i ", tmp);
        //}
    //printf(buf_inet);
    printf("\n");
    close(sock);

    return NULL;
}

void           *
thread_proc_unix(void *data)
{
    char        buf_unix  [10];
    int        sock_unix , caddrlen, tmp, i;
    struct sockaddr_un addr_unix;
    sock_unix = socket(AF_UNIX, SOCK_STREAM, 0);
    if (sock_unix < 0) {
        perror("unix socket");
        _exit(1);
    }
    addr_unix.sun_family = AF_UNIX;
    strcpy(addr_unix.sun_path, "/tmp/test");
    caddrlen = sizeof(addr_unix.sun_family) + strlen(addr_unix.sun_path);

    if (connect(sock_unix, (struct sockaddr *)&addr_unix, SUN_LEN(&addr_unix)) < 0) {
        perror("unix connect");
        _exit(2);
    }
    send(sock_unix, message, sizeof(message), 0);
    //recv(sock_unix, tmp, sizeof(int), 0);
    //for (i = 0; i < n; i++)
        //{
        recv(sock_unix, tmp, sizeof(int), 0);
        perror("WTF: ");
        printf("ID2 value = %i ", tmp);
        //}

    //printf(buf_unix);
    printf("\n");
    close(sock_unix);

    return NULL;
}



int
main()
{
    pthread_t    thread_inet, thread_unix;

    pthread_create(&thread_inet, NULL, &thread_proc_inet, NULL);
    pthread_create(&thread_unix, NULL, &thread_proc_unix, NULL);
    pthread_join(thread_inet, NULL);
    pthread_join(thread_unix, NULL);

    return 0;
}


Сервер
Код

#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <time.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
#include <string.h>

#define UNIX_SOCKET_NAME "/tmp/test"
const int    port = 3425;



int
main()
{
    int        servSock  , servSock_unix, serv_len, i, n = 12, bytes_read;
    char        buf_unix  [1024], buf_inet[1024];
    struct sockaddr_in addr;
    struct sockaddr_un addr_nix;
    int        clientSock, clientSock_unix, tmp_inet, tmp_unix;

    if ((servSock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("Server inet creation error");
        return 1;
    }
    addr.sin_family = AF_INET;
    addr.sin_port = htons(3425);
    addr.sin_addr.s_addr = INADDR_ANY;

    if (bind(servSock, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
        perror("Server inet binding error");
        return 1;
    }
    if (listen(servSock, 5) == -1) {
        perror("Server inet initialization error");
        return 1;
    }
    if ((servSock_unix = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
        perror("Server unix creation error");
        return 1;
    }
    addr_nix.sun_family = AF_UNIX;
    unlink(UNIX_SOCKET_NAME);
    strcpy(addr_nix.sun_path, UNIX_SOCKET_NAME);
    serv_len = sizeof(addr_nix.sun_family) + sizeof(addr_nix.sun_path);


    if (bind(servSock_unix, (struct sockaddr *)&addr_nix, serv_len) == -1) {
        perror("Server unix binding error");
        return 1;
    }
    if (listen(servSock_unix, 5) == -1) {
        perror("Server unix initialization error");
        return 1;
    }
    srand(time(NULL));

    //printf("0 \n");
    while (1) {

        if (((clientSock = accept(servSock, NULL, NULL)) == -1) ||
            ((clientSock_unix = accept(servSock_unix, NULL, NULL)) == -1)) {
            perror("client inet accepting error");

        }
        bytes_read = recv(clientSock, buf_inet, 1024, 0);
        if (bytes_read <= 0)
            break;
        printf(buf_inet);
        bytes_read = recv(clientSock_unix, buf_unix, 1024, 0);
        if (bytes_read <= 0)
            break;
        printf(buf_unix);
        //for (i = 0; i < n; i++)
            //{
            tmp_inet = rand() % 100;
            tmp_unix = rand() % 100;
            //send(clientSock_unix, buf_unix, sizeof(buf_unix), 0);
            send(clientSock, tmp_inet, sizeof(int), 0);
            if (errno) {
                printf("error = %i\n", errno);
                perror("WTF 1");
            }
            send(clientSock_unix, tmp_unix, sizeof(int), 0);

            printf("inet = %i unix = %i\n", tmp_inet, tmp_unix);
            //}
        if (errno) {
            printf("error = %i\n", errno);
            perror("WTF 2");
        }
    }
    return 0;
}



Это сообщение отредактировал(а) UserNet - 16.8.2010, 00:02
PM MAIL   Вверх
sdukshis
Дата 16.8.2010, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 23.3.2009

Репутация: нет
Всего: 1



Вызовы send() и recv() в качестве второго параметра принимают указатель на данные:
Код

send(clientSock, &tmp_inet, sizeof(int), 0);
recv(sock_unix, &tmp, sizeof(int), 0);


P.S. Советую при сборке использовать ключ -Wall. Тогда это предупреждение выскакивает при компиляции.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1010 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.