С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
инженер-системотехник
 Аватар для Haster
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533

Можно ли самому задать номер порта клиента?

20.05.2010, 11:27. Показов 1966. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, товарищи! У меня возник такой вопрос:
пишу программу на С++ для связи по сети, и мне необходимо
жесток задать адрес клиента (общение происходит по TCP/IP).

Почти везде приводится вот такой каркас клиента:
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
    WSADATA wsaData;
    unsigned int addr = INADDR_NONE;
    struct sockaddr_in server;
    int wsaret=WSAStartup(0x101,&wsaData);
    if(wsaret)  
    {
        LogSendRecieveInfo("ERROR - WSAStartup(0x101,&wsaData)");
        return FALSE;
    }
    
    m_Connection = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
 
    if(m_Connection == INVALID_SOCKET)
    {
        LogSendRecieveInfo("ERROR - socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)");
        
        m_Connection = NULL;
        return FALSE;
    }
 
    CStringA csServerNameA = CTextConvert::ConvertToChar(servername);
 
       addr = inet_addr(csServerNameA);
    if(addr == INADDR_NONE)
    {
        struct hostent *hp = gethostbyname(csServerNameA);
        if(hp != NULL)
        {
            addr = *(unsigned int*)hp->h_addr;
        }
    }
 
    if(addr == NULL || addr == INADDR_NONE)
    {
        LogSendRecieveInfo("addr == NULL || addr == INADDR_NONE");
 
        closesocket(m_Connection);
        m_Connection = NULL;
        return FALSE;
    }
 
    server.sin_addr.s_addr = addr;
    server.sin_family = AF_INET;
    server.sin_port = htons((u_short)g_Opt.m_lPort);
    if(connect(m_Connection, (struct sockaddr*)&server, sizeof(server)))
    {
        int nWhy = WSAGetLastError();
        LogSendRecieveInfo(StrF(_T("ERROR if(connect(m_Connection,(struct sockaddr*)&server,sizeof(server))) why = %d"), nWhy));
        closesocket(m_Connection);
        m_Connection = NULL;
        return FALSE;   
    }
т.е. указывается только адрес и порт сервера, а порт клиента я сам задать не могу
(как я понял, система сама назначает один из свободных)
Можно ли как-то собственноручно задать порт отправителя?

Заранее спасибо )
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.05.2010, 11:27
Ответы с готовыми решениями:

Указать номер порта клиента
Возможно ли уточнить порт клиента при его создании? P.S. А где список тем, похожих на введенную в заголовке?

Как самому задать размерность матрицы?
Здрасьте! У меня есть кусочек кода, где создаётся матрица размерностью 12х12. Как мне самому задавать размерность в матрице? Я пытался...

(STL) Как самому задать диапазон удаляющий элементов ?
тут удаляется три элемента, а как после компиляции самому задать этот диапазон ? list<T>::iterator it; for (it =...

6
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
20.05.2010, 11:33
Цитата Сообщение от Haster Посмотреть сообщение
Можно ли как-то собственноручно задать порт отправителя?
Можно создать сокет, привязать к нему клиента и через этот самый сокет к серверу стучаться - будет Вам запрос с определённого порта. Это, если правильно вопрос понял...
1
инженер-системотехник
 Аватар для Haster
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
20.05.2010, 11:43  [ТС]
easybudda, А как это можно сделать?

Я так понял, что сокет мы получаем так:
C++
1
m_Connection = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
А каким образом для него задать порт?

А понял, с помощью функции bind...

easybudda, еще раз спасибо ))
0
 Аватар для coderXLsn
49 / 49 / 3
Регистрация: 16.05.2010
Сообщений: 348
20.05.2010, 12:51
я так понял вам необходимо задать внутриний порт клиента?
зачем?
вы подключаетесь к внешнему порту а система уже сама разбереться кудаего перенаправлять, или я что-то не понял
0
инженер-системотехник
 Аватар для Haster
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
20.05.2010, 14:25  [ТС]
Просто мне нужно, чтобы клиент общался с сервером через определенный порт, а не через тот, который выделит система...
На серваке планируется реализовать функционал, зависящий от пары <IP:порт> клиента
0
 Аватар для coderXLsn
49 / 49 / 3
Регистрация: 16.05.2010
Сообщений: 348
20.05.2010, 14:46
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 sServerListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    if (sServerListen == SOCKET_ERROR)
    {
        MessageBox(0, "Can't load WinSock", "Error", 0);
        return 0;
    }
    localaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    localaddr.sin_family = AF_INET;
    localaddr.sin_port = htons(5050);
 
    if (bind(sServerListen, (struct sockaddr *)&localaddr, 
            sizeof(localaddr)) == SOCKET_ERROR)
    {
        MessageBox(0, "Can't bind", "Error", 0);
        return 1;
    }
    
    MessageBox(0, "Bind OK", "Error", 0);
тут же явно указывается порт, или это не то?

Добавлено через 40 секунд
сорри если перепутал. сам только изучаю сокеты
0
инженер-системотехник
 Аватар для Haster
111 / 111 / 5
Регистрация: 10.03.2009
Сообщений: 533
20.05.2010, 15:18  [ТС]
coderXLsn, Все верно!
Просто почти во всех источниках функция bind применяется только на стороне сервера....
А для клиента ее не используют, т.к. при использовании функции connect система сама берет
свободный порт.

Я просто не догадывался, что bind можно использовать и на стороне клиента.
Сейчас уже проверил - действительно работает )))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.05.2010, 15:18
Помогаю со студенческими работами здесь

Получение порта и IP клиента, пославшего запрос
Всем доброе время суток. Столкнулся с такой проблемкой.. Задача стоит примерно так: есть VDS с виндой и белым адресом на борту, а т акже...

UDP клиент-сервер. Проброс порта у клиента
В TCP-IP т.к устанавливается соединение мы используем для связи с сервером тот же сокет с которым подключались. Возможна как отправка...

UdpClient. Смена порта при отключении клиента
Странное поведение клиента. private static IPEndPoint m_endpoint = new IPEndPoint(IPAddress.Any, 2310); private...

Как редактировать режим наложения в After Effects и задать его параметры самому
Доброго времени суток. Вопрос такой. Как редактировать режим наложения и задать его параметры самому. Или переформулирую. Где можно...

Задать переменную COM-порта
Для вечно учащихся. Как посмотреть какой порт занят модулем я знаю. У меня 4 порт. Подскажите как к нему обратиться. В excel я делал...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru