Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: Сети
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
artart96
-12 / 0 / 4
Регистрация: 04.10.2014
Сообщений: 272
1

Передача числа от клиента серверу

10.09.2015, 20:29. Просмотров 1098. Ответов 3
Метки нет (Все метки)

Клиентская часть:
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
#include <winsock2.h> 
#include <iostream>
#pragma comment(lib, "wsock32.lib")
#include <stdlib.h> 
using namespace std;
 
int main()
{ 
 
  WORD wVersionRequested; 
  WSADATA wsaData; 
  wVersionRequested=MAKEWORD(2,2); 
  WSAStartup(wVersionRequested,&wsaData); 
   
  struct sockaddr_in peer; 
  peer.sin_family=AF_INET; 
  peer.sin_port=htons(1280); 
  peer.sin_addr.s_addr=inet_addr("127.0.0.1"); 
   
  SOCKET s=socket(AF_INET,SOCK_STREAM,0); 
 
  connect(s,(struct sockaddr*) &peer,sizeof(peer)); 
 
  int buf[5],b[5]; 
  cout<<"Enter the string, please"<<endl; 
  int i;
  for(i = 0; i < 5;i++)
  {
      cin>>buf[i];
  }
   
  send(s,(const char*)buf,sizeof(buf[5]),0); 
  if (recv(s,(char*)b,sizeof(b[5]),0)!=0){ 
    b[length(b[5])]='\0';    
    cout<<b<<endl; 
  }   
   
  closesocket(s); 
   
  WSACleanup(); 
 
  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
#pragma comment(lib, "wsock32.lib")
#include<winsock2.h>
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<cstdlib>
 
int main()
{
    WORD wVersionRequested;
    WSADATA wsaData;//структура WSADATA  
    wVersionRequested = MAKEWORD(2,2);
    WSAStartup(wVersionRequested,&wsaData);
    SOCKET s = socket (AF_INET,SOCK_STREAM,0);/*Функция socket(domain,type,protocol)[(домен,тип сокета, протокол)]*//*Домен - это абстракция, подразумевающая
                                                                                                                    конкретную стрктуру адресации и протоколы.*/
    /* Струкутура адреса - это структура типа sockaddr_in
    В поле sin_addr структуры sockaddr_in хранится физический IP - адрес компьютера в 
    формате структуры in_addr, опписанной в заголовочном файле */                                                                                                               
    struct sockaddr_in local;
    local.sin_family = AF_INET;//Данное поле имеет всегда значение AF_INET  
    local.sin_port = htons(1280);//Определяет порт, который будет ассоциирован с сокетом
    local.sin_addr.s_addr = htonl(INADDR_ANY);//INADDR_ANY - позволяет сокету принимать или посылать данные через любой IP адрес данного компьютера
    int c = bind(s,(struct sockaddr*)&local,sizeof(local));/*Функция bind связывает конкретный адрес с сокетом,передается s - дескриптор сокета,указатель на структуру адреса, длниу этой структуры*/
 
    //После создания сокета и привязки его к адресу необходимо каким-то образом установить соедиение с клиентом.Для этого используется функция 
    //liste(s,l),которая помещает пакет в состояние прослушивания
    int r = listen(s,5);//Вызов функции инициирует ожидание запроса клиента на открытие соединения,параметр l,который в данном случае равен 5
    
 
    while(true)
    {
        char *Res;
        int b[55],res[5],b[5],
        //Структура определяет удаленный адрес, с которым соединяется сокет
        sockaddr_in remote_addr;
        int size = sizeof(remote_addr);
        SOCKET s2 = accept(s,(struct sockaddr*)&remote_addr,&size);
        while(recv(s2,(char*)b,sizeof(b[5]),0) != 0)
    {
        int i = 0;
        for(unsigned j = 0;j<strlen(b);j++)
            if(b[j] %3 == 0) i++;
        _itoa(i,res,10);
        Res = new char[strlen(res)+1];
        strcpy(Res,res);
        Res[strlen(res)] = '\0';
 
        //Посылает данные на соединенный сокет
        send(s2,Res,sizeof(Res)-2,0);
        closesocket(s2);
    }
    }
    WSACleanup();
}
Как передать серверу число, если в прототипе функции пересылки буфер должен быть const char*(Пересылка данных выполняется с помощью функции send ( ) : int send (SOCKET s, const char FAR *buf, int len, int flags)????
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.09.2015, 20:29
Ответы с готовыми решениями:

Передача сообщения от клиента к серверу, сокеты
Хочу передать сообщение от клиента к серверу и вывести это сообщение. Как это...

Подключение клиента к серверу по интернету
Всем здрасьте! Написал обычный сетевой чат, тестировал его на своём...

Не выходит подключиться к серверу с клиента
Здравствуйте!Я недавно решил написать прогу клиент-сервер на c++.Вот код...

Как передать массив вещественных чисел от клиента к серверу?
Есть клиент/сервер на си, использующий winsock. Клиент/сервер получает и...

Помеха с типом char, при приёме сообщения от клиента к серверу (c++)
Здравствуйте. Программа должна работать следующим образом: сервер на c++...

3
zealot01
43 / 43 / 21
Регистрация: 24.08.2015
Сообщений: 136
Завершенные тесты: 1
10.09.2015, 21:35 2
Интересный код:
sizeof(b[5]) всегда возвратит 4 если b массив int...
Cтроку в число можно перевести так
int atoi(const char* str)
число в строку
int scanf(const char* format, ...)

Добавлено через 6 минут
Может нужно написать sizeof(b) там где sizeof(b[5])
0
artart96
-12 / 0 / 4
Регистрация: 04.10.2014
Сообщений: 272
10.09.2015, 21:54  [ТС] 3
Цитата Сообщение от zealot01 Посмотреть сообщение
Интересный код:
sizeof(b[5]) всегда возвратит 4 если b массив int...
Cтроку в число можно перевести так
int atoi(const char* str)
число в строку
int scanf(const char* format, ...)
Добавлено через 6 минут
Может нужно написать sizeof(b) там где sizeof(b[5])
Можно и без atoi,просто сделать преобразования типа (const char*)(int пер). Дело же не в
том.При вводе я ввожу строку,а мне нужно число.Вот передачи строки:
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
#include <winsock2.h> 
#include <iostream>
#pragma comment(lib, "wsock32.lib")
#include <stdlib.h> 
using namespace std;
 
int main()
{ 
 
  WORD wVersionRequested; 
  WSADATA wsaData; 
  wVersionRequested=MAKEWORD(2,2); 
  WSAStartup(wVersionRequested,&wsaData); 
   
  struct sockaddr_in peer; 
  peer.sin_family=AF_INET; 
  peer.sin_port=htons(1280); 
 peer.sin_addr.s_addr=inet_addr("127.0.0.1"); 
   
  SOCKET s=socket(AF_INET,SOCK_STREAM,0); 
 
  connect(s,(struct sockaddr*) &peer,sizeof(peer)); 
 
  char buf[255],b[255]; 
  cout<<"Enter the string, please"<<endl; 
  cin.getline(buf,100,'\n'); 
   
  send(s,buf,sizeof(buf),0); 
  if (recv(s,b,sizeof(b),0)!=0){ 
    b[strlen(b)]='\0';    
    cout<<b<<endl; 
  }   
   
  closesocket(s); 
   
  WSACleanup(); 
 
  return 0; 
}
А число как?меня тип на int массивов b и т.д. я все равно буду производить преобразования типов при передаче.Толку?
0
zealot01
43 / 43 / 21
Регистрация: 24.08.2015
Сообщений: 136
Завершенные тесты: 1
11.09.2015, 10:19 4
Преобразование типов в любом случае при передаче нужно делать, список параметров функции такой. Массив любого типа это указатель, при приведении указателя любого типа к типу char* становится указателем на массив байтов. Так что тут всё просто, передаёшь и принимаешь этот массив байтов а в функциях send и recv делаешь преобразования типов. Надеюсь я ничего не упустил.

Клиент
C++
1
2
3
4
5
6
7
8
9
int buf[5];
cout<<"Enter the string, please"<<endl; 
  int i;
  for(i = 0; i < 5;i++)
  {
    cin>>buf[i];
  }
   
  send(s,(char*)buf,sizeof(buf),0);
Сервер
C++
1
2
3
4
int buf[5];
if (recv(s,(char*)buf,sizeof(buf),0)!=0){ 
  // buf массив чисел int прочитан
  }
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.09.2015, 10:19

Можно запросом через telnet серверу получить часовой пояс клиента?
Пишу сервер(windows). Можно ли как-то запросом через telnet серверу получить...

Передача логина и пароля ftp-серверу
Здравия желаю, товарищи. После написания батника для сбора информации о...

Передача по UDP числа и массива в одном пакете
Здравствуйте. Я в С++ новичок. Задача следующая: нужно передать по UDP пакет в...


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

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

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