LINUX.ORG.RU

Долго отрабатывает программа

 


0

1

В с++ шарю очень мало. Пытаюсь собрать из примеров простую прогу, которая будет слушать AMI Asterisk. После очередной правки кода прога стала производить коннект секунд за 10, а при запуске sleep(1) можно сходить кофе выпить....

В чем причина такого поведения? И может кто подскажет в правильном ли я направлении двигаюсь? В идеале хочу получить «аналог» telnet

#include<stdio.h>
#include<netdb.h>
#include<unistd.h>
#include<string.h>
#include<arpa/inet.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<sys/time.h>

#define MAX_MSG_SIZE 60
#define SERVER_ADDRESS "192.168.0.103"
#define CLIENT_ADDRESS "192.168.0.103"
#define SERVER_PORT 5038
#define CLIENT_PORT 5100

int main()
{
    int sd;
    int time1;
    struct sockaddr_in serveraddr, clientaddr;
    char msg[MAX_MSG_SIZE];

    bzero((char *) &serveraddr, sizeof(serveraddr));
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = inet_addr(SERVER_ADDRESS);
    serveraddr.sin_port = htons(SERVER_PORT);

    bzero((char *) &clientaddr, sizeof(clientaddr));
    clientaddr.sin_family = AF_INET;
    clientaddr.sin_addr.s_addr = INADDR_ANY;
    clientaddr.sin_port = htons(CLIENT_PORT);

    sd = socket(AF_INET, SOCK_STREAM, 0);
    bind(sd,(struct sockaddr *) &clientaddr, sizeof(clientaddr));
    connect(sd,(struct sockaddr *) &serveraddr, sizeof(serveraddr));
    char buf[sizeof(msg)];
    *msg=(char)"Action: Login\r\nUsername: admin\r\nSecret: admin\r\n\r\n";
    send(sd,msg,strlen(msg)+1,0);
    printf(".");
    int byte_read = 0;
    
    int i = 0;
    while (i<100) {
        i++;
       
     
        printf("...\n");
        
        byte_read = recv(sd,buf,sizeof(msg),0);
        if (byte_read>0) {
            printf("Get %d bytes\t Message: %s\n",byte_read,buf);
        }
        sleep(1);
        byte_read = 0;
    }
    
    
    close(sd);

    return(1);
}


Последнее исправление: Deleted (всего исправлений: 1)

В с++ шарю очень мало

Здесь его и не видно, это C.

sleep(1);

Это пауза на 1 секунду, зачем она здесь?

*msg=(char)«Action: Login\r\nUsername: admin\r\nSecret: admin\r\n\r\n»;

А тут только один символ присваивается... и тот с левым значением. Надо strcpy или подобное (snprintf, например).

xaizek ★★★★★
()
Последнее исправление: xaizek (всего исправлений: 2)
char msg[MAX_MSG_SIZE];
...
*msg=(char)"Action: Login\r\nUsername: admin\r\nSecret: admin\r\n\r\n";

Это неправильно. СОВСЕМ неправильно. Думаю что ты хотел сделать что-то вроде:

strcpy(msg, "Action: Login\r\nUsername: admin\r\nSecret: admin\r\n\r\n");

    int i = 0;
    while (i<100) {
        i++;

Зачем тут while, когда есть цикл for?

SZT ★★★★★
()

speep(1) для того что бы проц не забивать? Соотношение времени не то. Нужно помельче чем секунда.

Ну и плюс она всегда срабатывает, а не при byte_read>0. В результате (с учётом скорости современных процов) ты на каждое движение в сети спишь на секунду больше чем надо.

anonymous
()
        byte_read = recv(sd,buf,sizeof(msg),0);
        if (byte_read>0) {
            printf("Get %d bytes\t Message: %s\n",byte_read,buf);
        }

Спецификатор %s будет выводить текст из buf до нулевого байта, функция recv тебе этот нулевой байт в конец буфера не запишет, поэтому там в конце может выводиться всякий мусор

SZT ★★★★★
()
Ответ на: комментарий от anonymous

а не при byte_read>0

byte_read==0 конечно же.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.