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

Не работает функция send

20.11.2015, 14:42. Показов 1836. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Чат на Unix сокетах. У меня почему-то сервер не отправляет сообщения клиентам, т.е. 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;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.11.2015, 14:42
Ответы с готовыми решениями:

Функция SendKeys.Send не работает
Такой вот вопрос: Если хочу передать программе сочетания клавиш Alt+F4 пишу: SendKeys.Send(&quot;%{F4}&quot;); // И окно...

Функция send() работает некорректно после применения closesocket()
Доброго времени суток! Имеется простенький тестовый сервер: SOCKET s; SOCKET s1; SOCKET s2 = NULL; char buf; int rc; ...

<input type="Image" name="send" src="send.gif"> - скрипт не работает
LUDI SCRIPT NE RABOTAET, GDE OSHIBKA. ESLI EST' PREDLOJENIYA NA JAVA SCRIPT NE OTKOJUS' &lt;html&gt; &lt;head&gt; &lt;SCRIPT language=VBScript&gt; ...

1
0 / 0 / 1
Регистрация: 16.08.2015
Сообщений: 17
24.11.2015, 22:40  [ТС]
нашла ошибки
вместо
C++
1
 send(my_socket,buf,bytes_read,0);
нужно
C++
1
2
3
send(*iter,size_messeges,sizeof(int),0);
int x=send(*iter,buf,size_messeges[0],0);
cout<<"send "<<x<<endl;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.11.2015, 22:40
Помогаю со студенческими работами здесь

Сокеты, функция send
для того чтобы отправить сообщение , могу ли я считать символы сроки таким образом: gets(buff); send(my_sock,&amp;buff,nsize,0); Или...

Python сокеты и функция send
Новичек в Python, а сокеты изучаю второй день. Пытался сделать &quot;веб-сервер&quot; передающий файл.html по http-запросу. # -*- coding: utf-8...

Не работает Doc.send()
Пожалуйста, подскажите, в чем ошибка: В shedule агенте при вызове метода Call doc.Send(True) сервер выдает ошибку: Error...

Плохо работает команда send
Плохо работает команда send. А тоесть, через раз после компиляции, 0 реакции на выполнения скрипта. Помогло переименовать все буквы в 1...

Ошибка. Не работает SendKeys.Send
Есть программа, в ней есть момент когда должна отправится например кнопка А ( с помощью SendKeys.Send ), так вот у меня эта кнопка...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru