Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
1 / 1 / 0
Регистрация: 21.07.2011
Сообщений: 15

Данные по Ethernet не через клиент/сервер

21.07.2011, 16:14. Показов 4024. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Возможно передать данные (определенные команды) с машины на машину по сети Ethernet TCP/IP без использования клиент/сервера, и как определить, что данные дошли успешно? Какие функции нужно использовать?

Задача такая поставлена, потому что впоследствии вместо одной из машин будет прибор (интерфейс которого правда еще не известен), а пока нужно потренироваться на компах.

Если вопрос задан некорректно, заранее прошу прощенья, переспрашивайте.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.07.2011, 16:14
Ответы с готовыми решениями:

Клиент-сервер, обмен через сокеты
программа клиент передает сообщение серверу и наоборот.К подключению разрешено только два клиента, у меня это есть, но при подключении...

Не передаются значения scrollbar через каналы PIPE(клиент-сервер)
Всем доброго времени суток!! Ести 2 отдельные програмки!! Передача через каналы PIPE(клиент-сервер) значений scrollbar от клиента к...

Передача файлов клиент-сервер-клиент используя Socket
Добрый день! Срочно нужна помощь. Мне нужно передать файлы с клиента на сервер и обратно, используя TServerSocket и TClientSocket. ...

17
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
21.07.2011, 16:17
в любом случае будет кто то сервером - принимающей соединение стороной.
что бы не использовать TTCPServer юзай винапи (примеров в сети масса)
1
1 / 1 / 0
Регистрация: 21.07.2011
Сообщений: 15
22.07.2011, 10:02  [ТС]
Спасибо за ответ!
Буду искать!

Добавлено через 17 часов 26 минут
Цитата Сообщение от oxotnik Посмотреть сообщение
в любом случае будет кто то сервером - принимающей соединение стороной.
что бы не использовать TTCPServer юзай винапи (примеров в сети масса)
И снова здравствуйте Я заранее извиняюсь за непонятливость, но никогда не работал с сетями в Builder да и вобще с сетями, не понимаю, что конкретно искать, подскажите пожалуйста поподробнее.
0
return (true);
 Аватар для mimicria
1977 / 1112 / 221
Регистрация: 19.04.2011
Сообщений: 2,346
22.07.2011, 10:06
Почитайте к примеру это: Генератор пакетов на RAW-сокетах
1
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
22.07.2011, 10:26
Пример сервера на WinApi
Вложения
Тип файла: rar TCPServer.rar (986.4 Кб, 91 просмотров)
1
 Аватар для pomkalk
365 / 247 / 24
Регистрация: 03.04.2011
Сообщений: 558
Записей в блоге: 1
23.07.2011, 06:33
Лучший ответ Сообщение было отмечено как решение

Решение

epti_js.djvu.rar
3
1 / 1 / 0
Регистрация: 21.07.2011
Сообщений: 15
26.07.2011, 16:20  [ТС]
Всем спасибо за внимание и ответы!
Начал писать, при выполнении сервера функция bind возвращает ошибку. Почему это может быть?
Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int rc;
 char buf[1];
 
 SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
 if (s < 0)
    {
     ShowMessage("Error1");
     return;
    }
 
 struct sockaddr_in local;
 local.sin_family = AF_INET;
 local.sin_port = htons(7500);
 local.sin_addr.s_addr = htonl (INADDR_ANY);
 
 rc = bind (s, (LPSOCKADDR) &local, sizeof (local));//[SIZE="1"]привязываем адрес интерфейса и номер порта к прослушиваемому сокету[/SIZE]
 if (rc == SOCKET_ERROR)
   {
     ShowMessage("Ошибка привязки!"); 
     return;
    }..........
0
 Аватар для pomkalk
365 / 247 / 24
Регистрация: 03.04.2011
Сообщений: 558
Записей в блоге: 1
26.07.2011, 18:05
C++
1
rc = bind (s,(struct sockaddr*)&local,sizeof(local))
вот так сделай
1
1 / 1 / 0
Регистрация: 21.07.2011
Сообщений: 15
27.07.2011, 08:23  [ТС]
Я так уже делал, не помогает, может это настройки самой системы не позволяют?
0
 Аватар для pomkalk
365 / 247 / 24
Регистрация: 03.04.2011
Сообщений: 558
Записей в блоге: 1
27.07.2011, 09:39
Вот тебе простейший клиент и сервер для линукс на сокетах, измени заголовочные файлы и измени int на SOCKET rc int оставь, а так же проверки на ошибки лучше убери, так как между линуксом и виндой где то разница есть, все в книги написано(которую я скинул)

Сервер
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
 
 
int main(int arcv,char **argv)
{
    printf("Setup socket params...");
    struct sockaddr_in local,peer;
    int s,s1,r;
    char buf[100];
    
    local.sin_family = AF_INET;
    local.sin_port = htons(6590);
    local.sin_addr.s_addr = htonl(INADDR_ANY);  
    printf("OK\nCreating socket...");
    s = socket(AF_INET,SOCK_STREAM,0);
    if (s<0)
    {
        printf("Error\n");
        return 1;
    }
    printf("OK\nBinding socket...");
    r = bind(s,(struct sockaddr*)&local,sizeof(local)); 
    if (r<0)
    {
        printf("Error\n");
        return 1;
    }
    printf("OK\nStart listening...");
    r = listen(s,5);
    if (r)
    {
        printf("Error\n");
        return 1;
    }
    printf("OK\nconnection waitings\n");
    s1 = accept(s,NULL,NULL);
    
    r = recv(s1,buf,100,0);
    if (r<=0)
    {
        printf("Error with message\n");
        return 1;
    }else{
        printf("Message:  %s\n",buf);   
    }
 
    return 0;
}
Клиент
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
 
int main(int atgc,char **argv)
{
    printf("Setup socket params...");
    int s,r;
    char buf[100] = "text from client";
    struct sockaddr_in peer;
    peer.sin_family = AF_INET;
    peer.sin_port = htons(6590);
    peer.sin_addr.s_addr = inet_addr("127.0.0.1");
    printf("OK\nCreating socket...");
    s = socket(AF_INET,SOCK_STREAM,0);
    if (s<0)
    {
        printf("Error\n");
        return 1;
    }
    printf("OK\nTrying connect...");
    r = connect(s,(struct sockaddr*)&peer,sizeof(peer));
    if (r)
    {
        printf("Error\n");
        return 1;
    }
    printf("OK\nSending message\n");
    r = send(s,buf,sizeof(buf),0);
    if (r<=0)
    {
        printf("Error with sanding message\n");
        return 1;
    }
 
    return 0;
}
1
1 / 1 / 0
Регистрация: 21.07.2011
Сообщений: 15
27.07.2011, 10:23  [ТС]
Я по книге и делал, поэтому и не понимаю, почему ошибка

Добавлено через 31 минуту
Пока заработало, оказывается нужно было проинициализировать библиотеку сокетов
0
1 / 1 / 0
Регистрация: 21.07.2011
Сообщений: 15
02.08.2011, 11:22  [ТС]
Опять помощи прошу, нужно, чтобы сервер работал с несколькими клиентами одновременно (отсылал сообщение), как это сделать?
Если вопрос уже поднимался, прошу прощенья - искал по форуму, не нашел
0
 Аватар для pomkalk
365 / 247 / 24
Регистрация: 03.04.2011
Сообщений: 558
Записей в блоге: 1
02.08.2011, 12:11
Тут два варианта возможно, либо:
  1. Клиент подключается к серверу, делает что нужно, и отключается, далее когда что то нужно снова подключается (listen(socket,5); - где 5 число соединений в очереди
  2. Либо использовать патоки что бы работать со всеми клиентами одновременно!
1
145 / 100 / 6
Регистрация: 11.03.2010
Сообщений: 477
02.08.2011, 16:06
потоки, тоесть на каждого пользователя\подключение, свой поток использовать ?

а вопрос тогда, можно ли потоки плодить динамически в программе, в зависимости от количества подключений ?
0
 Аватар для pomkalk
365 / 247 / 24
Регистрация: 03.04.2011
Сообщений: 558
Записей в блоге: 1
02.08.2011, 21:08
Вот тут глянь PthreadTutorial.pdf
1
 Аватар для pomkalk
365 / 247 / 24
Регистрация: 03.04.2011
Сообщений: 558
Записей в блоге: 1
03.08.2011, 14:39
Я сам сегодня, если время найду, разберусь с потоками, и тебе пример скину, так же инициализируешь и нужно будет поменять заголовочные файлы.
0
1 / 1 / 0
Регистрация: 21.07.2011
Сообщений: 15
04.08.2011, 10:20  [ТС]
Спасибо заранее, буду ждать, а то никак до конца разобраться не могу.
0
 Аватар для pomkalk
365 / 247 / 24
Регистрация: 03.04.2011
Сообщений: 558
Записей в блоге: 1
06.08.2011, 21:17
))Только через 3 дня нашел в себе силы прочитать минуал по потокам))
Вот сервер, получает значение от клиента, и возвращает квадрат, придется подшаманить под винду
Пример для Unix
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//Уж библиотеки я описывать не буду
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <pthread.h>
 
//Структура которую будет передавать в наш поток
struct peer_info
{
    int socket;//Номер сокеты(на Windows вместо int используй SOCKET)
    char IP[17];//IP входящего соединения
};
 
void Usage(char*);//Справка
void* sockexec(void *ptr);//Функция потока
 
 
int main(int argc,char **argv)
{
    pthread_t thread;//Указатель на наш поток
    int main_socket,rc,conn;//основной сокет, результат, и сокет для пира
    struct sockaddr_in host,peer;//структуры парамметров хоста и слиентов
    struct peer_info *pinfo;//указатель на структуру peer_info для потока
    //Проверяет количество парамметров
    if (argc<2)
    {
        //Показываем справку если мень 2х, и выходит
        Usage(argv[0]);
        return 1;
    }   
    printf("Starting server:\nSetup...");
    //Устанавливаем парамметры для хоста
    host.sin_family = AF_INET;//IPv4
    host.sin_addr.s_addr = htonl(INADDR_ANY);//Подключение с любого адреса
    host.sin_port = htons(atoi(argv[1]));//порт берем из парамметра
    printf("Ok\nCreating socher...");
    main_socket = socket(AF_INET,SOCK_STREAM,0);//Создаем сокет
    if (main_socket < 0)
    {
        perror("Cannot create socket");
        return 1;
    }
    printf("Ok\nBinding...");
    rc = bind(main_socket,(struct sockaddr*)&host,sizeof(host));//биндим
    if (rc < 0)
    {
        perror("Cannot bind socket");
        return 1;
    }   
    printf("Ok\nStarting listening...");
    rc = listen(main_socket,5);//и начинаем слушать
    if (rc)
    {
        perror("Listening Error");
        return 1;
    }
    printf("Ok\nWaiting incoming connection(To stop server press:CTRL^C):\n");
    while(1)
    {
        int slen = sizeof(peer);//получаем размер структуры пира
        conn = accept(main_socket,(struct sockaddr*)&peer,(socklen_t*)&slen);//принимаем входящие подключение
        pinfo = new struct peer_info;//создаем в памяти структуру
        pinfo->socket = conn;//записываем в нее номер сокета только что подключенного пира
        strcpy(pinfo->IP,inet_ntoa(peer.sin_addr));//и IP адресс
        pthread_create(&thread,NULL,sockexec,(void*)pinfo);//создаем поток, в который передаем структуру peer_info
        pthread_detach(thread);//про это в manual прочитаешь - просто так нужно
    }
    return 0;
}
 
void Usage(char *pname)
{
    printf("USAGE: %s [PORT]\n",pname);
}
 
void* sockexec(void *ptr)
{
    struct peer_info *peer = (struct peer_info*)ptr;//Получаем указатель на структуру в памяти
    int socket = peer->socket;//копируем сокет
    char IP[18];//строка для хранения IP
    strcpy(IP,peer->IP);//Кпирует IP
    delete peer;    //удаляем структуру из памяти
    printf("Connection: %s, socket(%d)\n",IP,socket);
    //-------ниже пример обработки запроса каждого клиента(это происходит в отдельном потоке) - так же это можно вывести в отдельную функцию
    int value;//тут будет храниться значение которе мы принимаем от клиента
    //получаем значение от клиента(пока он не отключится)
    while(recv(socket,(char*)&value,sizeof(value),0))
    {
        value = value*value;//возводим в квадрат
        //и возвращаем
        send(socket,(char*)&value,sizeof(value),0);
    }
    printf("Dissconnect: %s, socket(%d)\n",IP,socket);
}
и клиент, там sleep используется из unistd.h, так же все подправить нужно, а так все вроде понятно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
//Подключаем библиотеки
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>//содержил функцию sleep - это в Linux 
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <time.h>
 
void Usage(char*);
 
int main(int argc,char **argv)
{
    if (argc<3)
    {
        Usage(argv[0]);
        return 1;
    }
    int sock,rc,value;
    struct sockaddr_in con;
    
    con.sin_family = AF_INET;
    con.sin_port = htons(atoi(argv[2]));
    con.sin_addr.s_addr = inet_addr(argv[1]);
    
    sock = socket(AF_INET,SOCK_STREAM,0);
    if (sock<0)
    {
        perror("Cannot create socket");
        return 1;
    }
    rc = connect(sock,(struct sockaddr*)&con,sizeof(con));
    if (rc)
    {
        perror("Connection error"); 
        return 1;
    }
    printf("Connectet(To stop client press:CTRL^C)\n");
    srand(time(NULL));
    while(1)
    {
        value = rand()%10+1;
        printf("%d - ",value);
        rc = send(sock,(char*)&value,sizeof(value),0);
        if (rc<=0)
        {
            perror("Cant sand value");
            return 1;
        }
        rc = recv(sock,(char*)&value,sizeof(value),0);
        if (rc<=0)
        {
            perror("Cant recive value");
            return 1;
        }
        printf("%d\n",value);
        sleep(1);//Вот сюда ВНИМАНИЕ! найди заголовок для винды от этой функции
    }
    return 0;
}
 
void Usage(char *pname)
{
    printf("USAGE: %s [IP] [PORT]\n\t%s 127.0.0.1 6590\n",pname,pname);
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.08.2011, 21:17
Помогаю со студенческими работами здесь

Клиент-сервер. Клиент не принимает данные
Здравствуйте о светлейшие умы сего мира! Я работаю над одним проектом, а именно написание многопользовательской онлайн игры, и собственно...

OLE. Access -клиент, Word - сервер. Работает через раз. "Сервер не валиден!"
Задача: получить путь прилинкованного файла. Тип OLE - связанный Рамка объекта - присоединенная Me.ПрисоединенныйOLE1.Action =...

Не обновляются/добавляются данные данные через клиент
привет форумчане,не обновляются данные через клиент при нажатии на кнопку ничего не происходит form1.cs using System.Data; using...

Взаимодействие WinCC с Labview 2013, как сервер-клиент, так и клиент-сервер
Здравствуйте. Интересует информация о взаимодействии WinCC с Labview 2013, как сервер-клиент, так и клиент-сервер через ОРС-инфтерфейс. ...

Клиент-сервер, TcpListener, подключается но данные не передает
Здравствуйте! Помогите, пожалуйста, кто понимает. Клиент подключается к серверу, клиент в неизвестном(?) направлении передает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru