1 / 1 / 0
Регистрация: 31.01.2013
Сообщений: 41
1

Клиент-серверный чат

30.01.2014, 20:03. Показов 2201. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Когда клиент пытается принять сообщение о сервера он слушает порт
1) порт свой или сервера?
2) если свой, то на какой порт сервер отправляет сообщения?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.01.2014, 20:03
Ответы с готовыми решениями:

Клиент-серверный калькулятор (дописать программу)
Доброго времени суток! Нуждаюсь в небольшой помощи, народ, выручайте! В общем, есть задание:...

Клиент-сервер чат на C++/C#
Здравствуйте, написал клиент-серверный чат, клиент на c#, сервер на консольном с++, но с winapi...

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

Чат клиент-сервер на сокетах
и все таки появилась еще одна проблема раньше все сообщения от клиентов просто оставались на...

9
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
31.01.2014, 10:21 2
Цитата Сообщение от AlexOpryshko1 Посмотреть сообщение
Когда клиент пытается принять сообщение о сервера он слушает порт
1) порт свой или сервера?
2) если свой, то на какой порт сервер отправляет сообщения?
1. при подключении клиента к серверу создается сокет, привязанный к определенному порту. этот порт клиент и слушает. тут неуместно говорить "свой" или "чужой", но наверное все таки "свой" раз так хотите. как слушать "чужой" порт я не представляю
2. сервер отправляет сообщения на тот порт, который прописал ему программист... и опять же на который создался сокет.
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
31.01.2014, 11:14 3
Цитата Сообщение от AlexOpryshko1 Посмотреть сообщение
Когда клиент пытается принять сообщение о сервера он слушает порт
1) порт свой или сервера?
он слушает свой порт, порт, на который ему сервер должен прислать сообщение
Цитата Сообщение от AlexOpryshko1 Посмотреть сообщение
2) если свой, то на какой порт сервер отправляет сообщения?
на тот который откроет клиент, т.е открываем порт у клиента, а сервер шлет на него сообщения через свой открытый порт (у себя)
0
1 / 1 / 0
Регистрация: 31.01.2013
Сообщений: 41
31.01.2014, 14:08  [ТС] 4
Помогите разобраться
Клиент не видит, когда сервер отправляет ему сообщение
Сервер рабочий, проверя с помощью telnet
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
#pragma comment(lib, "Ws2_32.lib") 
  
#include <WinSock2.h> 
#include <Windows.h> 
#include <iostream> 
#include <string> 
//#include "process.h" 
#include <thread> 
  
using namespace std; 
//#define PORT_ADDR 6000 
  
int initSocket() { 
    WSAData wsaData; 
    WORD DllVersion = MAKEWORD(2, 1); 
    return WSAStartup(DllVersion, &wsaData); 
} 
  
void WaitSocket() 
{ 
    char chInfo[64]; 
    if (gethostname(chInfo, sizeof(chInfo))) 
    { 
        printf("Not local host\n"); 
        return; 
    } 
    else
    { 
        printf(chInfo); 
        printf(" GetHostName OK !!!!!\n"); 
    } 
} 
  
struct sockaddr_in remoteSocketInfo; 
struct hostent *hPtr; 
SOCKET socketHandle; 
char *remoteHost = "alexopryshko.ru"; 
int portNumber = 6000; 
  
  
//for reciving message 
SOCKADDR_IN socketaddr; 
SOCKET servsocket; 
SOCKET sConnect; 
struct hostent *hPtrRecive; 
  
unsigned __stdcall ReciveMessage(SOCKET servsocket, SOCKADDR_IN socketaddr) { 
    sConnect = socket(AF_INET, SOCK_STREAM, NULL); 
  
    bind(servsocket, (LPSOCKADDR)&socketaddr, sizeof(socketaddr)); 
      
    listen(servsocket, 256); 
    int size = sizeof(socketaddr); 
    while (true) 
    { 
  
        if ((sConnect = accept(servsocket, (LPSOCKADDR)&socketaddr, &size)) != INVALID_SOCKET) 
        { 
            cout << "DetectConnection" << endl;   //вот тут где-то проблема
            /*char *buff = new char[256]; 
            recv(sConnect, buff, 256, 0); 
            cout << buff; 
            delete[] buff;*/
              
        } 
  
    } 
    return 0; 
} 
  
int main() { 
    if (initSocket() != 0) { 
        cout << "Trouble" << endl; 
        exit(1); 
    } 
  
      
    //WaitSocket(); 
    //unsigned ThreadID; 
    //_beginthreadex(NULL, 0, &ReciveMessage, NULL, 0, &ThreadID); 
      
      
    if ((hPtr = gethostbyname(remoteHost)) == NULL) 
    { 
            cerr << "System DNS name resolution not configured properly." << endl; 
            cerr << "Error number: " << ECONNREFUSED << endl; 
            system("pause"); 
            exit(EXIT_FAILURE); 
    } 
  
    // create socket 
    if ((socketHandle = socket(AF_INET, SOCK_STREAM, 0)) < 0) 
    { 
        closesocket(socketHandle); 
        cout << "Error creating socket" << endl; 
        system("pause"); 
        exit(EXIT_FAILURE); 
    } 
    // Load system information into socket data structures 
  
    memcpy((char *)&remoteSocketInfo.sin_addr, hPtr->h_addr, hPtr->h_length); 
    remoteSocketInfo.sin_family = AF_INET; 
    remoteSocketInfo.sin_port = htons((u_short)portNumber);      // Set port number 
    if (connect(socketHandle, (struct sockaddr *)&remoteSocketInfo, sizeof(sockaddr_in)) < 0) 
    { 
        closesocket(socketHandle); 
        cout << "Error conecting" << endl; 
        system("pause"); 
        exit(EXIT_FAILURE); 
    } 
    cout << "Conection success to " << remoteHost << ":" <<portNumber << endl; 
  
  
    // 
    thread thrd(ReciveMessage, socketHandle, remoteSocketInfo); 
    thrd.detach(); 
    // 
  
  
    string buff; 
    while (true) 
    { 
        //getline(cin, buff); 
        getline(cin, buff); 
          
        if (buff == "exit") 
            break; 
        int Errors; 
        Errors = send(socketHandle, (LPSTR)buff.c_str(), buff.length(), 0); 
        if (Errors == SOCKET_ERROR) 
            cout << "Error Send" << endl; 
    } 
  
  
    closesocket(socketHandle); 
  
    system("pause"); 
    return 0; 
}
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
31.01.2014, 16:05 5
это код сервера, приведите код клиента

Добавлено через 6 минут
хотя в любом случае бред какой то,
сервер , создали сокет сделали бинд листен, в цикле аксепт, аксепт блокирующий, аксепт вернул управление, создали поток, туда передали тот сокет, который акспет вернул, с этим сокетом работаем
клиент, создали сокет, коннектимся, работаем с сокетом

Добавлено через 3 минуты
рабочий код сервера, с тредами WinApi, если надо замените на с++11ые

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
#include <WinSock.h>
 
#include <stdio.h>
#include <iostream>
void work(SOCKET client_sock)
{
char *msg = "Hello Client";
Sleep(3000);
send(client_sock,msg,20,0);
int iError = WSAGetLastError();
if(iError)
    std::cout<<iError<<" of send"<<std::endl;
char buf[1024];
recv(client_sock,buf,1024,0);
iError = WSAGetLastError();
if(iError)
    std::cout<<iError<<" of recv"<<std::endl;
std::cout<<buf<<std::endl;
//printf("Server: message sended\n");
closesocket(client_sock);
}
 
int main(int argc, _TCHAR* argv[])
{
    WSADATA wsa_data;
    if(WSAStartup(MAKEWORD(2,0),&wsa_data))
        printf("WSAStaratup error");
    SOCKET sock;
    sock=socket(AF_INET,SOCK_STREAM,0);
     //std::cout<<WSAGetLastError()<<std::endl;
    if(sock==INVALID_SOCKET)
    {
        printf("Error socket");
        return 1;
    }
    sockaddr_in addr;
    memset(&addr,0,sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr=INADDR_ANY;
    addr.sin_port=htons(32989);
    int binded = bind(sock,(LPSOCKADDR)&addr,sizeof(addr));
    if(binded!=0)
    {
        printf("Error bind");
        return 1;
    }
    int listened = listen(sock,1);
    if(listened!=0)
    {
        printf("Error listen"); return 1;
    }
    int from_len = sizeof(sockaddr_in);
    
    printf("Server ready %s\n",inet_ntoa(addr.sin_addr));
    int MAX_CONNECT=0;
    SOCKET client_sock = 0;
    sockaddr_in client_addr;
    
    memset(&client_addr,0,sizeof(client_addr));
 
    HANDLE tHandle;
    LPDWORD dTypeThread = 0;
 
    while(1){
    client_sock=accept(sock,(LPSOCKADDR)&client_addr,&from_len);
    int iError = WSAGetLastError();
    if(iError)
    std::cout<<iError<<std::endl;
    if(client_sock==INVALID_SOCKET)
        continue;   
    printf("Client with IP %s connect\n",inet_ntoa(client_addr.sin_addr));
    
    tHandle = CreateThread(NULL, 1024,(LPTHREAD_START_ROUTINE)&work,(LPVOID)client_sock,NULL, dTypeThread );
    }   
    closesocket(sock);
 
    WSACleanup();
    
    
    return 0;
}
0
1 / 1 / 0
Регистрация: 31.01.2013
Сообщений: 41
31.01.2014, 16:34  [ТС] 6
Как ни странно, приведенный код - код клиента.
Мне нужно, чтобы клиент мог отправлять и принимать сообщения в любой момент времени от сервера.
Поэтому, я решил сделать отдельный поток, чтобы он отвечал за принятия сообщений.
Может это как-то по другому сделать надо?

Вот код сервера:
Python
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
from twisted.internet.protocol import Factory, Protocol
from twisted.internet import reactor
 
class IphoneChat(Protocol):
    def connectionMade(self):
        self.factory.clients.append(self)
        print "clients are ", self.factory.clients
 
    def connectionLost(self, reason):
        self.factory.clients.remove(self)
 
    def dataReceived(self, data):
        print data
        for c in self.factory.clients:
            c.message(data)
 
    def message(self, message):
        self.transport.write(message)
 
factory = Factory()
factory.protocol = IphoneChat
factory.clients = []
reactor.listenTCP(6000, factory)
print "Chat server started"
reactor.run()
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
31.01.2014, 16:38 7
Лучший ответ Сообщение было отмечено AlexOpryshko1 как решение

Решение

тогда вопрос? зачем вот это

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
unsigned __stdcall ReciveMessage(SOCKET servsocket, SOCKADDR_IN socketaddr) { 
    sConnect = socket(AF_INET, SOCK_STREAM, NULL); 
  
    bind(servsocket, (LPSOCKADDR)&socketaddr, sizeof(socketaddr)); 
      
    listen(servsocket, 256); //клиенту не делают листн
    int size = sizeof(socketaddr); 
    while (true) 
    { 
  
        if ((sConnect = accept(servsocket, (LPSOCKADDR)&socketaddr, &size)) != INVALID_SOCKET) //и уж тем более не аксептят подключения в цикле
        { 
            cout << "DetectConnection" << endl;   //вот тут где-то проблема
            /*char *buff = new char[256]; 
            recv(sConnect, buff, 256, 0); 
            cout << buff; 
            delete[] buff;*/
              
        } 
  
    } 
    return 0; 
}
Добавлено через 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
int main(int argc, _TCHAR* argv[])
{
    WSADATA wsa_data;
    if(WSAStartup(MAKEWORD(2, 0),&wsa_data)!=0)
        printf("WSAStaratup error");
    SOCKET sock;
    sock=NULL;
    struct sockaddr_in addr;
    memset(&addr,0,sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.S_un.S_addr=inet_addr("192.168.129.121");
    addr.sin_port=htons(32989);
    sock=socket(AF_INET,SOCK_STREAM,0);
    if(sock==INVALID_SOCKET)
    {
        printf("Error socket");
        getchar();
        return 1;
    }
    if(connect(sock,(LPSOCKADDR)&addr,sizeof(addr))==INVALID_SOCKET)
    {
        printf("Error connect\n");
        getchar();
        return 1;
    }
    char buf[50];
    int n;
    if((n = recv(sock,buf,50,0)) == 0)
    {
        printf("Error recv");
        getchar();
        return 1;
    }
    else if(n == -1)
    {
        printf("Recv = -1\n");
    }
    else
    {
        printf("recv %i bytes\n",n);
    }
    getchar();
    WSACleanup();
    return 0;
}
1
1 / 1 / 0
Регистрация: 31.01.2013
Сообщений: 41
31.01.2014, 16:46  [ТС] 8
Мне нужно чтобы он еще и отправлял сообщения, а не только принимал!!!
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
31.01.2014, 17:07 9
пожулайста, вписывает send и все
1
1 / 1 / 0
Регистрация: 31.01.2013
Сообщений: 41
31.01.2014, 17:26  [ТС] 10
Все, спасибо большое, разобрался.
Оказалось все гараздо проще.
0
31.01.2014, 17:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.01.2014, 17:26
Помогаю со студенческими работами здесь

Клиент-сервер для чат-а - C++ Builder
Помогите пожалуйста начинающему программисту сделать клиент локального чата. Код чата есть,...

Клиент-серверный чат
Добрый день! Java нечто новое для меня. Нашла интересную статью, где реализовано клиент-серверное...

Сокеты, Клиент-серверный чат
Здравствуйте. Мне нужно создать чат. Чтобы был в одном Jframe. Есть проблемы. Прога не видит...

Клиент-серверный чат через сокеты
Здравствуйте. Такой вопрос. Есть допустим у меня два приложения(клиент и сервер). Всё сделано через...

Клиент-серверный чат придерживаясь MVC
Собираюсь написать клиент-серверный чат придерживаясь MVC. В базе будет храниться логин пароль и...

Реализовать клиент-серверный чат (консольная версия)
Реализовать клиент-серверный чат (консольная версия) со следующими возможностями: • При...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru