Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.74/112: Рейтинг темы: голосов - 112, средняя оценка - 4.74
34 / 34 / 8
Регистрация: 07.06.2010
Сообщений: 118

WinSock на C++

07.06.2010, 20:54. Показов 23102. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Только начинаю осваивать WinSock написал простейшее приложение-сервер и приложение-клиент
и че та у меня не работает вот код приложения-сервера оно очень простое слушает порт,обслуживает одного клиента просто отправляет ему строку HELLO
Очень большая просьба не поленитесь проанализируйте код и скажите что не так, надежда только на вас код приложения сервера:
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
#include <winsock2.h>
#include <iostream>
#define PORT 3128
using namespace std;
int main(int argc, char* argv[])
{
// STEP 1 START WINSOCK
    WSADATA wsaData;
    if (WSAStartup(0x202,&wsaData)) {cout<<"Failured start"<<endl;}
    else {cout<<"Start  ok"<<endl;}
// STEP 2 create socket
    SOCKET s;
    s = socket(AF_INET,SOCK_STREAM,0);
    if( s==INVALID_SOCKET)  cout << "Socket error"<<endl;
    else cout << "Create socket OK"<<endl;
// STEP 3 заполнение структуры serv_addr
sockaddr_in serv_addr;
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(PORT);
serv_addr.sin_addr.s_addr=0; // слушаем все IP с указанного порта
// связывание (bind)
int err=bind(s,(sockaddr*)&serv_addr,sizeof(serv_addr));
if (err==0) cout<<"Bind OK"<<endl;
else cout<<"Bind ERROR"<<endl;
//Listen  ожидание подключений
if(listen(s,10)==0 )
cout<<"Listen OK"<<endl;
// создание клиентской sockaddr_in где есть IP & Port клиента
sockaddr_in client_addr;
SOCKET client_sock;
int size_client_addr=sizeof(client_addr);
//accept извлечение запроса клиента из очереди и создание клиентского сокета
    client_sock=accept(s,(sockaddr*)&client_addr,&size_client_addr);
    cout<<"Accept complete"<<endl;
    send(client_sock,"HELLO",sizeof("HELLO"),0);
 
// закрою сокет когда все норм заработает
// CLOSE WINSOCK
if (WSACleanup())
cout << "Close error"<<endl;
    else    
        cout << "Cleanup OK"<<endl;
//------------------
    return 0;
    system("Pause");
}
И вот код приложения клиента которое коннектися к серверу и должно принять одно сообщение просьба также проанализировать и сказать что не так
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>
#define IP "94.143.43.35"
#define PORT 3128
using namespace std;
int main(int argc, char* argv[])
{
// STEP 1 START WINSOCK
    WSADATA *wsaData=new WSADATA;
    if (WSAStartup(0x202,wsaData)) {cout<<"Failured start"<<endl;}
    else {cout<<"Start  ok"<<endl;}
// STEP 2 create socket
    SOCKET s;
    s = socket(AF_INET,SOCK_STREAM,0);
    if( s==INVALID_SOCKET)  cout << "Socket error"<<endl;
    else cout << "Create socket OK"<<endl;
// STEP 3 заполнение структуры serv_addr
sockaddr_in dest_addr;
dest_addr.sin_family=AF_INET;
dest_addr.sin_port=htons(PORT);
dest_addr.sin_addr.s_addr=inet_addr(IP);
// connect to server
if(connect(s,(sockaddr*)&dest_addr,sizeof(dest_addr))==0)
   cout<<"Connect to "<<IP<<" OK"<<endl;
else
    cout <<"Connect to "<<IP<<" Error"<<endl;
// обмен данными
char buf[1024];
int msize=recv(s,buf,sizeof(buf)-1,0);
buf[msize]='\0';
cout<<buf;
 
 
 
 
// CLOSE WINSOCK
if (WSACleanup())  cout << "Close error"<<endl;
    else    cout << "Cleanup OK"<<endl;
    delete wsaData;
//------------------
    return 0;
    system("Pause");
}
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.06.2010, 20:54
Ответы с готовыми решениями:

Winsock
Всем привет.Начал разбиратся с сокетами и сразуже появились проблемы отправки и получения данных.Клиент к серверной части конектится...

WinSock
#include &quot;winsock2.h&quot; #define MAX_PACKET_SIZE 4096 WSADATA ws; hostent* hn; char buff ; if (FAILED (WSAStartup (MAKEWORD( 2,...

WinSock
Имеется два приложения. Они связываются через winsock... но если отослать что-либо от одного приложения к другому принимающая сторона...

32
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 21
18.01.2013, 22:46
Студворк — интернет-сервис помощи студентам
почему не работает этот код? просто зависает на req sended, recv... (хост заменен)

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 <winsock2.h>
#include <iostream>
#include <conio.h>
#include <windows.h>
 
#pragma comment(lib,"Ws2_32.lib")
 
#define MAX_PACKET_SIZE 4096
 
int get_addr(char *host_name)
{
    int res = -1;
 
    HOSTENT *phe = gethostbyname(host_name);
    if (phe)
        for (int i = 0; i < 4; i++)
            ((BYTE *)&res)[i] = phe->h_addr_list[0][i];
 
    return res;
}
 
int main() {
 
    WSADATA WSAData;
    
    if (FAILED (WSAStartup(MAKEWORD(2,0),&WSAData)) ) {
      // Error...
 
      std::cout << "error" << WSAGetLastError() << "\n";
      getch();
      return 0;
    }
 
    // создаем сокет
 
    SOCKET s;
 
    std::cout << "creating socket..." << "\n";
 
    if (INVALID_SOCKET == (s = socket (AF_INET, SOCK_STREAM, 0) ) ) {
      // Error...
 
      std::cout << "error" << WSAGetLastError() << "\n";
      getch();
      return 0;
    }
 
    // Объявим переменную для хранения адреса 
    sockaddr_in getaddr;
 
    // тип адреса (TCP/IP)
    getaddr.sin_family = AF_INET;
 
    getaddr.sin_addr.S_un.S_addr = get_addr("site.com"); 
 
    // Порт. Используем функцию htons для перевода номера порта из обычного в TCP/IP представление.
    getaddr.sin_port = htons(80);
 
    std::cout << "connecting... " << "\n";
 
    // Дальше выполняем соединение:
    if (SOCKET_ERROR == ( connect (s, (sockaddr *) &getaddr, sizeof (getaddr) ) ) ) {
        // Error...
 
        std::cout << "error" << WSAGetLastError() << "\n";
        getch();
        return 0;
    }
 
    std::cout << "connected..." << "\n";
 
    const char message[] = "GET /index.htm HTTP/1.0\r\nHost: site.com\r\n\r\n";
    
    // Посылаем запрос
    if (SOCKET_ERROR == send (s, message, sizeof(message), 0) ) {
        // Error
        std::cout << "error" << WSAGetLastError() << "\n";
        getch();
        return 0;
    }
 
    std::cout << "req sended, recv..." << "\n";
 
    char buff[MAX_PACKET_SIZE];
    int buffer_size = sizeof(buff);
 
    // Получаем ответ
    int getlength = recv (s, buff, MAX_PACKET_SIZE, 0);
 
    if ( getlength == SOCKET_ERROR || getlength == 0 ) {
        // Error
        std::cout << "error" << WSAGetLastError() << "\n";
        getch();
        return 0;
    }
 
    std::cout << "recieved: \n" << buff << "\n";
 
    // Закрываем соединение
    if (SOCKET_ERROR == closesocket (s) ) {
        // Error
        std::cout << "error" << WSAGetLastError() << "\n";
 
        getch();
        return 0;
    }
   
    WSACleanup();
 
    std::cout << "done" << "\n";
 
    getch();
    return 0;
}
0
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 21
23.01.2013, 23:11
вообще если долго нету ответа от сервера то что делать? то есть на rcv если повисла программа?

и еще такой вопрос, допустим надо побайтово отправить данные после коннекта, так вот правильно?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
CHAR buf[6];
 
buf[0]           = '0x01';
buf[1]           = '0x02';
buf[2]           = '0x03';
buf[3]           = '0x04';
buf[4]           = '0x05';
buf[5]           = '\0';
    
// Посылаем запрос
if (SOCKET_ERROR == send (s, buf, sizeof(buf), 0) ) {
 
...
или нет?

и вот чтобы побайтово прочитать ответ сервера правильный такой вариант?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
char buff[1024];
 
    int len;
    do
    {
        if (SOCKET_ERROR == (len = recv (s, (char *) &buff, 1024, 0) ) ) {
            std::cout << "error" << WSAGetLastError() << "\n";
            getch();
 
            return -1;
        }   
 
        
        printf("%x ", buff); 
 
    } while (len!=0);
Добавлено через 19 часов 38 минут
чего никто не отвечает?
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
24.01.2013, 00:39
Цитата Сообщение от 0x111 Посмотреть сообщение
просто зависает
мб потому что надо
C++
1
socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
Цитата Сообщение от 0x111 Посмотреть сообщение
так вот правильно
нет. надо
C++
1
buf[0]           = 0x01;
Цитата Сообщение от 0x111 Посмотреть сообщение
правильный такой вариант
думаю нет. хотя смотря что вы вкладываете в слово побайтово.
0
 Аватар для Pure
228 / 52 / 7
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 26
25.01.2013, 17:48
Цитата Сообщение от accept Посмотреть сообщение
Сообщение от [Freeman]
дак вот откуда мне взять эти айпишники ?
на сервере всё так и остаётся
а клиенту айпи передаётся
клиент не узнает айпи сервера сам, ему нужно передать его
то есть узнавание айпи - это вообще не в клиенте происходит и не в сервере, это делаешь на сервере netstat -n и он тебе показывает айпи, просто netstat вроде даст как раз доменное имя
вообще то когда ассепт принимает сокет, то там есть много данных о том, кто подключился, включая и айпишник.
Ну а айпишник сервера мы и так знаем, ведь мыж знаем куда хотим подключится. Если знаем только имя, то есть функции помогающие получить адрес по имени
0
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 21
26.01.2013, 00:52
а null байт в данном случае надо в конце ставить, или не обязательно?


мб потому что надо
пожалуйста, подробнее можете?

Добавлено через 2 минуты
и разве есть разница

buf[0] = 0x05;

или

buf[0] = '0x05';

одинарные кавычки подразумевают ведь символ
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,469
26.01.2013, 02:30
Цитата Сообщение от 0x111 Посмотреть сообщение
подробнее
IPPROTO_TCP
Цитата Сообщение от 0x111 Посмотреть сообщение
подразумевают
='\x05'
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
26.01.2013, 07:07
Цитата Сообщение от Pure Посмотреть сообщение
вообще то когда ассепт принимает сокет, то там есть много данных о том, кто подключился, включая и айпишник
айпишник не нужен для передачи данных в сокет, потому что сокет сохраняется в виде дескриптора
айпишник нужно знать клиенту, чтобы подключиться к серверу (установить соединение)
0
 Аватар для Pure
228 / 52 / 7
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 26
27.01.2013, 14:36
Цитата Сообщение от accept Посмотреть сообщение
айпишник не нужен для передачи данных в сокет, потому что сокет сохраняется в виде дескриптора
айпишник нужно знать клиенту, чтобы подключиться к серверу (установить соединение)
мы на разных языках? ip пакет пришедший на сетевуху от подключившегося клиента - содержит достаточно инфы, в том числе и ip адрес клиента. а сокет это несколько уровнями выше. Я все это лишь к тому что из сокета который получается после ассепта соединения МОЖНО извлечь ип адрес подключившегося клиента. На уровне ос, в сокет просто пишем как файл, естесно в случае ассепта клиента его айпишник для передачи ему данных не нужен - система и так знает его.
Клиенту нужен ипшник для подключения к серверу, часто достаточно и просто имени, есть функции которые сами разрезолвят ипшник из имени. На уровне ос все удобно. К тому же это все для TCP надо. В протоколах без установки соединения айишник сервера знать не обязательно
Итц олл
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
28.01.2013, 01:45
Цитата Сообщение от Pure Посмотреть сообщение
мы на разных языках? ip пакет пришедший на сетевуху от подключившегося клиента - содержит достаточно инфы, в том числе и ip адрес клиента. а сокет это несколько уровнями выше. Я все это лишь к тому что из сокета который получается после ассепта соединения МОЖНО извлечь ип адрес подключившегося клиента
ты думаешь, что тут нужен ip для чего-то
ip-адрес может быть нужен для отображения, что подключился такой-то клиент, но для передачи он не нужен, потому что сокет уже сохраняется и туда можно писать
0
 Аватар для Pure
228 / 52 / 7
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 26
28.01.2013, 12:13
Цитата Сообщение от accept Посмотреть сообщение
ты думаешь, что тут нужен ip для чего-то
ip-адрес может быть нужен для отображения, что подключился такой-то клиент, но для передачи он не нужен, потому что сокет уже сохраняется и туда можно писать
блйад. где написано что я думаю что он нужен для чего то?
Цитата Сообщение от Pure Посмотреть сообщение
мы на разных языках? ip пакет пришедший на сетевуху от подключившегося клиента - содержит достаточно инфы, в том числе и ip адрес клиента. а сокет это несколько уровнями выше. Я все это лишь к тому что из сокета который получается после ассепта соединения МОЖНО извлечь ип адрес подключившегося клиента. На уровне ос, в сокет просто пишем как файл, естесно в случае ассепта клиента его айпишник для передачи ему данных не нужен - система и так знает его.
Клиенту нужен ипшник для подключения к серверу, часто достаточно и просто имени, есть функции которые сами разрезолвят ипшник из имени. На уровне ос все удобно. К тому же это все для TCP надо. В протоколах без установки соединения айишник сервера знать не обязательно
тут?
Написано что есть возможность при необходимости его извлечь ЕСЛИ!!! он понадобиться юзеру.
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
29.01.2013, 03:07
Цитата Сообщение от Pure Посмотреть сообщение
где написано что я думаю что он нужен для чего то?
ну, ты бы изначально не стал писать про то, что его можно извлечь из сокета, если бы не думал, что его нужно извлекать из сокета

Цитата Сообщение от Pure Посмотреть сообщение
ЕСЛИ!!! он понадобиться юзеру.
там понадобиться может что угодно, но это не повод, чтобы всё это описывать

тема про то, как их просто подключить, и он подумал, что ему айпишник клиента нужен, а я ему написал, что ему айпишник клиента не нужен
а ты подумал, что я ему написал, что нельзя узнать айпишник клиента из сервера
0
 Аватар для Pure
228 / 52 / 7
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 26
31.01.2013, 23:31
Цитата Сообщение от accept Посмотреть сообщение
ну, ты бы изначально не стал писать про то,
))ты думаешь за меня? не надо
Цитата Сообщение от accept Посмотреть сообщение
там понадобиться может что угодно, но это не повод, чтобы всё это описывать
повод повод. пусть до кучи инфа будет. не отдельнуж тему создавать
0
4866 / 3287 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
01.02.2013, 01:35
Цитата Сообщение от Pure Посмотреть сообщение
пусть до кучи инфа будет. не отдельнуж тему создавать
ну и я про то же, я-то тут причём ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.02.2013, 01:35

C++ WinSock
Здравствуйте. Есть необходимость написать виртуальный файловый сервер, который будет обрабатывать команды пользователей (вроде cd, mk и...

WinSock
Есть самоучители на чистом Си по теме WinSock??

c++ winSock
Всем привет. У меня возникла проблема, не понятно из-за чего не хочет биндить ни клиент, ни сервер. Клиент: //Client-UDP ...

Winsock
День добрый. Есть такой код: long CUDPInterface::OpenPort() { m_connection_state = false; if(m_sock != INVALID_SOCKET) ...

winsock
Когда в клиенте отправляю сообщение приходит всегда число 10, найдите ошибку пожалуйста! сервер: TForm1 *Form1; TLabel *lb1; SOCKET...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
Более приземисто - Эстафету хвоста в .cdl (деревья эстафеты в сад).
Hrethgir 24.07.2026
В будущем, после написания блока инверсии обхода дерева (эстафеты хвоста), я планирую вернуться к нашему прошлому разговору о том, обладают ли знания целеполаганием. Тогда я пришел к выводу, что. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru