LINUX.ORG.RU

Сообщения timas-cs

 

Обходчик страниц

Форум — Web-development

Возможно ли реализовать скрипт, который по очереди будет проходить по заданным страницам? (и как?!)

 ,

timas-cs
()

Парсер сайта

Форум — Web-development

Есть сайт, с которого нужно вытаскивать таблички. Но они не простые. Количество колонок меняется от 2 до 6. За это отвечает <select></select>. После смены значения - страница обновляется и становится нужное количество колонок.

Скопировал себе html-код страницы и попробовал

<script>
$("select[name='Date']").val(5)
$("select[name='Date']").trigger('onchange')
</script>
Цифра в меню <select></select> изменилась, но количество столбцов не изменилось.

Что я сделал не так и как исправить?

 

timas-cs
()

Разбор html таблицы

Форум — Web-development

В чем ошибка, код не работает. Хочу вывести по строкам(их 2), а для каждой строки вывести столбцы

<html>
<body>
<table>
    <tr id="id01" class="BalanceRow                                                                                                                                                                                      clickedRow" style="text-align:left;display:table-row;" clickedrow="true">
        <td class="BalNames0"><nobr><a style="text-decoration:none;color:black;cursor:pointer;" onclick="javascript:NewHideRows(['0101','0102','0103','010101','010102','010103','010104','010105','010201','010202','010203','010204','010205','010206','010207','010208','010301','010302','010303','010304','010305','010306','010307','010308','010309','010310','010311','010312','010313','010314','010315','010316','010317','010318','010319','01010101','01010102','01010103','01010104','01010201','01010202','01020101','01020102','01020103','01020105','01020106','01020107','01020201','01020202','01020203','01020204','01020205','01020206','01020207','01020208','01020209','01020210','01020301','01020302','01020303','01020304','01020305','01020306','01020307','01020401','01020402','01020403','01020404','01020405','01020406','01020407','01020501','01020506','01020507','01020508','01020509','01020801','01020802','01020803','01030201','01030202','01030203','01030204','01031401','01031402','0101010101','0101010102','0101010103','0101010104','0101010105','0101010106','0101010107','0102010201','0102010202','0102010203','0102010301','0102010302','0102010303','0102010501','0102020101','0102020102','0102020103','0102020104','0102020105','0102020106','0102020107','0102020108','0102020109','0102020110','0102020111','0102020201','0102020202','0102020203','0102020204','0102020205','0102020206','0102020207','0102020208','0102020301','0102020302','0102020303','0102020304','0102020305','0102030101','0102030102','0102030103','0102030104','0102030105','0102030201','0102030202','0102030203','0102030204','0102030205','0102030301','0102030302','0102030303','0102030304','0102030305','0102030401','0102030402','0102030403','0102030501','0102030502','0102030503','0102050101','0102050102','0102050103','0102050104','0102050105','0102050106','0102050601','0102050602'], 'picId01');"><img style="position:relative;top:-2px;" id="picId01" border="0" src="/img/TreeMinus.gif"> 
 
        АКТИВ</a></nobr></td>
        <td class="BalData0"><nobr><a id="01;1481;2018-01-01;" title="Нажмите для детализации по балансовым счетам 101 формы" href="#dialog" name="modal" data-toggle="modal" data-target=".balance-details-modal" style="text-decoration:none;color:black;">23 226 504 149</a></nobr></td>     
        <td class="BalData0"><nobr><a id="01;1481;2018-02-01;" title="Нажмите для детализации по балансовым счетам 101 формы" href="#dialog" name="modal" data-toggle="modal" data-target=".balance-details-modal" style="text-decoration:none;color:black;">22 883 569 886</a></nobr></td> 
        <td style="width:120px;border-left-style:solid;border-left-width:1px;border-left-color:#bbbbbb;" class="BalData0R"><nobr>-342 934 263</nobr></td>
        <td style="width:70px;" class="BalData0R"><nobr>-1,5%</nobr></td>
        <td><a style="cursor:pointer;" onclick="window.open('/pie_chart.php?type=pie&amp;bank=1481&amp;subtype=assets&amp;d1=2018-01-01&amp;d2=2018-02-01','График','width=850,height=500,scrollbars=yes')"><img src="/img/pie-chart-small.png" border="0"></a></td>
    </tr>
    
    
    <tr id="id0101" class="BalanceRow                                                                                                                    " style="text-align: left; display: table-row;">
<td class="BalNames1"><nobr><a style="text-decoration:none;color:black;cursor:pointer;" onclick="javascript:NewHideRows(['010101','010102','010103','010104','010105','01010101','01010102','01010103','01010104','01010201','01010202','0101010101','0101010102','0101010103','0101010104','0101010105','0101010106','0101010107'], 'picId0101');"><img style="position:relative;top:-2px;" id="picId0101" border="0" src="/img/TreeMinus.gif"> 
 
        Высоколиквидные активы</a></nobr></td>
        <td class="BalData1"><nobr><a id="0101;1481;2018-01-01;" title="Нажмите для детализации по балансовым счетам 101 формы" href="#dialog" name="modal" data-toggle="modal" data-target=".balance-details-modal" style="text-decoration:none;color:black;">1 727 507 996</a></nobr></td>
        
                
        <td class="BalData1"><nobr><a id="0101;1481;2018-02-01;" title="Нажмите для детализации по балансовым счетам 101 формы" href="#dialog" name="modal" data-toggle="modal" data-target=".balance-details-modal" style="text-decoration:none;color:black;">1 513 795 738</a></nobr></td>
        
                
                        <td style="width:120px;border-left-style:solid;border-left-width:1px;border-left-color:#bbbbbb;" class="BalData1R"><nobr>-213 712 258</nobr></td>
        <td style="width:70px;" class="BalData1R"><nobr>-12,4%</nobr></td>
        
                    <td><a style="cursor:pointer;" href="/visual/0101/na/1481-1-1/" target="_blank"><img src="/img/dot-chart.png" border="0"></a></td>
            </tr>
    
</table>
            
<script>
(function() {
    var jsonArr = [];
    var obj = {};
    
    var arrString = document.getElementsByTagName('tr').length; // 
    alert(arrString); // вывод количества строк
    
    
    for(i=0;i<arrString;i++){
        var CurrentString = document.getElementsByTagName('tr')[i].innerHTML;           
        var arrСolumn = CurrentString.getElementsByTagName('td').length;  // для каждой строчки свое кол-во столбцов(тк некоторые строки различаются)
        
        alert(CurrentString); 
        alert(arrСolumn); 
        
        for(j=0;j<arrСolumn;j++){
            var CurrentColumn=CurrentString.getElementsByTagName('td')[j].innerText;
            
            alert(CurrentColumn);
        
        }
    
    
    }
    
    
})();
 
</script>
            
</body>
</html>

 

timas-cs
()

Как вывести только одно слово?

Форум — Web-development

В самом тэге есть еще куча разной инфы. Хочу вывести только «СЛОВО», но вместе с ним выводится и весь «мусор». Как решить проблему?


<html>
<body>
<table>
    <tr id="id01" class="BalanceRow                                                                                                                                                                                      clickedRow" style="text-align:left;display:table-row;" clickedrow="true">
        <td class="BalNames0"><nobr><a style="text-decoration:none;color:black;cursor:pointer;" onclick="javascript:NewHideRows(['0101','0102','0103','010101','010102','010103','010104','010105','010201','010202','010203','010204','010205','010206','010207','010208','010301','010302','010303','010304','010305','010306','010307','010308','010309','010310','010311','010312','010313','010314','010315','010316','010317','010318','010319','01010101','01010102','01010103','01010104','01010201','01010202','01020101','01020102','01020103','01020105','01020106','01020107','01020201','01020202','01020203','01020204','01020205','01020206','01020207','01020208','01020209','01020210','01020301','01020302','01020303','01020304','01020305','01020306','01020307','01020401','01020402','01020403','01020404','01020405','01020406','01020407','01020501','01020506','01020507','01020508','01020509','01020801','01020802','01020803','01030201','01030202','01030203','01030204','01031401','01031402','0101010101','0101010102','0101010103','0101010104','0101010105','0101010106','0101010107','0102010201','0102010202','0102010203','0102010301','0102010302','0102010303','0102010501','0102020101','0102020102','0102020103','0102020104','0102020105','0102020106','0102020107','0102020108','0102020109','0102020110','0102020111','0102020201','0102020202','0102020203','0102020204','0102020205','0102020206','0102020207','0102020208','0102020301','0102020302','0102020303','0102020304','0102020305','0102030101','0102030102','0102030103','0102030104','0102030105','0102030201','0102030202','0102030203','0102030204','0102030205','0102030301','0102030302','0102030303','0102030304','0102030305','0102030401','0102030402','0102030403','0102030501','0102030502','0102030503','0102050101','0102050102','0102050103','0102050104','0102050105','0102050106','0102050601','0102050602'], 'picId01');"><img style="position:relative;top:-2px;" id="picId01" border="0" src="/img/TreeMinus.gif"> 
 
        СЛОВО</a></nobr></td>
</tr>
</table>
            
<script>
(function() {
var arrLength = document.getElementsByTagName('td').length;
alert(arrLength);
 
var head = document.getElementsByTagName('td')[0].innerHTML;
alert(head);
 
 
 
})();
</script>
            
</body>
</html>

 ,

timas-cs
()

Авторизация в чате

Форум — Development

Написал какое-то подобие чата(клиент-сервер). И остался один вопрос. Имеется возможность задавать имена клиентам

Но проблема в том, что два клинта могут взять одинаковые имена, а это не очень хорошо. Как сделать простенькую авторизацию без внешних файлов с логинами/паролями?

 scanf("%s",name);
 strcpy(me.name, name);
...
char temp[NAMELEN];
printf("Enter name: ");
scanf("%s",temp);
...
sendtouser(&me, temp, message)

 , ,

timas-cs
()

Accept блокирует работу

Форум — Development

Нагородил я конечно в той теме... Решил пересоздать, и все нормально сформулировать.

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

Как исправить эту проблему?


//sever.c
#include<sys/types.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<errno.h>
#include <string.h>
#include<unistd.h>
#include<stdlib.h>
void main(int argc,char **argv)
{
    int flag=0;
	int sockfd,newsockfd1,newsockfd2;
    int n,k,m;
    int client;
    char line1[1000], line2[1000];
    struct sockaddr_in servaddr,cliaddr;

    if((sockfd = socket(AF_INET,SOCK_STREAM,0))<0){
        perror(NULL);
        exit(1);
    }

    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family=AF_INET;
    servaddr.sin_port = htons(51000);
    servaddr.sin_addr.s_addr =htonl(INADDR_ANY);

    if(bind(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0){
        perror(NULL);
        close(sockfd);
        exit(1);
    }

    if(listen(sockfd,8)<0){
        perror(NULL);
        close(sockfd);
        exit(1);
    }

    while(1){{
            client=sizeof(cliaddr);
            if((newsockfd1=accept(sockfd,(struct sockaddr*)&cliaddr,&client))<0){
                perror(NULL);
                close(sockfd);
                exit(1);
             }

             if((newsockfd2=accept(sockfd,(struct sockaddr*)&cliaddr,&client))<0){
                perror(NULL);
                close(sockfd);
                exit(1);
             }

             if((n=read(newsockfd1,line1,999))>0){
                if((n=write(newsockfd2,line1,strlen(line2)+1))<0)
                   {
                    perror(NULL);
                    close(sockfd);
                    close(newsockfd1);
                    close(newsockfd2);
                    exit(1);
                 }}

              if((n=read(newsockfd2,line2,999))>0){
                if((n=write(newsockfd1,line2,strlen(line2)+1))<0)
                  {
                  perror(NULL);
                  close(sockfd);
                  close(newsockfd1);
                  close(newsockfd2);
                  exit(1);
                }}

            }
                     
                    if(n<0){
                    perror(NULL);
                    close(sockfd);
                    close(newsockfd1);
                    close(newsockfd2);
                    exit(1);
                    }
                //close(newsockfd1);
                //close(newsockfd2);
            }
}
#include<sys/types.h>
#include<string.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include <string.h>
#include<unistd.h>
void main(int argc,char **argv)
{
    int sockfd;
    int n;
    int i;
    char sendline[1000],recvline[1000];
    struct sockaddr_in servaddr;

    if(argc!=2){
        printf("Usage:a.out <IP address>\n");
        exit(1);
    }

    bzero(sendline,1000);
    bzero(recvline,1000);

    if((sockfd = socket(AF_INET,SOCK_STREAM,0))<0){//AF or PF
        perror(NULL);
        exit(1);
    }

    bzero(&servaddr,sizeof(servaddr));
    servaddr.sin_family=AF_INET;
    servaddr.sin_port = htons(51000);

    if(inet_aton(argv[1],&servaddr.sin_addr) ==0){
        printf("INvalid IP address\n");
        close(sockfd);
        exit(1);
    }

    if(connect(sockfd,(struct sockaddr *)&servaddr,sizeof(servaddr))<0){
        perror(NULL);
        close(sockfd);
        exit(1);
    }

    for(i=0;i<3;i++){
        printf("Message:\n");
        fflush(stdin);
        fgets(sendline,1000,stdin);
        if((n=write(sockfd,sendline,strlen(sendline)+1))<0){
            perror("Can\'t write \n");
            close(sockfd);
            exit(1);
        }
        if((n=read(sockfd,recvline,999))<0){
            perror("Can\'t read \n");
            close(sockfd);
            exit(1);
        }
        printf("%s",recvline);
        bzero(sendline,1000);
        bzero(recvline,1000);
    }
    close(sockfd);
}

 ,

timas-cs
()

Консольный обмен сообщениями

Форум — Development

Создать собственный клиент быстрых сообщений (возможно, и сервер – зависит от выбранной архитектуры), который бы работали в рамках сети.

Как я понял, это что-то на подобии чата. Есть эхо-сервер. Хочу переделать его, возможно ли это? И как лучше сделать?

Эхо сервер такой: client.c

#include <arpa/inet.h>
#include <errno.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <unistd.h>
 
#include <limits.h>
 
#define MAX(a, b) ((a) > (b) ? (a) : (b))
 
#define PORT 1027
#define MAXLINE 256
 
#define SA struct sockaddr 
 
/*
 * Обработчик фатальных ошибок.
 */
void error(const char *s)
{
    perror(s);
    exit(-1);
}   
 
/*
 * Функции-обертки.
 */
int Socket(int domain, int type, int protocol)
{
    int rc;
    
    rc = socket(domain, type, protocol);
    if(rc == -1) error("socket()");
 
    return rc;
}
 
void Connect(int socket, const struct sockaddr *addr, socklen_t addrlen)
{
    int rc;
    
    rc = connect(socket, addr, addrlen);
    if(rc == -1) error("connect()");
}
 
void Close(int fd)
{
    int rc;
    
    for(;;) {
        rc = close(fd);
        if(!rc) break;
        if(errno == EINTR) continue;
        error("close()");
    }
}
 
void Inet_aton(const char *str, struct in_addr *addr)
{
    int rc;
    
    rc = inet_aton(str, addr);
    if(!rc) {
        /* Функция inet_aton() не меняет errno в случае ошибки. Чтобы
        сообщение, выводимое error(), было более осмысленным,
        присваиваем errno значение EINVAL. */
                
        errno = EINVAL;
        error("inet_aton()");
    }
}
 
int Select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
    struct timeval *timeout)
{
    int rc;
    
    for(;;) {
        rc = select(n, readfds, writefds, exceptfds, timeout);
        if(rc != -1) break;
        if(rc == EINTR) continue;
        error("select()");
    }
    
    return rc;
}
 
size_t Read(int fd, void *buf, size_t count)
{
    ssize_t rc;
    
    for(;;) {
        rc = read(fd, buf, count);
        if(rc != -1) break;
        if(errno == EINTR) continue;
        error("read()");
    }
    
    return rc;
}
 
size_t Write(int fd, const void *buf, size_t count)
{
    ssize_t rc;
    
    for(;;) {
        rc = write(fd, buf, count);
        if(rc != -1) break;
        if(errno == EINTR) continue;
        error("write()");
    }
    
    return rc;
}
 
/*
 * Запись count байтов в сокет.
 */
size_t writen(int socket, const char *buf, size_t count)
{
    const char *p;
    size_t n, rc;
 
    /* Проверить корректность переданных аргументов. */
    if(buf == NULL) {
        errno = EFAULT;
        error("writen()");
    }
    
    p = buf;
    n = count;
    while(n) {
        rc = Write(socket, p, n);
        n -= rc;
        p += rc;
    }
 
    return count;
}
 
void show_usage()
{
    puts("Usage: client ip_address");   
    exit(-1);
}
 
void do_work(int socket)
{
    int n;
    fd_set readfds;
    char s[MAXLINE];
    ssize_t rc;
 
    n = MAX(STDIN_FILENO, socket) + 1;  
            
    for(;;) {
        /* Инициализировать набор дескрипторов. */
        FD_ZERO(&readfds);
        FD_SET(STDIN_FILENO, &readfds);
        FD_SET(socket, &readfds);
 
        Select(n, &readfds, NULL, NULL, NULL);
        if(FD_ISSET(STDIN_FILENO, &readfds)) {
            rc = Read(STDIN_FILENO, s, MAXLINE);
            if(!rc) break;
            writen(socket, s, rc);
        }
        if(FD_ISSET(socket, &readfds)) {
            rc = Read(socket, s, MAXLINE);
            if(!rc) break;
            Write(STDOUT_FILENO, s, rc);
        }
    }
}
 
int main(int argc, char **argv)
{
    int socket;
    struct sockaddr_in servaddr;
    
    if(argc != 2) show_usage();
 
    socket = Socket(PF_INET, SOCK_STREAM, 0);
    
    /* Инициализировать структуру адреса сокета. */
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(PORT);
    Inet_aton(argv[1], &servaddr.sin_addr);
 
    Connect(socket, (SA *) &servaddr, sizeof(servaddr));
    do_work(socket);        
    Close(socket);
    
    return 0;
}
server.c
/*
 * Конфигурация сервера.
 */
#define PORT 1027
#define BACKLOG 5
#define MAXLINE 256
 
#define SA struct sockaddr
 
/*
 * Обработчик фатальных ошибок.
 */
void error(const char *s)
{
    perror(s);
    exit(-1);
}
 
/*
 * Функции-обертки.
 */
int Socket(int domain, int type, int protocol)
{
    int rc;
    
    rc = socket(domain, type, protocol);
    if(rc == -1) error("socket()");
 
    return rc;
}
 
int Bind(int socket, struct sockaddr *addr, socklen_t addrlen)
{
    int rc;
    
    rc = bind(socket, addr, addrlen);
    if(rc == -1) error("bind()");
 
    return rc;
}
 
int Listen(int socket, int backlog)
{
    int rc;
    
    rc = listen(socket, backlog);
    if(rc == -1) error("listen()");
 
    return rc;
}
 
int Accept(int socket, struct sockaddr *addr, socklen_t *addrlen)
{
    int rc;
    
    for(;;) {
        rc = accept(socket, addr, addrlen);
        if(rc != -1) break;
        if(errno == EINTR || errno == ECONNABORTED) continue;
        error("accept()");
    }       
 
    return rc;  
}
 
void Close(int fd)
{
    int rc;
    
    for(;;) {
        rc = close(fd);
        if(!rc) break;
        if(errno == EINTR) continue;
        error("close()");
    }
}
 
size_t Read(int fd, void *buf, size_t count)
{
    ssize_t rc;
    
    for(;;) {
        rc = read(fd, buf, count);
        if(rc != -1) break;
        if(errno == EINTR) continue;
        error("read()");
    }
    
    return rc;
}
 
size_t Write(int fd, const void *buf, size_t count)
{
    ssize_t rc;
    
    for(;;) {
        rc = write(fd, buf, count);
        if(rc != -1) break;
        if(errno == EINTR) continue;
        error("write()");
    }
    
    return rc;
}
 
void *Malloc(size_t size)
{
    void *rc;
    
    rc = malloc(size);
    if(rc == NULL) error("malloc()");
    
    return rc;
}
 
void Pthread_create(pthread_t *thread, pthread_attr_t *attr,
    void *(*start_routine)(void *), void *arg)
{
    int rc;
    
    rc = pthread_create(thread, attr, start_routine, arg);
    if(rc) {
        errno = rc;
        error("pthread_create()");
    }
}
 
/*
 * Чтение строки из сокета.
 */
size_t reads(int socket, char *s, size_t size)
{
    char *p;
    size_t n, rc;
    
    /* Проверить корректность переданных аргументов. */
    if(s == NULL) {
        errno = EFAULT;
        error("reads()");
    }
    if(!size) return 0;
 
    p = s;
    size--;
    n = 0;
    while(n < size) {
        rc = Read(socket, p, 1);
        if(rc == 0) break;
        if(*p == '\n') {
            p++;
            n++;
            break;
        }
        p++;
        n++;
    }
    *p = 0;
    
    return n;
}
 
/*
 * Запись count байтов в сокет.
 */
size_t writen(int socket, const char *buf, size_t count)
{
    const char *p;
    size_t n, rc;
 
    /* Проверить корректность переданных аргументов. */
    if(buf == NULL) {
        errno = EFAULT;
        error("writen()");
    }
    
    p = buf;
    n = count;
    while(n) {
        rc = Write(socket, p, n);
        n -= rc;
        p += rc;
    }
 
    return count;
}
 
void *serve_client(void *arg)
{
    int socket;
    char s[MAXLINE];
    ssize_t rc;
    
    /* Перевести поток в отсоединенное (detached) состояние. */
    pthread_detach(pthread_self());
 
    socket = *((int *) arg);
    free(arg);
 
    while((rc = reads(socket, s, MAXLINE)) > 0) {
        if(writen(socket, s, rc) == -1) break;
    }
    Close(socket);
 
    return NULL;
}
 
int main(void)
{
    int lsocket;    /* Дескриптор прослушиваемого сокета. */
    int csocket;    /* Дескриптор присоединенного сокета. */
    struct sockaddr_in servaddr;
    int *arg;
    pthread_t thread;
        
    /* Создать сокет. */
    lsocket = Socket(PF_INET, SOCK_STREAM, 0);
 
    /* Инициализировать структуру адреса сокета сервера. */
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(PORT);
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    
    /* Связать сокет с локальным адресом протокола. */
    Bind(lsocket, (SA *) &servaddr, sizeof(servaddr));
 
    /* Преобразовать неприсоединенный сокет в пассивный. */
    Listen(lsocket, BACKLOG);
            
    for(;;) {
        csocket = Accept(lsocket, NULL, 0);
 
        arg = Malloc(sizeof(int));
        *arg = csocket;
        
        Pthread_create(&thread, NULL, serve_client, arg);
    }
    
    return 0;
}

 ,

timas-cs
()

ZeroMQ выполнение команд

Форум — Linux-install

Отправляю сообщения msg сначала в вектор


struct msg {
	double clientId;
	size_t cash;
	char message[256];
};
struct msg quest2;



std::vector<msg> vector;
...
vector.push_back(quest2);


zmq_msg_t clientReq;
zmq_msg_init_size(&clientReq, sizeof(struct msg));
memcpy(zmq_msg_data(&clientReq), &quest2, sizeof(struct msg));

void* requester;
void* context;
      
context = zmq_ctx_new();
requester = zmq_socket(context, ZMQ_REQ);
int rc = zmq_connect(requester, "tcp://localhost:5555");
      

//После этого, их нужно отправить на сервер для выполнения

while(vector.size()>0){
   zmq_msg_init_size(&clientReq, sizeof(struct msg));
   memcpy(zmq_msg_data(&clientReq), &(vector.front()), sizeof(struct msg));
	
   printf("sending %s\n", (vector.front()).message);
   zmq_msg_send(&clientReq, requester, 0);
   zmq_msg_close(&clientReq);
	
   zmq_msg_init(&reply);
   zmq_msg_recv(&reply, requester, 0);
   size_t repSize = zmq_msg_size(&reply);
  	
   strcpy(ans, (char*)zmq_msg_data(&reply));
   printf("Received: - %zu %s\n", repSize, ans);

if (strcmp(ans, "OK") == 0) {
   printf("Operation went sucessfuly\n");
   } 

   else if (strcmp(ans, "NOMN") == 0) {
   printf("get some money\n");
   } 
	
   else if (strcmp(ans, "NOFRND") == 0) {
   printf("wrong user\n");
   }
 
   else if (strcmp(ans, "ERR") == 0) {
   printf("some error\n");
   exit(1);
   } 
			
   else if (strncmp(ans, "ID", 2) == 0) {
   sscanf(ans, "ID %lf CSH %zu", &friendId, &remCash);
   printf("Your stats are: id - %lf\n cash amount - %zu\n", friendId, remCash);
   } 
	
   else {
   printf("hurr-durr-derp\n");
   }
   zmq_msg_close(&reply);		
   vector.erase(vector.begin());

//Но ans всегда возвращает OK, хотя при этом ничего не происходит. Если делать не для вектора, все работает номально.

 , ,

timas-cs
()

ZeroMQ

Форум — Development

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

Как реализовать возможность временной приостановки работы сервера без выключения? Сообщения серверу можно отправлять, но ответы сервер не отправляет до возобновления работы.

 , ,

timas-cs
()

Как наглядно показать, что используется несколько потоков?

Форум — Development

Написал две сортировки для бинарного дерева. Однопоточная и многопоточная.(Сортировка меняет левое и правое поддерево)

b.sort(); b.sortParallel();.

Как наглядно показать, что используется несколько потоков?


void Btree<T>::sort()
{
	sortHelper(*this, false);
}

void Btree<T>::sortParallel()
{
	sortHelper(*this, true);
}


void Btree<T>::sortHelper(Btree<T>& b, bool isParallel)
{
...
	
	if (isParallel)
	{
		std::future<void> leftFu = sortParallelHelper(left);
		std::future<void> rightFu = sortParallelHelper(right);

		leftFu.get();
		rightFu.get();
	}
...

template <class T>
std::future<void> Btree<T>::sortParallelHelper(Btree<T>& q)
{
	auto funcObj = std::bind(&Btree<T>::sortHelper, this, std::ref(q), true);
	std::packaged_task<void()> task(funcObj);
	std::future<void> res(task.get_future());
	std::thread th(std::move(task));

	th.detach();

	return res;
}

 , ,

timas-cs
()

Потоки

Форум — Development

Задача такая: В колоде(52 карты), рассчитать экспериментально (метод Монте-Карло) вероятность того, что сверху лежат две одинаковых карты. Количество раундов подается с ключом.

Создаю поток, в котором вызываю функцию generator, но она не выводит на экран 2 случайные карты. В чем может быть проблема?

#include <assert.h>
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <pthread.h>

#define ARRAY_SIZE(a) (sizeof (a) / sizeof *(a))
#define COMPARE(a, b) (((a) > (b)) - ((a) < (b)))
const char RANKS[] = "23456789TJQKA";
const char SUITS[] = "SHDC"; /* Spades, Hearts, Diamonds, Clubs */
#define N_RANKS (13)
#define N_SUITS (4)
#define ERROR_CREATE_THREAD -11
#define ERROR_JOIN_THREAD   -12
#define SUCCESS        0

typedef struct Card{
  unsigned suit, rank;
} Card;
 
typedef Card Cards[52];
 
void init_cards(Cards *cards){
 assert(cards != NULL);
 
 Card *card = *cards;
 unsigned suit;
 unsigned rank;
  for (suit = 0; suit < N_SUITS; ++suit)
    for (rank = 0; rank < N_RANKS; ++rank)
    {
      card->suit = suit;
      card->rank = rank;
      ++card;
    }
 
  assert(card == *cards + ARRAY_SIZE(*cards));
}
 
void shuffle_cards(Cards *cards, unsigned limit_size){
  assert(cards != NULL);
  assert(limit_size <= ARRAY_SIZE(*cards));
 
 unsigned i;
  for (i = 0; i < limit_size; ++i)
  {
    unsigned j = rand() % (ARRAY_SIZE(*cards) - i) + i;
    Card temp = (*cards)[i];
    (*cards)[i] = (*cards)[j];
    (*cards)[j] = temp;
  }
}

void print_cards(const Card cards[], unsigned n){
    const Card *card;
    const Card *card_end = cards + n;
      for (card = cards; card != card_end; ++card)
        printf("%c%c ", SUITS[card->suit], RANKS[card->rank]);
 
      printf("\n");
}

/*int compare_cards(const Card cards[], unsigned n)
{
}*/


void* generator(void *args){
srand((unsigned) time(NULL));
Cards cards;
init_cards(&cards);
shuffle_cards(&cards, 2);
Card *player = cards;
print_cards(player, 2);
}
 


int main(int argc, char* argv[]){
int q,i,size,result;
pthread_t thread;
	if (argc < 2){
		printf("Please enter int\n");
		return 1;
	}
	q=atoi(argv[2]);
	printf("Q=%d\n",q);

	result = pthread_create(&thread, NULL, generator, NULL);
   	if (result != 0) {
     		printf("main error: can't create thread, status = %d\n", result);
        	exit(ERROR_CREATE_THREAD);
	}
	
}

 ,

timas-cs
()

Потоки

Форум — Development

Не так давно создавал тут тему. Про «Родительский процесс создает n дочерних процессов и передает им поочередно числа .Дочерний процесс при создании принимает имя файла. При работе дочерний процесс получает числа от родительского процесса и пишет их в файл.»

С чем-то помогли, с чем-то разобрался сам. Но в фаил почему-то не пишется. Предварительно создал Foo_N(N=1,2,3...).txt Что не правильно?

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main (void) 
{
	int status, n, q=0, result;
	pid_t pid; 
	size_t i;
        const size_t MAX_FILE_NAME = 100;
  	char file_name[MAX_FILE_NAME],somedata[10];
	int data_processed, filepipes[2];
	int PIP1[2];

	printf("Сколько дочерних процессов создать?\n");
	scanf("%d", &n);
	pipe(PIP1);
	// 0 read
	// 1 write 

	printf("Enter string\n");
	for(q=1;q<=n;q++){	
		snprintf(file_name, MAX_FILE_NAME, "Foo_%d.txt", q);
	
		if ((pid = fork()) == -1){
			exit(-1);}
	

		if ((pid=fork()) != 0) {
		//PARENT
			close(PIP1[0]);//выход не нужен
			dup2(PIP1[1], 0);//на вход stdin
			printf("I send file name: %s\n", file_name);
			waitpid(-1, &status, 0); 
		} 
		else {
		//CHILD
			close(PIP1[1]);
			dup2(PIP[0],*file_name);
	 		printf("I recv file name: %s\n", file_name);
			break;		
		}
	}
}

 ,

timas-cs
()

Передача имени файла дочернему процессу

Форум — Development

Задача такая: Родительский процесс создает n дочерних процессов и передает им поочередно числа из последовательности от 1...m.Дочерний процесс при создании принимает имя файла. При работе дочерний процесс получает числа от родительского процесса и пишет их в файл.

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

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>

int main (void) {
	int n;
	int i=0;
	int status;
	char c;
	printf("Сколько дочерних процессов создать?\n");
	scanf("%d", &n);
        pid_t p; 

for(i=0;i<n;i++)
{
	if (fork( ) != 0) 
	{
		waitpid(-1, &status, 0); 
	} 
	else 
	{
		char * program = "/home/user/file";
		char * argv[] = {"/home/user/file","aux", NULL};
		char * envp[] = {NULL};
		int ret;
		ret = execve(program, argv, envp);	 
		exit(0);		
	}

}
}

 ,

timas-cs
()

Отступы

Форум — General

Выставляю \parindent=1,2cm, но после окончания строчки, на новой, отступ сбрасывается.Есть ли похожие функции или придется делать с помощью абзацев? PS Львовского смотрел

 

timas-cs
()

Рекурсивный обход каталога и перекодировка всех .txt

Форум — Admin

параметры скрипта это $1=ключ(для режима защиты, может и не быть), $2=каталог $3=из какой кодировки $4=в какую. Скрипт зацикливается, а если поставить break после строки «while true; do» просто не работает. Не могу разобраться как довести до ума.

if [ $1 = "-p" ] 
then key="1"; shift
else key="0"
fi

cd $1

find . -f ext3 -name '*.txt' -ls 2> /dev/null | 
while read a ; do
    if [ $key = "1" ]; then 
        while true; do
            read -p "Are you sure to encode file" $a "[y/n] ?" yn
            case $yn in
                [Yy]* ) iconv -f $2 -t $3 $a -o $a;;
                [Nn]* ) echo $a "-file wasn't encoded";;
                * ) echo "Please answer yes or no.";;
            esac
        done
    else 
        iconv -f $2 -t $3 $a -o $a
    fi
done
fi

 

timas-cs
()

RSS подписка на новые темы