Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.61/33: Рейтинг темы: голосов - 33, средняя оценка - 4.61
12 / 12 / 0
Регистрация: 25.06.2011
Сообщений: 165
1

TCP сокеты (SOCK_STREAM)

04.08.2012, 04:56. Показов 6171. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Для начала - код:
СЕРВЕР
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
#include "stdafx.h"
#include <string.h>
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <winsock2.h>   
#pragma comment (lib, "ws2_32.lib")   
#define PORT 3985
 
     
 
  
 
using namespace System;
using namespace std;
 
int main(array<System::String ^> ^args)
{
    Console::WriteLine(L"SERVER");
    
    WORD wVersion;       
    WSADATA wsaData;        
    wVersion = MAKEWORD (2, 0);   
    SOCKET sd;  
    int wsaInitError = WSAStartup (wVersion, &wsaData);    
    if (wsaInitError != 0)
    {
        cout<<"wsaInitError: "<<WSAGetLastError()<<"\n";
        _getch();
        exit (1);
    }
    else
    {    
        sd = socket (AF_INET, SOCK_STREAM, 0);
        if (sd < 0)
        {
            cout<<"socketInitError: "<<WSAGetLastError()<<"\n";
            _getch();
            exit (1);
        }
    }
 
    char answer;
    
    struct sockaddr_in addr;
    memset (&addr, 0, sizeof (struct sockaddr_in));
  
    addr.sin_family = AF_INET;
    addr.sin_port = htons (PORT);
    addr.sin_addr.s_addr = 0;
    int serror = bind (sd, (struct sockaddr *) &addr, sizeof (struct sockaddr_in));
    if (serror != 0)
    {
        cout<<"bindError: "<<WSAGetLastError()<<"\n";
        _getch();
        exit (1);
    }
    int list = listen(sd, 20);
    struct sockaddr_in dest;
    int addrLen = sizeof(sockaddr);
    SOCKET s_a = accept(sd, (struct sockaddr *) &dest, &addrLen);
    if (s_a < 0)
    {
        cout<<"acceptError: "<<WSAGetLastError()<<"\n";
        _getch();
        exit (1);
    }
 
    int size = sizeof (struct sockaddr_in);
    int error;
    char bf;
    char buf;
 
 v: cout<<"You want send or receive(1/2)? Or exit(0)?\n"<<endl;
    answer = _getch();
    if (answer == '1')
    {
        
        cout<<"We ready! Enter message: ";
        while (buf != '0')
        {
        buf = _getch();
        cout<<buf;
        send(s_a, &buf, 1, 0);
        error = WSAGetLastError();
        if(error != 0) cout <<"errors: "<< error<<"\n";
        }
        cout <<"\n";
    }
    else if(answer == '2')
    {
        cout<<"We listen PORT #"<<PORT<<"!\n";
        while (bf != '0')
        {
        recv (s_a, &bf, 1, 0);
        cout<<bf;
        error = WSAGetLastError();
        if(error != 0) cout <<"errors: "<< error<<"\n";
        }
        cout <<"\n";
    }
    else if(answer == '0')
    {
        closesocket(s_a);
        closesocket(sd);
        WSACleanup();
        return 0;
    }
    goto v;
 
 
    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
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
#include "stdafx.h"
#include <string.h>
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <winsock2.h>   
#pragma comment (lib, "ws2_32.lib")   
#define PORT 3985
 
     
 
  
 
using namespace System;
using namespace std;
 
int main(array<System::String ^> ^args)
{
    Console::WriteLine(L"CLIENT");
    
    WORD wVersion;       
    WSADATA wsaData;        
    wVersion = MAKEWORD (2, 0);   
    SOCKET sd;  
    int wsaInitError = WSAStartup (wVersion, &wsaData);    
    if (wsaInitError != 0)
    {
        cout<<"wsaInitError: "<<WSAGetLastError()<<"\n";
        _getch();
        exit (1);
    }
    else
    {    
        sd = socket (AF_INET, SOCK_STREAM, 0);
        if (sd < 0)
        {
            cout<<"socketInitError: "<<WSAGetLastError()<<"\n";
            _getch();
            exit (1);
        }
    }
 
    char answer;
    
    char ip[15];
    
 
    cout<<"Enter respondent IP: ";
    cin >> ip;
    const char * IP = ip;
 
    struct sockaddr_in addr;
    struct sockaddr_in dest;
    memset (&addr, 0, sizeof (struct sockaddr_in));
  
    addr.sin_family = AF_INET;
    addr.sin_port = htons (PORT);
    addr.sin_addr.s_addr = 0;//мой ip - 192.168.0.10
    dest.sin_family = AF_INET;
    dest.sin_port = htons (PORT);
    dest.sin_addr.s_addr = inet_addr (IP);
    int serror = connect (sd, (struct sockaddr *) &dest, sizeof (struct sockaddr_in));
    if (serror != 0)
    {
        cout<<"connectError: "<<WSAGetLastError()<<"\n";
        _getch();
        exit (1);
    }
    struct sockaddr_in addr1;
    addr1.sin_family = AF_INET;
    int size = sizeof (struct sockaddr_in);
    int error;
    char bf;
    char buf;
 
 v: cout<<"You want send or receive(1/2)? Or exit(0)?\n"<<endl;
    answer = _getch();
    if (answer == '1')
    {
        
        cout<<"We ready! Enter message: ";
        while (buf != '0')
        {
        buf = _getch();
        cout<<buf;
        send(sd, &buf, 1, 0);
        error = WSAGetLastError();
        if(error != 0) cout <<"errors: "<< error<<"\n";
        }
        cout <<"\n";
    
    }
    else if(answer == '2')
    {
        cout<<"We listen PORT #"<<PORT<<"!\n";
        while (bf != '0')
        {
        recv (sd, &bf, 1, 0);
        cout<<bf;
        error = WSAGetLastError();
        if(error != 0) cout <<"errors: "<< error<<"\n";
        }
        cout <<"\n";
    }
    else if(answer == '0')
    {
        closesocket(sd);
        WSACleanup();
        return 0;
    }
    goto v;
 
 
    return 0;
}
Проблема в том, что это не работает на двух компьютерах, которые не соединены локальной сетью.
На локале - пашет, а если пытаюсь присоединиться к компу не в локальной сети, то клиент ждет некоторое время, а потом error 10060(connection timed out, вроде).
В чем может быть проблема и как исправить?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.08.2012, 04:56
Ответы с готовыми решениями:

C++ сокеты ответ tcp сервере на syn
Доброго времени, суток. Вообще искал по нету и по форуму , не нашел ответ на свой вопрос. Или...

TCP сокеты в glibc
Пользуюсь сокетами, как со стороны клиентов, так и со стороны серверов, не могу понять вот чего:...

Unity и TCP сокеты
Добрый день, я не разбираюсь в сетях, хотел спросить у тех кто решал такие задачи или хотя бы знает...

Сокеты TCP и UDP
Здравствуйте. Есть задание: написать программу на любом из языков. Опытные товарищи подсказали, что...

26
86 / 86 / 6
Регистрация: 14.01.2011
Сообщений: 265
17.10.2012, 05:46 21
Author24 — интернет-сервис помощи студентам
Проверьте брандмауер windows! Либо отключите его, либо сделайте соответствующее исключение для вашей программы!
0
12 / 12 / 0
Регистрация: 25.06.2011
Сообщений: 165
22.01.2013, 05:17  [ТС] 22
Забросил на время эту тему, а теперь вернулся к ней. Если при подключении по LAN я забиндил локальный адрес(на сервере), то при подключении по WAN, нужно биндить WAN адрес, или что?
0
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
22.01.2013, 08:56 23
локальный. во всяком случае если это то что я думаю. на сервере bind вызывается для сетевой карты с которой вы хотите принимать пакеты. то что вы сидите за NAT адреса вашей сетевой карты не меняет.
0
228 / 50 / 7
Регистрация: 13.03.2012
Сообщений: 453
Записей в блоге: 7
25.01.2013, 17:16 24
Цитата Сообщение от doon Посмотреть сообщение
Если один обратится к другому через внешний IP, то это будет подключение по локальной сети или через Интернет?
сервер должен иметь торчащий в интернет адрес, тогда клиент сможет подключится к нему из локалки и из за всех железок. Но не наоборот. Сервер спрятанный в локалке, без внешнего адреса и без манипуляций с оборудованием просто так не достать
0
12 / 12 / 0
Регистрация: 25.06.2011
Сообщений: 165
01.06.2013, 03:01  [ТС] 25
Можете кинуть ссылку на open source, который без проблем использует асинхронные .net сокеты?
0
12 / 12 / 0
Регистрация: 25.06.2011
Сообщений: 165
15.06.2013, 19:02  [ТС] 26
Командой netstat -a убедился, что мой порт находиться в состоянии listening.
Далее проверил этим сервисом доступность порта, он оказался закрытым(несмотря на добавление в исключения фаервола, отключение фаервола и отключение антивируса).
Потом проверил порт скайпа этим же сервисом, и он тоже оказался закрытым (скайп работал).
Как с закрытым портом работает скайп?
И как открыть мой порт?
0
Модератор
3386 / 2158 / 352
Регистрация: 13.01.2012
Сообщений: 8,375
17.06.2013, 15:59 27
Цитата Сообщение от doon Посмотреть сообщение
Как с закрытым портом работает скайп?
скайп не является сервером на вашей машине - он подключился к порту на удаленной машине и общается с ней. как вариант пропихивает пакеты (см http://en.wikipedia.org/wiki/TCP_hole_punching)
Цитата Сообщение от doon Посмотреть сообщение
И как открыть мой порт?
вам уже написали. вы за NAT и не можете быть сервером без костылей
1
17.06.2013, 15:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.06.2013, 15:59
Помогаю со студенческими работами здесь

Правила NAT и сокеты (TCP)
Доброго вечера! При подключении к чему либо из за NAT, у роутера создаются временные правила...

TCP сокеты и потоки для клиентов
Как держать клиентов по TCP? Вот к примеру я получаю соединение в 1 потоке и передаю чтение в...

Сцена зависает при запуске TCP-клиента, когда он подключен к TCP - серверу, при этом TCP-клиент полностью функционирует
Проблема описана в заголовке, и хотелось бы услышать ваше мнение, о том как можно решить проблему....

Php сокеты и unix-сокеты
Здравствуйте, есть программа, написанная на С под Linux. При её работе в памяти хранятся несколько...


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

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