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

Создание эхо сервера - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Aldragon
2 / 2 / 0
Регистрация: 28.09.2012
Сообщений: 34
28.09.2012, 17:44     Создание эхо сервера #1
Здравствуйте, извините, если ошибся с разделом форума. Помогите, пожалуйста, разобраться с кодом сервера и клиента. И еще раз извиняюсь, так как код очень быдловский(еще в процессе редактирования и переписывания под себя, исходник взят из статьи Касперски). В общем-то вопрос всего один: какая часть кода отвечает за размер сообщения (передается около 30 символов, лень считать точнее).
Код сервера:
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
#define MYPORT 201
#define HELLO_USER "Hello, User! Server wish you all good!"
#define PRINTONLINE if (Number_Clients) cout << "User Online:" << Number_Clients << endl; else cout <<"No User online" << endl;
 
using namespace std;
 
int Number_Clients;
 
DWORD WINAPI MessageToClient(LPVOID client_socket){
    SOCKET My_Sock;
    My_Sock=((SOCKET *) client_socket)[0];
    char buff[20*1024];
    send(My_Sock, HELLO_USER, sizeof(HELLO_USER),0);
    int bytes_recv;
    while((bytes_recv = recv(My_Sock,&buff[0],sizeof(buff),0)) && (bytes_recv != SOCKET_ERROR)){
        send(My_Sock,&buff[0],bytes_recv,0);
    }
    Number_Clients--;
    cout << "Disconnect" << endl;
    PRINTONLINE;
    closesocket(My_Sock);
return 0;
}
 
int main(int argc, char** argv) {
    cout << "Server TCP" << endl << endl;
    char buf[1024];
    int flag = WSAStartup(0x0202,(WSADATA *) &buf[0]);
    if (flag){
        cout << "Error of startup libory" << endl;
        return (-1);
    }
 
    SOCKET MySocket = socket(AF_INET, SOCK_STREAM, 0);
    if(MySocket < 0){
       WSACleanup();
       cout << "Error of create socket" << endl;
       return (-1);
    }
 
    sockaddr_in Local_Addr;
    Local_Addr.sin_family = AF_INET;
    Local_Addr.sin_port = htons(MYPORT);
    Local_Addr.sin_addr.s_addr = 0;
 
    flag = bind(MySocket,(sockaddr *) &Local_Addr, sizeof(Local_Addr));
    if (flag) {
        cout << "Error of bind: " << WSAGetLastError() << endl;
        closesocket(MySocket);
        WSACleanup();
        return(-1);
    }
 
    flag = listen(MySocket, 0x100);
    if (flag) {
        cout << "Error of listen: " << WSAGetLastError() << endl;
        closesocket(MySocket);
        WSACleanup();
        return(-1);
    }
    cout << "Connect. Plaese wait" << endl;
 
    SOCKET Client_Socket;
    sockaddr_in Client_Addr;
    int Client_Addr_Size = sizeof(Client_Addr);
 
    while(Client_Socket = accept(MySocket, (sockaddr *) &Client_Addr, &Client_Addr_Size)){
        Number_Clients++;
        HOSTENT *hst;
        hst=gethostbyaddr((char *) &Client_Addr.sin_addr.s_addr,4,AF_INET);
        cout << "New Connect" << endl <<( (hst) ? hst->h_name : "" ) << inet_ntoa(Client_Addr.sin_addr) << endl;
        PRINTONLINE;
        DWORD thID;
        CreateThread(NULL, NULL, MessageToClient, &Client_Socket, NULL, &thID);
    }
    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
66
67
68
69
70
71
#include "stdafx.h"
#include <iostream>
#include <winsock2.h>
#include <string.h>
 
 
#define PORT 201
#define SERVERADDR "127.0.0.1"
 
using namespace std;
 
int main(int argc, CHAR* argv[]){
    cout << "TCP - Client" << endl << endl;
    char buff[20*1024];
    int flag = WSAStartup(0x0202,(WSADATA *) &buff[0]);
    if (flag){
        cout << "Error of startup libory" << endl;
        WSACleanup();
        return (-1);
    }
 
    SOCKET My_Socket = socket(AF_INET, SOCK_STREAM, 0);
    if(My_Socket < 0){
       WSACleanup();
       cout << "Error of create socket" << endl;
       return (-1);
    }
 
    sockaddr_in Dest_Addr;
    Dest_Addr.sin_family = AF_INET;
    Dest_Addr.sin_port = htons(PORT);
    HOSTENT *hst;
    if (inet_addr(SERVERADDR)!=INADDR_NONE){
        Dest_Addr.sin_addr.s_addr=inet_addr(SERVERADDR);
    }
    else{
        if (hst=gethostbyname(SERVERADDR)){
            ((unsigned long *)&Dest_Addr.sin_addr)[0]=((unsigned long **)hst->h_addr_list)[0][0];
        }
        else{
            printf("Invalid address %s\n",SERVERADDR);
            closesocket(My_Socket);
            WSACleanup();
            return (-1);
        }
    }
    flag = connect(My_Socket,(sockaddr *)&Dest_Addr,sizeof(Dest_Addr));
    if (flag){
        printf("Connect error %d\n",WSAGetLastError());
        return (-1);
    }
    printf("Connection successful. Type quit for quit\n\n",SERVERADDR);
    int nsize;
    while((nsize=recv(My_Socket,&buff[0],sizeof(buff)-1,0))!=SOCKET_ERROR){
        buff[nsize]=0;
        printf("S=>C:%s",buff);
        printf("S<=C:"); 
        fgets(&buff[0],sizeof(buff)-1,stdin);
        if (!strcmp(&buff[0],"quit\n")){
            printf("Exit...");
            closesocket(My_Socket);
            WSACleanup();
            return 0;
        }
        send(My_Socket,&buff[0],nsize,0);
    }
    printf("Recv error %d\n",WSAGetLastError());
    closesocket(My_Socket);
    WSACleanup();
    return (-1);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.09.2012, 17:44     Создание эхо сервера
Посмотрите здесь:

Функция и эхо контроль C++
Скачать файл с сервера. C++
C++ Пример COM сервера
Функция с эхо вызовом C++
Исходник Echo сервера C++
C++ Что такое "эхо печать"? И как через такую печать сделать калькулятор?
C++ Научите создавать эхо сервер

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Andsteadur
152 / 136 / 3
Регистрация: 23.05.2009
Сообщений: 275
28.09.2012, 17:51     Создание эхо сервера #2
recv

send
Yandex
Объявления
28.09.2012, 17:51     Создание эхо сервера
Ответ Создать тему
Опции темы

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