Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 24

Передача информации серверу

06.05.2015, 17:55. Показов 2062. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Клиент принимает с клавиатуры команды и передает их серверу. Сервер выполняет эти команды, результаты возвращаются клиенту, который записывает их в файл.

***
Помогите написать код, пожалуйста.. только начали изучать, а тут уже надо лабы сдавать(
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.05.2015, 17:55
Ответы с готовыми решениями:

Передача от клиента к серверу и от сервера к клиенту через канал fifo()
Всем привет. Мне нужно через канал fifo отправить от клиента к серверу строку, сервер должен записать ее с задом-наперед и передать ее к...

Передача команд от клиента серверу
В написании 1 программы Которая должна передавать из клиента к серверу комманды , которые в последущее будут запускать определенные...

Передача сообщения серверу
Добрый день форумчане! Имеется модуль WiFi(ESP8266) с поднятым на нем TCP сервером. Но ноуте имеется клиент на C#. Клиент постоянно...

11
Эксперт по компьютерным сетям
 Аватар для Jabbson
5907 / 3359 / 1036
Регистрация: 03.11.2009
Сообщений: 10,008
07.05.2015, 10:29
Код на каком языке?
0
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 24
07.05.2015, 14:10  [ТС]
язык С, вот пример одной из лаб:

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
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <dirent.h>
#include <error.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#define NAME "sfifo.cc"
int only_dirs(const struct dirent* d){
    return (d->d_type == DT_DIR) &&
            (strcmp(d->d_name, ".")!=0) &&
            (strcmp(d->d_name, "..")!=0);
    }
int main(){
    int fd, count;
    char buf[200];
    char dirs[200];
    struct dirent **all;
    unlink(NAME);
    if(mkfifo(NAME, S_IFIFO|S_IRWXU|S_IRWXG|S_IRWXO)){
        perror("Error FIFO");
        return 1;
    }
    if((fd = open(NAME, O_RDONLY)) == -1){
        perror("Ошибка открытия файла сервера");
        return 1;
    }
    read(fd, buf, sizeof(buf));
    close(fd);
    count = scandir(buf, &all, only_dirs, alphasort);
    sprintf(dirs, "%d", count);
    if((fd = open(NAME, O_WRONLY)) == -1){
        perror("Ошибка открытия файла сервера");
        return 1;
    }
    write(fd, dirs, sizeof(dirs));
    close(fd);
    unlink(NAME);
    return 0;
}
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
08.05.2015, 21:28
в чем затык?
0
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 24
08.05.2015, 21:56  [ТС]
затык в том, что у меня код не тот... нужно для: Клиент принимает с клавиатуры команды и передает их серверу. Сервер выполняет эти команды, результаты возвращаются клиенту, который записывает их в файл.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
08.05.2015, 22:01
глаза у меня пока видят, что код не тот. что не получается с вашей задачей? что сделано? что именно не выходит?
0
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 24
08.05.2015, 22:23  [ТС]
хах, задачей не получается ничего.. потому что у меня с С под Linux дружбы нет.. не, ну если б у нас хоть препод на парах был, то может и дружила.. а так пришел, дал задание и теперь сдавайте.. поэтому прошу код программы под это задание... (
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
08.05.2015, 22:36
чуть позже могу написать, но сразу говорю, если у вас нет дружбы и С вообще, объяснять не буду
0
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 24
08.05.2015, 22:38  [ТС]
ок, спасибо большое)
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
09.05.2015, 13:23
для простоты:
- введены ограничения на длину передаваемых сообщений константой MAX_CMDBUF_LEN;
- сервер понимает только команды без опций (т.е. он поймет ls, ps, но не ls -l, ps -a);
- принимаемые команды обрабатываются в виде имен (напр., ls), а не полного пути (/bin/ls);
- исходя из выше сказанного, наш сервер - хромой на безопасность и функциональность, кроме того обрабатываются не все возможные ошибки сети/передачи/приема данных и пр.
но считаю этого достаточно в качестве примера, чтоб показать решение вашей задачи.
более полную и лучшую обработку(парсинг) посылаемых команд сделаете сами (ведь с Си вообще вы дружите, так?)
и да, возможно, там есть и другие ошибки, т.к. код практически не тестил (не считая пары пробных запусков).
вобщем, не расслабляемся, изучаем, курим маны ( а я пошел).
с праздничком
server.c
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
99
100
101
102
103
104
105
106
107
108
109
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include "common.h"
 
void child_proc(int fd)
{
    char buf[MAX_CMDBUF_LEN];
    char* ptr = buf;
    ssize_t nread = 0;
    size_t curlen = 0;
 
    while(curlen < sizeof (buf))
    {
        nread = read(fd, ptr, sizeof (buf) - curlen);
        if(nread == -1)
            error_exit("read");
        if(nread == 0)
        {
            fputs("Client disconnected. Ignoring request.", stderr);
            exit(EXIT_SUCCESS);
        }
        curlen += nread;
        if(ptr[nread - 1] == '\n')
            break;
        ptr += nread;
    }
 
    if(buf[curlen - 1] != '\n')
    {
        write(fd, "Command is too long.", strlen("Command is too long."));
        exit(EXIT_SUCCESS);
    }
    buf[curlen - 1] = '\0';
 
    if(dup2(fd, STDOUT_FILENO) == -1)
    {
        perror("dup2");
        exit(EXIT_FAILURE);
    }
 
    execlp(buf, buf, NULL);
    error_exit("execlp");
}
 
int main(int argc, char* argv[])
{
    struct sigaction sa;
    char* service = DEFAULT_SERVICE_PORT;
    char* host = NULL;
    pid_t child;
    int listenfd, connfd;
 
    if(argc == 2)
        service = argv[1];
    else if(argc == 3)
    {
        host = argv[1];
        service = argv[2];
    }
    else if(argc > 3)
    {
        fprintf(stderr, "Usage: %s [<host>] [<service | port>]\n", argv[0]);
        exit(EXIT_FAILURE);
    }
 
    sa.sa_flags = SA_RESTART | SA_NOCLDWAIT;
    sigemptyset(&sa.sa_mask);
    sa.sa_handler = SIG_DFL;
    if(sigaction(SIGCHLD, &sa, NULL) == -1)
        error_exit("sigaction");
 
    listenfd = create_tcp_socket(host, service, SOCKET_CREATE_BINDED);
    if(listenfd == -1)
        exit(EXIT_FAILURE);
 
    if(listen(listenfd, 0) == -1)
        error_exit("listen");
 
    for(;;)
    {
        connfd = accept(listenfd, NULL, NULL);
        if(connfd == -1)
        {
            if(errno == EINTR)
                continue;
            error_exit("accept");
        }
 
        child = fork();
        if(child == -1)
            error_exit("fork");
        if(child == 0)
        {
            close(listenfd);
            child_proc(connfd);
            exit(EXIT_SUCCESS); /* сюда мы никогда не попадем, но для наглядности напишем */
        }
 
        close(connfd);
    }
    return (EXIT_SUCCESS);
}

client.c
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include "common.h"
 
int main(int argc, char* argv[])
{
    char* service = DEFAULT_SERVICE_PORT;
    char* host = NULL;
    int connfd;
    int nread;
    char buf[MAX_CMDBUF_LEN];
 
    if(argc == 2)
        service = argv[1];
    else if(argc == 3)
    {
        host = argv[1];
        service = argv[2];
    }
    else if(argc > 3)
    {
        fprintf(stderr, "Usage: %s [<host>] [<service | port>]\n", argv[0]);
        exit(EXIT_FAILURE);
    }
 
    connfd = create_tcp_socket(host, service, SOCKET_CREATE_CONNECTED);
    if(connfd == -1)
        exit(EXIT_FAILURE);
 
    fputs("Enter comand to execute on server:\n", stdout);
    fputs("> ", stdout);
    fgets(buf, sizeof (buf), stdin);
 
    write(connfd, buf, strlen(buf));
    while((nread = read(connfd, buf, sizeof (buf) - 1)) > 0)
    {
        buf[nread] = '\0';
        fputs(buf, stdout);
    }
    if(nread == -1)
        error_exit("read");
    close(connfd);
    return 0;
}

common.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
#ifndef COMMON_H
#define COMMON_H
 
#define SOCKET_CREATE_BINDED    (1 << 0)
#define SOCKET_CREATE_CONNECTED (1 << 1)
 
#define DEFAULT_SERVICE_PORT ("12345")
 
#define MAX_CMDBUF_LEN (1024)
 
#define error_exit(msg) \
    do { perror(msg); exit(EXIT_FAILURE); } while (0)
 
#ifdef __cplusplus
extern "C"
{
#endif
 
extern int create_tcp_socket(const char* host, const char* svc, int flag);
 
#ifdef __cplusplus
}
#endif
 
#endif

common.c
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
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include "common.h"
 
int create_tcp_socket(const char* host, const char* svc, int flag)
{
    struct addrinfo hints;
    struct addrinfo* result;
    struct addrinfo* rp;
    int sfd;
    int ret;
 
    memset(&hints, 0, sizeof (struct addrinfo));
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    if(flag & SOCKET_CREATE_BINDED)
        hints.ai_flags = AI_PASSIVE;
 
    ret = getaddrinfo(host, svc, &hints, &result);
    if(ret != 0)
    {
        fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(ret));
        return -1;
    }
 
    for(rp = result; rp != NULL; rp = rp->ai_next)
    {
        sfd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
        if(sfd == -1)
            continue;
 
        if(flag & SOCKET_CREATE_BINDED)
        {
            int on = 1;
            setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof (on));
            if(bind(sfd, rp->ai_addr, rp->ai_addrlen) == 0)
                break;
        }
        else
        {
            if(!(flag & SOCKET_CREATE_CONNECTED))
                fprintf(stderr, "Warning: improper flag passed to "
                        "craete_tcp_socket(): %d. Assuming SOCKET_CONNECTED (%d)"
                        , flag, SOCKET_CREATE_CONNECTED);
            if(connect(sfd, rp->ai_addr, rp->ai_addrlen) == 0)
                break;
        }
        close(sfd);
    }
 
    if(rp == NULL)
    {
        perror("craete_tcp_socket");
        sfd = -1;
    }
    freeaddrinfo(result);
    return sfd;
}

Makefile
CFLAGS = -Wall -Wextra -pedantic -g
SOURCES = server.c client.c common.c
OBJECTS = $(SOURCES:.c=.o)

all: client server

clean:
rm -f $(OBJECTS) client server

client: client.o common.o
$(CC) $(CFLAGS) $^ -o $@

server: server.o common.o
$(CC) $(CFLAGS) $^ -o $@

$(OBJECTS): common.h
2
 Аватар для kordax
4 / 4 / 2
Регистрация: 08.06.2014
Сообщений: 89
09.05.2015, 20:55
Респект, красиво сделал.
0
0 / 0 / 0
Регистрация: 26.11.2013
Сообщений: 24
09.05.2015, 21:33  [ТС]
спасибо, дальше разберусь сама) и вас с праздничком!))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.05.2015, 21:33
Помогаю со студенческими работами здесь

Передача заголовков серверу
Есть такой код: InitNetwork() Connection = OpenNetworkConnection(&quot;*sample.com*&quot;, 80) Get.s=&quot;GET...

Передача счетчика серверу
Привет всем! Было задание реализовать всплывание шарика, которого необходимо было лопнуть, щелкнув правой кнопкой мыши. Кол-во лопнувших...

Неверная передача значений серверу
Помогите разобраться что не так. Хочу много раз отправлять сначала строку, потом цифру. Первый раз отправляет строку нормально, а цифру...

Передача объектов серверу и клиенту
Всем привет, возник такой вопрос, есть приложение клиент/сервер, клиенты пересылают друг другу строковые сообщения, которые затем...

Принятие ссылок и передача их серверу
Нужно создать socks5 клиент принимает данные потом их передаёт. Сервер их принимает и выводит все ссылки которые ему поступили. Когда...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru