Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.87/46: Рейтинг темы: голосов - 46, средняя оценка - 4.87
1 / 1 / 0
Регистрация: 08.08.2012
Сообщений: 21
1

Сокеты в Windows

27.10.2012, 17:24. Показов 9320. Ответов 1
Метки нет (Все метки)

Начал изучать сокеты по книге Й. Снейдера "Эфективное программирование TCP/IP". В конце 1 главы приводиться пример:
Простейший TCP-клиент

Немного начал перестраивать под Windows:
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
#include <winsock2.h>
#include <stdio.h>
 
#pragma comment ( lib, "ws2_32.lib" )
 
int main ( )
{
    SOCKADDR_IN peer;
    int s;
    int rc;
    char buf[1];
 
    peer.sin_family = AF_INET;
    peer.sin_port = htons ( 777 );
    peer.sin_addr.s_addr = inet_addr ( "127.0.0.1" );
 
    s = socket ( AF_INET, SOCK_STREAM, 0 );
    if ( s < 0 )
    {
        perror ( "Error: SOCKET" );
        system ( "pause" );
        exit ( 1 );
    }
 
    rc = connect ( s, ( SOCKADDR* ) &peer, sizeof ( peer ) );
    if ( rc )
    {
        perror ( "Error: CONNECT" );
        system ( "pause" );
        exit ( 1 );
    }
 
    rc = send ( s, "1", 1, 0 );
    if ( rc <= 0 )
    {
        perror ( "Error: SEND" );
        system ( "pause" );
        exit ( 1 );
    }
 
    rc = recv ( s, buf, 1, 0 );
    if ( rc <= 0 )
    {
        perror ( "Error: RECV" );
        system ( "pause" );
        exit ( 1 );
    }
    else
    {
        printf ( "%c\n", buf[ 0 ] );
    }
 
    return 0;
}


Добавил WSAsturtup
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
#include <winsock2.h>
#include <stdio.h>
 
#pragma comment ( lib, "ws2_32.lib" )
 
int main ( )
{
    SOCKADDR_IN peer;
    int s;
    int rc;
    char buf[1];
 
    const int iReqWinsockVer = 2;   
 
    WSADATA wsaData;
 
    WSAStartup ( MAKEWORD ( iReqWinsockVer, 0 ) , &wsaData );
 
    peer.sin_family = AF_INET;
    peer.sin_port = htons ( 777 );
    peer.sin_addr.s_addr = inet_addr ( "127.0.0.1" );
 
    s = socket ( AF_INET, SOCK_STREAM, 0 );
    if ( s < 0 )
    {
        perror ( "Error: SOCKET" );
        system ( "pause" );
        exit ( 1 );
    }
 
    rc = connect ( s, ( SOCKADDR* ) &peer, sizeof ( peer ) );
    if ( rc )
    {
        perror ( "Error: CONNECT" );
        system ( "pause" );
        exit ( 1 );
    }
 
    rc = send ( s, "1", 1, 0 );
    if ( rc <= 0 )
    {
        perror ( "Error: SEND" );
        system ( "pause" );
        exit ( 1 );
    }
 
    rc = recv ( s, buf, 1, 0 );
    if ( rc <= 0 )
    {
        perror ( "Error: RECV" );
        system ( "pause" );
        exit ( 1 );
    }
    else
    {
        printf ( "%c\n", buf[ 0 ] );
    }
    WSACleanup();
    return 0;
}


Но программа не конектится. В чем может быть проблема?

Windows 7, Microsoft Visual C++ 2010

Не по теме:

Если есть, то интересно было бы посмотреть на работающий TCP клиент на одном компьютере, который будет и сервером, и клиентом. Т.е. чтоб можна было протестировать функции и посмотреть как они работают

0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.10.2012, 17:24
Ответы с готовыми решениями:

Windows сокеты, ошибки в recvfrom
Проблема с сокетами: Посылаю строку с одного компьютера на другой, вот код: #include &quot;stdafx.h&quot;...

Сокеты в Windows 7
Доброго времени суток!:) Описываю проблему: прога работает в винде (sp 3 professional) работа с...

Асинхронные сокеты Windows
Здравствуйте, форумчане! Интересует вопрос как можно синхронно отправить сообщение через...

Потоковые сокеты на Windows Forms
Доброго времени всем! В общем задача такова, есть две консольные программы которые отлично...

1
0 / 0 / 0
Регистрация: 27.10.2012
Сообщений: 13
27.10.2012, 20:46 2
А куда оно должно коннектиться? Никто не ждёт никаких коннектов на 127.0.0.1:777
Создай ещё сокет, привяжи к интерфейсу который у тебя peer (через bind) и цепляйся.
Вот мой корявый код (сам только позавчера произвёл 1 коннект).
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
#include "stdafx.h"
//#pragma comment(lib, "wsock32.lib") без этой хрени не работает
#include <winsock2.h>
#include <windows.h>
#include <iostream>
#include <conio.h>
#include <stdio.h>
using namespace std;
#include "Liner.h"
#include <Socks.h>
 
int _tmain(int argc, _TCHAR* argv[])
{   
    WSADATA WSAData;
    int cPort = 55556;
    SOCKET s;
    WSAStartup(MAKEWORD(2,2),&WSAData);
    s = socket (AF_INET, SOCK_STREAM, 0);
    SOCKADDR_IN myip;
    myip.sin_family=AF_INET;
    myip.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    myip.sin_port=htons(cPort);
    Showaddrinfo(myip);
    SOCKADDR_IN serverip;
    serverip.sin_family=AF_INET;
    serverip.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    serverip.sin_port=htons(55555);
    while (connect(s, (SOCKADDR *)&serverip, sizeof(serverip))==SOCKET_ERROR)
    {
        cout<<"Connect error "<<GetLastError()<<"\n Try again? y/n";
        if (strcmp(getkstring(),"n\0")==0)
            return 0;
    }
    cout<<"Connected\n";
    char *bad;
    while (true)
    {
        
        bad=getkstring();
        if (strcmp(bad,"--")==0)
        {
            if(shutdown(s, SD_SEND)==SOCKET_ERROR)
            {
                switch (GetLastError())
                {
                    case WSAENOTCONN:
                        cout<<"Socket not connected: "<<GetLastError()<<endl; break;
                    case WSAENETDOWN:
                        cout<<"Network doesn't work properly: "<<GetLastError()<<endl; break;
                    default:
                        cout<<"Other shit: "<<GetLastError()<<endl; break;
                }
            }
            cout<<"Connection closed successful.\n";
            closesocket(s);
            _getch();
            return 0;
        }
        send(s,bad,32,0);
    }
    
    
    cout<<GetLastError();
    closesocket(s);
    getch();
 
        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
// sockets1.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <winsock2.h>
#include <windows.h>
#include <iostream>
#include <conio.h>
#include <stdio.h>
using namespace std;
 
#include <Socks.h>
 
DWORD WINAPI work(LPVOID Param)
{
    SOCKET clientshit=(SOCKET)Param;
    SOCKADDR_IN clientip;
    char bufbuf[32];
    int re,
        sizeaddr=sizeof(clientip);
    
 
    getpeername(clientshit, (SOCKADDR *)&clientip, &sizeaddr);
    while (true)
    {
        re=recv(clientshit,bufbuf,32,0);
        if (re==0)
        {cout<<"Client ("<<inet_ntoa(clientip.sin_addr)<<":"<<ntohs(clientip.sin_port)<<") disconnected.\n";
        break;}
        if (re==SOCKET_ERROR)
        {
            switch (GetLastError())
                {
                    case WSAECONNRESET:
                        cout<<"Connection Reset by "<<"IP: "<<inet_ntoa(clientip.sin_addr)<<":"<<ntohs(clientip.sin_port)<<endl;
                        break;
                    default:
                        cout<<"Idunno, lol: "<<GetLastError();
                        break;
                }
            break;
        }
        cout<<bufbuf<<endl;
        
    }
    closesocket(clientshit);
return (0);
}
 
int _tmain(int argc, _TCHAR* argv[])
{   
    WSADATA lpWSAData;
    DWORD dwThreadID;
    int cPort = 55555, size;
    SOCKET s;
    HANDLE hThread;
    SOCKADDR_IN clientip;
    SOCKET clientshit;
    
    if (WSAStartup(0x0202,&lpWSAData))
    { cout<<GetLastError()<<endl;
    cout<<"you suck\n";getch(); return 1;}
    
    s = socket (AF_INET, SOCK_STREAM, 0);
    SOCKADDR_IN myip;
    myip.sin_family=AF_INET;
    myip.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    myip.sin_port=htons(cPort);
    Showaddrinfo(myip);
    if (bind(s, (SOCKADDR *)&myip, sizeof(myip))==SOCKET_ERROR)
    {
        cout<<"Ok, you suck in bind";
        cout<<GetLastError();
        cout<<bind(s, (SOCKADDR *)&myip, sizeof(myip));
        getch();
        return 1;
    }
    size=sizeof(clientip);
    cout<<"Binded.\n";
    if(listen(s,1)==SOCKET_ERROR)
            {
                cout<<"you suck in listen\n";
                getch();
                return 1;
            }
 
    cout<<"Start to dance...\n";
 
    while (1)
    {
        clientshit=accept(s, (SOCKADDR *)&clientip, &size);
        cout<<"Hello\n";
        if (clientshit==INVALID_SOCKET)
        {
            cout<<"Shit with client. He's invalid socket";
        break;
        }
        cout<<"\nConnected one:\nIP: "<<inet_ntoa(clientip.sin_addr)<<"\nPort: "<<ntohs(clientip.sin_port)<<endl;
        hThread=CreateThread(NULL,0,work,(LPVOID)clientshit,0, &dwThreadID);
        if (hThread==NULL)
        {
        cout<<"Shit with making thread";
        break;      
        }
        CloseHandle(hThread);
    }
 
    closesocket(s);
    WSACleanup();
    
    getch();
        return 0;
}
Пара "головняков" в которые я забил функции.

C++
1
2
3
4
5
6
char* getkstring()
{
char line[320];
gets(line);
return line;
}
C++
1
2
3
4
5
6
7
int Showaddrinfo(SOCKADDR_IN arg1)
{
    cout<<"-------------------\n";
    cout<<"Family: "<<arg1.sin_family<<"\nIP: "<<inet_ntoa(arg1.sin_addr)<<"\nPort: "<<ntohs(arg1.sin_port)<<endl;
    cout<<"-------------------\n";
    return 0;
}
Клиент на сервер похож потому что я копировал начало. В клиенте myip нафиг не надо. Также необходимо либо через pragma подключить .lib, либо в свойствах проекта где-то в VS2010 есть поле для этого. Суть связки в том что на сервере просто отображается то что написал и отправил с клиента. Делал по книжке A Jones, Network programming for Microsoft Windows. Где-то нашёл в pdf, где не помню. Старая книжка, там выше 2000 винды нет. Для каких-то функций надо глянуть справку по VS, там что-то изменилось с тех пор.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.10.2012, 20:46

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Сокеты Windows отсылают данные параллельно?
Привет любителям Windows! :) Допустим, к серверной части моего софта приконнекшено 300 клиентов,...

Передача сообщения в Windows-Linux (сокеты)
Пытаюсь написать чат с передачей сообщения. Использую сокеты. Пока чат простейший - клиент и...

Сокеты в Windows Phone. Не происходит отправка данных
С Новым Годом всех и доброго времени суток! Помогите, пожалуйста! Возникла проблема с отправкой...

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


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

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

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