Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Арсен_
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 27
#1

WinSock tcp client/server - C++

28.11.2012, 14:34. Просмотров 1319. Ответов 3
Метки нет (Все метки)

Может у кого то есть пример простой реализации client/server на winsock ? неважно на каком языке.

Мне надо что бы сервер отправлял сообщения клиенту и наоборот. Некаких лишних потоков ненадо, размеры сообщений не будут превышать 255(символов).

В сети я нашел какую то реализацию, но она как то некорректно работает.

Кликните здесь для просмотра всего текста

Пример решения квадратного уравнения, коэффициенты которго передаются через сокеты.

Сервер:
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
#include <iostream>
#include <sys/types.h>
#include <WinSock2.h>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <Mswsock.h>
 
//#pragma comment(lib,"wsock32")
 
char message[]="err\n";
 
int main()
{
    WSADATA wData;
    //WORD version_request;
    SOCKET sock,listener;
    
    int socket_name_size;
    int bytes_read;
 
    char buff[1024];
    struct sockaddr_in addr;
 
    if(WSAStartup(MAKEWORD(1,1),&wData)!=0)
    {
        std::cout<<"socket not initialized\n";
        return 1;
    }
    std::cout<<"socket initialized\n";
 
    listener=socket(AF_INET,SOCK_STREAM,NULL);  //create socket
    std::cout<<"socket created\n";
 
    addr.sin_family=AF_INET;
    addr.sin_port=htons(3000);  //number port
    addr.sin_addr.s_addr=htonl(INADDR_ANY);
    socket_name_size=sizeof(addr);
    
    if(bind(listener,(struct sockaddr *)&addr,socket_name_size)<0)  //binding
    {
        std::cout<<"socket not binding\n";
        return 1;
    }
    std::cout<<"socket bind\n";
 
    listen(listener,1);
    std::cout<<"set listen\n";
 
    int *a=new int[2];
    char buffer1[15],buffer2[15];
    float answer1;
    float answer2;
 
 
    int error;
    while(true)
    {
        sock=accept(listener,NULL,NULL);
        if(sock<0)
        {
            std::cout<<"accept error\n";
            error=WSAGetLastError();
            std::cout<<error<<"\n";
            _getch();
            return 1;
        }
    
    for(int i=0;i<3;i++)
    {
        bytes_read=recv(sock,buff,10,0);
        if(bytes_read<0)
        {
            break;
        }
        std::cout<<buff<<"\n";
        a[i]=atoi(buff);
        std::cout<<"in number view "<<a[i]<<"\n";
    }   
 
    if(a[1]*a[1]-4*a[0]*a[2]>=0)
    {
    answer1=(-a[1]+sqrt(a[1]*a[1]-4.0*a[0]*a[2]))/(2*a[0]);
    answer2=(-a[1]-sqrt(a[1]*a[1]-4.0*a[0]*a[2]))/(2*a[0]);
    }
 
    if(a[1]*a[1]-4*a[0]*a[2]<0)
    {
        send(sock,message,sizeof(message),0);
        send(sock,message,sizeof(message),0);
        //break;
    }
 
 
    _gcvt(answer1,10,buffer1);
    _gcvt(answer2,10,buffer2);
    
    send(sock,buffer1,sizeof(buffer1),0);
    send(sock,buffer2,sizeof(buffer2),0);
 
    }
 
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
#include <iostream>
#include <sys/types.h>
#include <winsock2.h>
#include <memory.h>
#include <conio.h>
 
 
int main()
{
    WSADATA wData;
    struct sockaddr_in addr,serv_addr;
    SOCKET sock;
    if(WSAStartup(MAKEWORD(1,1),&wData)!=0)
    {
        std::cout<<"socket not initialized\n";
    }
    std::cout<<"socket initialized\n";
 
    sock=socket(AF_INET,SOCK_STREAM,0);
    if(sock==-1)
    {
        std::cout<<"socket not created\n";
    }
    
    addr.sin_family=AF_INET;
    addr.sin_port=htons(3000);
    addr.sin_addr.s_addr=htonl(INADDR_LOOPBACK);
    bind(sock,(struct sockaddr *)&addr,sizeof(addr));
 
    char HostName[1024];
    DWORD HostIP = 0;
    LPHOSTENT lphost;   
    gethostname(HostName, 1024);
    lphost=gethostbyname(HostName);
    serv_addr.sin_family=AF_INET;
    memcpy((char*)&serv_addr.sin_addr,lphost->h_addr,lphost->h_length);
    serv_addr.sin_port=htons(3000);
 
    int error;
    if(connect(sock,(struct sockaddr *)&serv_addr,sizeof(serv_addr))<0)
    {
        std::cout<<"connect error\n";
        error=WSAGetLastError();
        std::cout<<error<<"\n";
        _getch();
        return 1;
    }
    std::cout<<"connect success\n";
 
 
char message1[10];
char message2[10];
char message3[10];
 
char buff[15];
 
std::cout<<"insert value\n";
std::cin>>message1;
std::cin>>message2;
std::cin>>message3;
 
    send(sock,message1,sizeof(message1),0);
    send(sock,message2,sizeof(message2),0);
    send(sock,message3,sizeof(message3),0);
 
    recv(sock,buff,sizeof(buff),0); //3 param -sizeof accepted data
    std::cout<<"answer "<<buff<<"\n";
    recv(sock,buff,sizeof(buff),0);
    std::cout<<"answer "<<buff<<"\n";
    getch();
 
    shutdown(sock,2);
    closesocket(sock);
    WSACleanup();
    return 0;
 
}
В этом коде даже не передается IP сервера... Или может я не правльно понял?


PS поиском я пользовался, только в тех реализациях много лишнего.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2012, 14:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос WinSock tcp client/server (C++):

Соединение tcp client и tcp server - C++
accept(); bind(); connect(); listen(); socket(); Нужно расположить их в порядке в каком их вызывает (А) сервер (Б) клиент, чтобы...

Client-Server C++ Win32 NTW 2013 - C++
Прошу помощи! Недавно работаю в С++ , и не очень в нем ориентируюсь. помогите пожалуйста , я уже не могу просто понять почему идет ошибка...

Client-Server C++ Win32 NTW 2013 ERROR - C++
Помогите пожалуйста. С++ новичок , не очень ориентируюсь . по сути 3-задание С++ только делаю. Делаю задание &quot;клиент - сервер&quot;....

winsock. ip - C++
Как с помощью winsock или winsock2 (без разницы) узнать ip адрес текущего компьютера? Или как сделать так, что бы в клиенте вписать вручную...

Модификатор FAR (WinSock) - C++
Что означает модификатор FAR в некоторых функциях/структурах WinSock? Допустим typedef struct hostent { char FAR * h_name; ...

Winsock C++ клиент - сервер - C++
#include &lt;winsock2.h&gt; // сервер #include &lt;iostream&gt; using namespace std; int main(){ // инициализация winsock WSADATA...

3
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,579
28.11.2012, 15:00 #2
Прием пакетов по UDP

Добавлено через 31 секунду
там пост про "как бы аську"
1
Арсен_
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 27
28.11.2012, 16:31  [ТС] #3
спасибо, только не больше не знает обычную отправку сообщение от клиента к ерверу и обратно по tcp.
???
0
vxg
Модератор
3169 / 1972 / 221
Регистрация: 13.01.2012
Сообщений: 7,579
28.11.2012, 16:56 #4
Цитата Сообщение от Арсен_ Посмотреть сообщение
только не больше не знает обычную отправку сообщение от клиента к ерверу и обратно по tcp
ничего не понял. по ссылке UDP-реализация. для TCP указывать SOCK_STREAM и IPPROTO_TCP, в клиент - добавить connect, в сервер - добавить accept, использовать recv/send вместо recvfrom/sendto.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2012, 16:56
Привет! Вот еще темы с ответами:

Torrent client - C++
Вот и всё! как можно организовать???

UDP Client - C++
Привет всем! У меня тут такой вопрос возник: можно ли создать UDP Client к уже существующему серверу UDP пример: вот UDP...

Клиент на WinSock и ошибка LNK1120 - C++
Добрый день. Вчера я обращался к форумчанам за помощью в сборке сервера. Теперь пытаюсь собрать клиент по примеру всё того же самоучителя...

Winsock - UDP вместо ТСР - C++
В /cpp-networks/ довольно грустно и пустынно, так что боюсь вынужден скопировать тему сюда.Ссылка на старую тему для модератора:...


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

Или воспользуйтесь поиском по форуму:
4
Yandex
Объявления
28.11.2012, 16:56
Ответ Создать тему
Опции темы

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