Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
sssemil
3 / 3 / 1
Регистрация: 29.01.2013
Сообщений: 91
#1

Сервкр и клиент, досылается много лишнего - C++

24.11.2013, 13:56. Просмотров 150. Ответов 0
Метки нет (Все метки)

Я слепил(не мног от туда, не много отсюда) сервер и клиент на c++ под линксом. Когда посылаю на сервер соощение то оно доходит, а после него куча странных сообщений и если два слова то ток первое долетает..почему?) - https://app.box.com/s/tcynsl6egcba9329m4hc

Сервер :
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
115
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
#include <sys/select.h>
#include <sys/time.h>
#include <arpa/inet.h>
#include <iostream>
#include <set>
 
#define MAX_SIZE 50
 
using namespace std;
 
int main()
{
    int listen_desc, conn_desc; // main listening descriptor and connected descriptor
    int maxfd, maxi; // max value descriptor and index in client array
    int i,j,k;  // loop variables
    fd_set tempset, savedset;  // descriptor set to be monitored
    int client[FD_SETSIZE], numready; // array of client descriptors
    struct sockaddr_in serv_addr, client_addr;
    char buff[MAX_SIZE];
 
    listen_desc = socket(AF_INET, SOCK_STREAM, 0);
 
    if(listen_desc < 0)
        printf("Failed creating socket\n");
 
    bzero((char *)&serv_addr, sizeof(serv_addr));
 
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = htons(3659);
 
    if (bind(listen_desc, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0){
        printf("Failed to bind\n");
        exit(0);}
 
    listen(listen_desc, 5);
 
    maxfd = listen_desc; // Initialize the max descriptor with the first valid one we have
    maxi = -1; // index in the client connected descriptor array
    for (i=0; i<FD_SETSIZE; i++)
        client[i] = -1;  // this indicates the entry is available. It will be filled with a valid descriptor
    FD_ZERO(&savedset); // initialize the descriptor set to be monitored to empty
    FD_SET(listen_desc, &savedset); // add the current listening descriptor to the monitored set
 
    struct sockaddr_in sa;
    char str[INET_ADDRSTRLEN];
 
    while(1) // main server loop
    {
        // assign all currently monitored descriptor set to a local variable. This is needed because select
        // will overwrite this set and we will lose track of what we originally wanted to monitor.
        tempset = savedset;
        numready = select(maxfd+1, &tempset, NULL, NULL, NULL); // pass max descriptor and wait indefinitely until data arrives
 
        //printf("Waiting\n");
 
        if(FD_ISSET(listen_desc, &tempset)) // new client connection
        {            
            inet_ntop(AF_INET, &(client_addr), str, INET_ADDRSTRLEN);
            cout<<"New client connected - "<<str<<"\n"; 
 
            socklen_t size = sizeof(client_addr);
            conn_desc = accept(listen_desc, (struct sockaddr *)&client_addr, &size);
            for (j=0; j<FD_SETSIZE; j++)
                if(client[j] < 0)
                {
                    client[j] = conn_desc; // save the descriptor
                    break;
                }
 
                FD_SET(conn_desc, &savedset); // add new descriptor to set of monitored ones
                if(conn_desc > maxfd)
                    maxfd = conn_desc; // max for select
                if(j > maxi)
                    maxi = j;   // max used index in client array
        }
 
        for(k=0; k<=maxi; k++) // check all clients if any received data
        {
            if(client[k] > 0)
            {
                if(FD_ISSET(client[k], &savedset))
                {
                    int num_bytes;
                    if( (num_bytes = read(client[k], buff, MAX_SIZE)) > 0)
                    {
                        buff[num_bytes] = '\0';
                        inet_ntop(AF_INET, &(client_addr), str, INET_ADDRSTRLEN);
                        cout<<str<<" : "<<buff<<endl;
                    }
 
                    if(num_bytes == 0)  // connection was closed by client
                    {
                        close(client[k]);
                        FD_CLR(client[k], &savedset);
                        client[k] = -1;
                    }
 
                    if(--numready <=0) // num of monitored descriptors returned by select call
                        break; 
                }
            }
        }
    } // End main listening loop
 
    close(listen_desc);
    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
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <iostream>
#include <string>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <algorithm>
#include <set>
#include <cstdio>
#include <arpa/inet.h>
 
using namespace std;
 
int main(int argc, char* argv[])
{
    int sock;
    char addrC[15];
    char msg[256];
    int port;
    const char* caddr;
    cout<<"Address : ";
    cin.getline(addrC,1024);
    caddr=addrC;
    cout<<"Port : ";
    cin>>port;
    cout<<"Message : ";
    cin>>msg;
    struct sockaddr_in addr;
    sock = socket(AF_INET, SOCK_STREAM, 0);
    if(sock < 0)
    {
        perror("socket");
        exit(1);
    }
 
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = inet_addr(caddr);
    if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
        perror("connect");
        exit(2);
    }
             //strcat(argv[3], dv);
             //strcat(argv[3], argv[2]);
             send(sock, msg, 1024, 0);
    close(sock);
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2013, 13:56     Сервкр и клиент, досылается много лишнего
Посмотрите здесь:

C++ Найти много решений
C++ wchart_t много есть?
Много вопросов C++
Много ли здесь бреда? C++
Конструктор копирования матриц, и заполнение лишнего нулями C++
слишком много инициализаторов C++
C++ Нужно не много доработать
Не много не понятно (dynamic_cast) C++
C++ Много ошибок
C++ Как закрыть строку символов, чтобы не было в ней лишнего?
Удаление лишнего кода из EXE файла C++
C++ XOR не много не понимаю

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 10:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru