Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: Сети
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
oleksandr2488
0 / 0 / 0
Регистрация: 07.04.2016
Сообщений: 1
1

Чат на сокетах

26.05.2016, 13:32. Просмотров 1522. Ответов 1
Метки нет (Все метки)

Есть сервер и клиент когда отправляешь сообщение с первого клиента втором то сообщения не появляется у второго клиента а появляется после того когда с другой клиента отправляют первом и сообщение появляется шо у первого шо у второго. Помогите исправить.?
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
// сервер
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
 
#define PORT 9734
#define BUFSIZE 1024
 
 
void send_to_all(int j, int i, int sockfd, int nbytes_recvd, char *recv_buf, fd_set *master)
{
    if(FD_ISSET(j, master))
    {
        if(j != sockfd && j != i)
        {
            if(send(j, recv_buf, nbytes_recvd, 0) == -1)
                perror("send error");
        }
    }
}
 
void send_recv(int i, fd_set *master, int sockfd, int fdmax)
{
    int nbytes_recvd, j;
    char recv_buf[BUFSIZE], buf[BUFSIZE];
 
    if((nbytes_recvd = recv(i, recv_buf, BUFSIZE, 0)) <= 0)
    {
        if (nbytes_recvd == 0)
            printf("socket %d hung up\n", i);
        else
            perror("recv error");
        close(i);
        FD_CLR(i, master);
    }
    else
    {
        for(j = 0; j <= fdmax; j++)
        {
            send_to_all(j, i, sockfd, nbytes_recvd, recv_buf, master);
        }
 
    }
 
}
 
void connection_accept(fd_set *master, int *fdmax, int sockfd, struct sockaddr_in *client_addr)
{
    socklen_t addrlen;
    int newsockfd;
 
    addrlen = sizeof(struct sockaddr_in);
    if((newsockfd = accept(sockfd, (struct sockaddr *)client_addr, &addrlen)) == -1)
    {
        perror("accept error");
        exit(1);
    }
    else
    {
        FD_SET(newsockfd, master);
        if(newsockfd > *fdmax)
            *fdmax = newsockfd;
        printf("new connection from %s on port %d \n",inet_ntoa(client_addr->sin_addr), ntohs(client_addr->sin_port));
    }
}
 
void connect_request(int *sockfd, struct sockaddr_in *my_addr)
{
    int yes = 1;
 
    if((*sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
        perror("Socket");
        exit(1);
    }
 
    my_addr->sin_family = AF_INET;
    my_addr->sin_port = htons(PORT);
    my_addr->sin_addr.s_addr = INADDR_ANY;
    memset(my_addr->sin_zero, '\0', sizeof my_addr->sin_zero);
 
    if(setsockopt(*sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1)
    {
        perror("setsockopt");
        exit(1);
    }
 
    if(bind(*sockfd, (struct sockaddr *)my_addr, sizeof(struct sockaddr)) == -1)
    {
        perror("bind error");
        exit(1);
    }
 
    if(listen(*sockfd, 10) == -1)
    {
        perror("Lisen error");
        exit(1);
    }
    printf("\nTCPServer Waiting for client on port 4950\n");
    fflush(stdout);
 
}
 
int main()
{
    fd_set master;
    fd_set read_fds;
    int fdmax, i;
    int sockfd = 0;
    struct sockaddr_in my_addr, client_addr;
 
    FD_ZERO(&master);
    FD_ZERO(&read_fds);
    connect_request(&sockfd, &my_addr);
    FD_SET(sockfd, &master);
 
    fdmax = sockfd;
    while(1)
    {
        read_fds = master;
        if(select(fdmax+1, &read_fds, NULL, NULL, NULL) == -1)
        {
            perror("select");
            exit(4);
        }
        for (i = 0; i <= fdmax; i++){
 
            if(FD_ISSET(i, &read_fds)){
                if(i == sockfd)
                    //new connection
                    connection_accept(&master, &fdmax, sockfd, &client_addr);
                else
                    //send_recv
                    send_recv(i, &master, sockfd, fdmax);
            }
        }
    }
    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
//клиент
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
 int main()
{
    char mes[2048];
    char buf[sizeof(mes)];
    char *IP, *point_str_htons;
    char str[20];
    int port,ch;
    int nomer;
    int read = 0;
    int sockfd;
 
    struct sockaddr_in address;
    struct sockaddr_in client;
 
    /* 1 створення TCP-сокета */
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
 
    if(sockfd < 0)
    {
        printf("socket");
        exit(1);
    }
    /* 2 Вказуємо параметри сервера */
    address.sin_family = AF_INET;
    address.sin_port = htons(9734);
    address.sin_addr.s_addr=inet_addr("192.168.....");
   if(connect(sockfd, (struct sockaddr *)&address, sizeof(address)) < 0)
    {
        perror("Connection");
        exit(2);
    }
 
while(1)
    {
        printf("Введіть повідомлення  ");
        if (!strcmp(gets(mes), "exit"))
        {
            close(sockfd);
            return 0;
        }
        printf("відправка повідомлення на сервер.\n ");
 
        /* 3 відправка повідомлення на сервер*/
        send(sockfd, mes, sizeof(mes), 0); /*Відправка повідомлення на сервер */
 
        printf("очікування повідомлення.\n");
       read = recv(sockfd, buf, sizeof(mes),1);
       printf("В= %d\n%s\n", read, buf); // Прийом повідомлення від сервера
 
    }
return 0;
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.05.2016, 13:32
Ответы с готовыми решениями:

Чат на сокетах
Я создаю чат на С ++, только такой в котором 1 сервер который как и клиент также может отправлять и...

Простой чат на сокетах
Доброго времени суток. Имеется VDS сервер с установленной на нём ОС Linux, на моём пк установлен...

О сокетах
Здравствуйте, возникло пару вопросов о сокетах. 1)Создаю я сервер и жду конекта, accept принимаю...

SDP на TCP сокетах
Всем привет. Написал приложение использующее TCP сокеты, теперь нужно чтобы по протоколу SDP оно...

Алгоритм сервера на сокетах
Помогите пожалуйста, только начал копаться в socket`aх. Уже создал простой &quot;эхо&quot; сервер и клиент к...

1
DUMP
75 / 49 / 26
Регистрация: 22.02.2015
Сообщений: 306
28.05.2016, 12:50 2
Когда ты отправляешь сообщение с первого клиента, то сразу получаешь то, что ты написал, а принять сообщение другого клиента ты не можешь , потому что вызывается ф-ия gets. Делай в два потока.
1
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.05.2016, 12:50

Многопоочност в сокетах VCL
Пишу приложене типа клиент-сервер, пр этом универсальное, то есть каждый хост в сети является...

Клиент и сервера на сокетах
Пытаюсь изучить Winsock, вот написал клиент и сервер. Сервер не дожидаясь запроса на подключение...

Нужна литература о сокетах
Доброго времени суток! Можете посоветовать какую-нибудь литературу по поводу сокетов в СИ++. В...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru