Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Система обмена файлами (сокеты linux)

Здравствуйте!
Пишу систему обмена файлами,сервер-клиент.
Подскажите пожалуйста,не могу разобраться почему не происходит удаление файла в функции "deleteFile" пишет remove:: "No such file or directory"?Уже много вариантов перепробовал... Если прописать путь до файла вручную в сам remove,то файл удаляется...

+ хотелось бы,по возможности,узнать какие-нибудь советы и т.д.

Листинг Server-Client:

Ответ:
Всем спасибо!Система готова.
Вопрос: INI файлы в Linux

Приветствую всех.

Каким способом можно считать ини файлы в Linux?
Буду благодарен за помощь)

P.S. нужно что-то типо этого в виндоус:
Код PHP
1
GetPrivateProfileString
Ответ:

Не по теме:


Сообщение от EugenOS
Но в моем случае не прокатило. в NASе линуха во флеши, и не все библиотеки ровно вставали.
Современные NAS'ы дополнительные приложения размещают на дисках, а не во флеши.

Вопрос: Как скопировать файлы между Linux кодов в сценарии по perl

Задача такая, как мне скопировать файлы между Linux(CentOS) в сценарии по perl. пробовал scp но он запрашивает пароль, может возможно как нибудь в Перле задавать пароль что бы запустил и она вводила пароль.

Добавлено через 3 минуты
Perl 6
1
scp size.pl root:password@192.168.1.17:/home/
такой вариант не катит
Ответ: Спасибо! выбрал этот вариант
Сообщение от volodin661
-- Expect
для этого я установил модуль perl-Expect, perl-IO-Pty-Easy и еще один.
и в тоге сделал так:
Perl 6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl -w 
use strict;
use warnings;
 
use Expect;
 
my $timeout = 10; 
 
my $command = ('scp -r /archive/size.pl root@192.168.1.17:/home/beckup/');
#my $params = ("192.168.1.17");
 
# Create the Expect object
my $exp = Expect->spawn($command) or die "Cannot spawn sftp command \n";
 
$exp->expect($timeout, ["root\@192.168.1.17's password: "]);
$exp->send("passwd\r");
 
$exp->expect($timeout, ["%"]);
 
$exp->close();
но почему то копируется через раз, хотя все четко показывает

Кликните здесь для просмотра всего текста
[root@webvm html]#
[root@webvm html]# perl scp.pl
root@192.168.1.17's password:
size.pl 100% 4300 4.2KB/s 00:00
[root@webvm html]#
[root@webvm html]# perl scp.pl
root@192.168.1.17's password:
size.pl 100% 4300 4.2KB/s 00:00
[root@webvm html]# perl scp.pl
root@192.168.1.17's password:
size.pl


Добавлено через 17 часов 5 минут
вот так стабильно.
Кликните здесь для просмотра всего текста
Perl 6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl -w 
use strict;
use warnings;
 
use Expect;
$Expect::Debug = 0;
 
my $timeout =10; 
 
my $command = ('scp -r /home/pushkarev/ root@192.168.1.17:/home/beckup/');
 
my $exp = Expect->spawn($command) or die "Cannot spawn sftp command \n";
 
$exp->expect($timeout ,["root\@192.168.1.17's password: "]);
$exp->send("passwd\r");
 
$exp->expect(["[root\@webvm html]#"]);
Вопрос: Реализация чата на Unix сокетах

Здравствуйте, мне нужно написать чат на 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
#include <sys/types.h>
#include <sys/socket.h>
#include <iostream>
#include <string>
#include <unistd.h>
#include <fcntl.h>
#include <algorithm>
#include <set>
#include <stdio.h>
#include <sys/un.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <pthread.h>
#include <cerrno>  
using namespace std;
 
int main(){
    //Программа получает дескриптор от операционной системы при создании сокета
    unlink("Server_socket");
    int my_socket=socket(AF_UNIX,SOCK_STREAM,0);
    if(my_socket < 0){
        perror("my socket dont create");
        exit(1);
    }
    //create address
    struct sockaddr_un server_address;
    struct sockaddr_un client_address;
    
    server_address.sun_family = AF_UNIX;
    //При этом в качестве имени сокета требуется задавать имя несуществующего еще файла в директории, к которой у вас есть права доступа как на запись, так и на чтение.
    strcpy(server_address.sun_path,"Server_socket");
    int length_address_server=sizeof(server_address);
    socklen_t length_address_client=sizeof(client_address);
    //Для явного связывания сокета с некоторым адресом используется функция bind.
    int succses=bind(my_socket,(struct sockaddr *) &server_address,length_address_server);
    if(succses < 0){
        perror("bind");
        exit(2);
    }
    //На следующем шаге создаётся очередь запросов на соединение(дескриптор,размер очереди запросов)
    listen(my_socket,1);
    //Функция accept создаёт для общения с клиентом новый сокет и возвращает его дескриптор
    int client;
    int bytes_read=0;
    client=accept(my_socket, (struct sockaddr *)&client_address,&length_address_client);
    int size_messeges[1];
    size_messeges[0]=-1;
    while((client=accept(my_socket, (struct sockaddr *)&client_address,&length_address_client))!=-1){
        //Функция send используется для отправки данных
        //Для чтения данных из сокета используется функция recv.
       // cout<<client<<endl;
        
        bytes_read=recv(client,size_messeges,sizeof(int),0);
        if(bytes_read<=0)
            break;
        char *buf=(char *)calloc(size_messeges[0], sizeof(char) );
        bytes_read=recv(client,buf,size_messeges[0],0);
        for(int i=0;i<size_messeges[0];i++)
            cout<<buf[i];
        cout<<endl;
        
        
       close(client);
       
    }
    
    
    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
41
42
43
44
45
#include <sys/types.h>
#include <sys/socket.h>
#include <iostream>
#include <string>
#include <unistd.h>
#include <fcntl.h>
#include <algorithm>
#include <set>
#include <stdio.h>
#include <sys/un.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <pthread.h>
#include <cerrno>
#include <vector>
using namespace std;
 
int main(){
  //Программа получает дескриптор от операционной системы при создании сокета
  int client_socket=socket(AF_UNIX,SOCK_STREAM,0);
  //create address
  struct sockaddr_un address;
  address.sun_family = AF_UNIX;
 // client_address.sun_port=htons(55555);
  //При этом в качестве имени сокета требуется задавать имя несуществующего еще файла в директории, к которой у вас есть права доступа как на запись, так и на чтение.
  strcpy(address.sun_path,"Server_socket");
  int length_address=sizeof(address);
  // Соедините ваш сокет с сокетом сервера
  int succses=connect(client_socket,(struct sockaddr *) &address,length_address);
  if (succses<1)
    cout<<" connect"<<endl;
 
 
 
  char *message=(char *)calloc( 1024, sizeof(char) );
  cin>>message;
  int size[1];
  size[0]=sizeof(message);
  send(client_socket,size,sizeof(int),0);
  send(client_socket,message,sizeof(message),0);
  close(client_socket);
  free(message);
  return 0;
}
Добавлено через 12 минут
Для Linux
Ответ: Вот я попыталась сделать через select, но у меня почему-то сервер не отправляет сообщения клиентам, т.е. send не работает не могу понять почему(.Если клиент посылает сообщение !exit, это означает, что он хочет выйти из чата, его сокет закрывается, удаляется из сервера и программа клиента завершается.

сервер
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
110
111
112
113
114
#include <sys/types.h>
#include <sys/socket.h>
#include <iostream>
#include <string>
#include <unistd.h>
#include <fcntl.h>
#include <algorithm>
#include <set>
#include <stdio.h>
#include <sys/un.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <pthread.h>
#include <cerrno> 
#include <set>
#include <string>
using namespace std;
 
int main(){
    //Программа получает дескриптор от операционной системы при создании сокета
    unlink("Server_socket");
    int my_socket=socket(AF_UNIX,SOCK_STREAM,0);
    //fcntl превращает сокет в неблокирующий. Вызов любой функции с таким сокетом будет возвращать управление немедленно. 
    fcntl(my_socket, F_SETFL, O_NONBLOCK);
    if(my_socket < 0){
        perror("my socket don't create");
        exit(1);
    }
    struct sockaddr_un server_address;
    struct sockaddr_un client_address;
    server_address.sun_family = AF_UNIX;
    strcpy(server_address.sun_path,"Server_socket");
    int length_address_server=sizeof(server_address);
    socklen_t length_address_client=sizeof(client_address);
    int succses=bind(my_socket,(struct sockaddr *) &server_address,length_address_server);
    if(succses < 0){
        perror("bind");
        exit(2);
    }
    listen(my_socket,100);
    int client;
    int bytes_read=-1;
    int size_messeges[1];
    size_messeges[0]=-1;
    
    set<int> clientSet;
    clientSet.clear();
    int client_exit=0;
    
    fd_set readset;
    FD_ZERO(&readset);//очищает множество set
    int N=-1;
    
    char exit[]={'!','e','x','i','t'};
    //периодически вызывать функцию в которой при помощи селект будет проверятся наличие запросов на соединение и если они есть - вызываться акцепт
    while(1){
        FD_ZERO(&readset);
        //readfds=ourfds;
        FD_SET(my_socket,&readset);
        for(set<int>::iterator it = clientSet.begin(); it != clientSet.end(); it++)
            FD_SET(*it,&readset);
        int n = max(my_socket, *max_element(clientSet.begin(), clientSet.end()))+1;//в n нужно записать максимальное значение дескриптора по всем множествам плюс единица
        N=select(n,&readset,NULL,NULL,NULL);
       
        if(FD_ISSET(my_socket, &readset)){
            client=accept(my_socket, (struct sockaddr *)&client_address,&length_address_client);
            clientSet.insert(client);
            FD_SET(client,&readset);
            if(client < 0){
                perror("accept");
            }  
        }
         
        for(set<int>::iterator it = clientSet.begin(); it != clientSet.end(); it++){
            if (FD_ISSET(*it, &readset)){
                bytes_read=recv(*it,size_messeges,sizeof(int),0);
                if(bytes_read <= 0) break;      
                char *buf=(char *)calloc(size_messeges[0], sizeof(char) );
                recv(*it,buf,size_messeges[0],0);   
                //преверяем не написал ли клиент сообщение о выходе из чата
                if (size_messeges[0] == 5){             
                    for(int i=0;i<5;i++)
                        if(buf[i]== exit[i])
                            client_exit++;  
                    if (client_exit == 5){
                        cout<<"exit";
                        clientSet.erase(*it);
                        //free(buf);
                        client_exit=0;
                        close(*it);
                        FD_CLR(*it, &readset); 
                        break;
                    }
                }  
                for(set<int>::iterator iter = clientSet.begin(); iter != clientSet.end(); iter++)
                    if(*iter != *it){
                        send(my_socket,buf,bytes_read,0);
                        cout<<"send "<<x<<endl;
                    }
                    
                for(int i=0;i<size_messeges[0];i++)
                    cout<<buf[i];
                    cout<<endl;
                    free(buf);
            }
        }
    
   }
   for(set<int>::iterator it = clientSet.begin(); it != clientSet.end(); it++)
        close(*it);
   close(my_socket);
    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
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 <sys/types.h>
#include <sys/socket.h>
#include <iostream>
#include <string>
#include <unistd.h>
#include <fcntl.h>
#include <algorithm>
#include <set>
#include <stdio.h>
#include <sys/un.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <pthread.h>
#include <cerrno>
#include <vector>
 
using namespace std;
 
int main(){
  //Программа получает дескриптор от операционной системы при создании сокета
  int client_socket=socket(AF_UNIX,SOCK_STREAM,0);
  fcntl(client_socket, F_SETFL, O_NONBLOCK);
  //create address
  struct sockaddr_un address;
  address.sun_family = AF_UNIX;
  //При этом в качестве имени сокета требуется задавать имя несуществующего еще файла в директории, к которой у вас есть права доступа как на запись, так и на чтение.
  strcpy(address.sun_path,"Server_socket");
  int length_address=sizeof(address);
  // Соедините ваш сокет с сокетом сервера
  int succses=connect(client_socket,(struct sockaddr *) &address,length_address);
  if (succses<1)
    cout<<" connect"<<endl;
  
  string exit="!exit";
  int size[]={0};
  int size_buf[]={0};
  while(1){
    
    string message;
    cin>>message;
    size[0]=message.length();
 
    send(client_socket,size,sizeof(int),0);
    send(client_socket,message.c_str(),sizeof(message),0);
                            
    if (size[0] == 5)
        if(message == exit){
            close(client_socket);
            break;
        }
    
    recv(client_socket,size_buf,sizeof(int),0);
    char *buf=(char *)calloc(size_buf[0], sizeof(char) );
    recv(client_socket,buf,size_buf[0],0);
    for(int i=0;i<size_buf[0];i++)
      cout<<buf[i];
    cout<<endl;
    free(buf);                      
    
 
  }
  close(client_socket);
  return 0;
}
Вопрос: Обмен данными между Linux и Windows

Здравствуйте, у меня есть малинка, и пк на windows, мне нужно с помощью сокетов передавать данные между Linux и Windows, возможно ли это, если да, поделитесь ссылкой на какую-нибудь инфу по этому. Спасибо )
Ответ:
Сообщение от Goose45
возможно ли это
Конечно.

Сообщение от Goose45
мне нужно с помощью сокетов передавать данные между Linux и Windows, возможно ли это, если да, поделитесь ссылкой на какую-нибудь инфу по этому.
Если никогда не писал ничего подобного, то лучше взять готовый инструмент. Например, boost.asio или реализацию из POCO или Qt.
Также можно взять zeromq, nanomsg или libuv (на самом деле решений подобного рода очень много и этим списком не ограничивается).

С нуля написать тоже можно, но для новичка есть опасность зарыться в нюансах и так ничего и не сделать.
Вопрос: Копирование файлов между Linux и Windows

Доброго времени суток. В локальной сети соединены компы на двух ОС (Linux, Windows). Работаю на компе с виндой, но нужно время от времени бекапить(копировать удаленно) некоторые файлы из компа с Linux, а после возможного сбоя возвращать эти файлы на место. Но проблема в том что при этом не сохраняются атрибуты (права доступа к файлам). Можно ли что то реализовать на С++ чтобы копировались нужны файлы, папки с сохранением атрибутов. Подскажите как можно это реализовать.
Ответ: Это вопрос вообще не по ЯП, а по особенностям системы. Я в linux упаковывал бы, например, в tar.gz и потом копировал куда угодно. В архиве все права сохраняются. Так же и обратно, сперва копируешь архив и на linux распаковываешь.

Если уж сильно хочется приделать сюда c++, то можно вместе с файлами копировать лог файл, где будут указаны все права доступа для файлов.
Вопрос: Система обмена сообщениями

Есть ли какая-нибудь система обмена мообщениями, которая одновременно реализует паттерны "remote procedure call" и "publisher/subscriber". Из известных мне систем, таким функционалом обладает ros, но ros это монстр, которого в систему впихнуть не получится (Или, точнее, очень не хочется).

Смотрю в сторону mqtt, но mqtt сам по себе rpc не поддерживает, а городить его поверх попахивает велосипедом, хотя так, вроде бы, дейсттвительно делают...

В общем, никак не могу найти систему обмена сообщениями, подходящую под задачу, что мне очень странно.
Ответ: Ок. Спасибо.
Вопрос: Как скачать файлы с Linux?

Добрых суток.

Хотелось бы как ни будь на виндовс через программульку, вставив строчку с полным путем файла, получить этот файл. Сам файли будет лежать на Linux машинке.

Ну и если есть возможность, может как то дирректории просмотривать.

Как реализовать?

Спасибо.
Ответ: Да и софт-то для SSH устанавливать необязательно, из коробки
есть (без оговорок насколько он дырявый и нужно ли обновлять).

Posted via ActualForum NNTP Server 1.5

Вопрос: Оптимизация размера исполняемого файла в Linux

Понимаю, что тема заезженная, но все инструкции, что я нашел на форуме, не помогли. Установил версию Lazarus v1.0.6 (специально старую, чтобы меньше мертвого кода в приложениях). В настройках проекта, во вкладке Генерация кода установил умную компоновку и третий уровень оптимизации. В Компоновке также включил умную компоновку, убрал генерацию отладочной информации для GDB и символы из исполняемого файла. Все это на размер проекта - 18МБ- сильно не повлияло. strip тоже не помог. Что посоветуете сделать, чтобы уменьшить размер?

Добавлено через 11 минут
речь идет о размере процесса в оперативной памяти
Ответ:
Сообщение от Kitayets
Вопрос, а 18мб процесс под Linux ты с каким виджетсетом получил?
gtk2
Вопрос: Получить список зарегистрированных в системе типов файлов

Привет всем!

Подскажите, пожалуйста, каким образом средствами .NET (C# или VB) получить список зарегистрированных в системе расширений файлов, а также их иконки? Иконки желательно не просто 32x32, а именно полноразмерные...

Спасибо!
Ответ: Vinemax, суть-то одна, я говорю про посещаемость разделов.
Есть ещё метод, он использует средства WinAPI
Код 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
public static System.Drawing.Icon GetFileIcon(string name, IconSize size, 
                                              bool linkOverlay)
{
    Shell32.SHFILEINFO shfi = new Shell32.SHFILEINFO();
    uint flags = Shell32.SHGFI_ICON | Shell32.SHGFI_USEFILEATTRIBUTES;
 
    if (true == linkOverlay) flags += Shell32.SHGFI_LINKOVERLAY;
 
 
    /* Check the size specified for return. */
    if (IconSize.Small == size)
    {
        flags += Shell32.SHGFI_SMALLICON ; // include the small icon flag
    } 
    else 
    {
        flags += Shell32.SHGFI_LARGEICON ;  // include the large icon flag
    }
 
    Shell32.SHGetFileInfo( name, 
        Shell32.FILE_ATTRIBUTE_NORMAL, 
        ref shfi, 
        (uint) System.Runtime.InteropServices.Marshal.SizeOf(shfi), 
        flags );
 
 
    // Copy (clone) the returned icon to a new object, thus allowing us 
    // to call DestroyIcon immediately
    System.Drawing.Icon icon = (System.Drawing.Icon)
                         System.Drawing.Icon.FromHandle(shfi.hIcon).Clone();
    User32.DestroyIcon( shfi.hIcon ); // Cleanup
    return icon;
}