Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 18.04.2008
Сообщений: 3

Сетевые API

08.04.2009, 19:54. Показов 1584. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
всем привет. пытаюсь написать 2 программки. первая сервер- +,-,*,/ с комплексными числами, вторая клиент- отправка исходных данных и операции, получение результата.

по учебничку удалось написать только отправку и получение текста, вот немогу понять как передать оттельно несколько чисел, или же как при получении массива выбрать нужные числа ( массив в коде sendbuf)
VS 2005 (клиент-сервер роботают только на 1 компьютере , имя сервера 'localhost')
код программы сервер
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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
// server.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "conio.h"
#include "winsock2.h"
#include "ws2tcpip.h"
#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "27015"
#pragma comment(lib,"ws2_32.lib")
 
bool t=0;
int ch_bits(unsigned ch)
    {
        int sum=ch;
        while(ch)
            {
                ch=ch>>1;
                sum-=ch;
            }
        return sum;
    }
 
int str_bits(char * str)
    {
        int sum=0,len=(int)strlen(str);
        for (int i=0; i<len; i++)
            sum+=ch_bits(str[i]);
        return sum;
    }
 
 
 
DWORD CALLBACK Client(void *ClientSocket)
  {
    SOCKET Sock;
    Sock=((SOCKET *) ClientSocket)[0];
    int buflen = DEFAULT_BUFLEN;
    char buf[DEFAULT_BUFLEN];
    int res;
    while((res=recv(Sock,buf,buflen,0)) && res!=SOCKET_ERROR)
    {
        buf[res]=0;
        int a=buf[0];
        int b=buf[1];
        int x=a+b;
        if(str_bits(buf)%2==0)  {buf[res-1]=0;printf("Received: %s\n",x); send(Sock,buf,res,0);}
        else {printf("Error at receiving \n"); send(Sock,"#error",6,0);}
    }
 
    printf("Client disconnect\n");
    closesocket(Sock);
    return 0;
  }
 
 
DWORD CALLBACK Accept(void *ListenSocket)
  {
    SOCKET ListenSock,ClientSocket;
    ListenSock = ((SOCKET *) ListenSocket)[0];
    while((ClientSocket = accept(ListenSock,NULL,NULL))!=INVALID_SOCKET)
        {
            DWORD ID;
            CreateThread(0,0,Client,&ClientSocket,0,&ID);
        }   
    return 0;
  }
 
int main(void)
{
    WSADATA wsaData;
    SOCKET ListenSocket = INVALID_SOCKET, ClientSocket=INVALID_SOCKET;
    struct addrinfo *result=NULL,
                     hints;
 
    int iResult;
 
    iResult = WSAStartup(MAKEWORD(2,2),&wsaData);
    if(iResult!=NO_ERROR)
        {
            printf("Error at WSAStartup(): %d\n",iResult);
            return 1;
        }
    memset(&hints,0,sizeof(hints));
    hints.ai_family=AF_INET;
    hints.ai_socktype=SOCK_STREAM;
    hints.ai_protocol=IPPROTO_TCP;
    hints.ai_flags=AI_PASSIVE;
 
    iResult=getaddrinfo(NULL,DEFAULT_PORT,&hints,&result);
    if(iResult!=NO_ERROR)
        {
            printf("getaddrinfo() failed: %d\n",iResult);
            WSACleanup();
            return 1;
        }
    ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
    if(ListenSocket==INVALID_SOCKET)
        {
            printf("socket falied: %ld\n",WSAGetLastError());
            freeaddrinfo(result);
            WSACleanup();
            return 1;
        }
    
    iResult=bind(ListenSocket,result->ai_addr,(int)result->ai_addrlen);
    if(iResult==SOCKET_ERROR)
        {
            printf("bind failed: %d\n", WSAGetLastError());
            freeaddrinfo(result);
            closesocket(ListenSocket);
            WSACleanup();
            return 1;
        }
    freeaddrinfo(result);
 
    iResult=listen(ListenSocket,SOMAXCONN);
    if(iResult==SOCKET_ERROR)
        {
            printf("listen failed: %ld\n",WSAGetLastError());
            closesocket(ListenSocket);
            WSACleanup();
            return 1;
        }
 
    DWORD ID;
    CreateThread(0,0,Accept,&ListenSocket,0,&ID);
 
    char StrExit[4];
    do
    scanf("%4s",StrExit);
    while(strcmp(StrExit,"exit")); 
 
    closesocket(ListenSocket);
    WSACleanup();
    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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
// client.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include "conio.h"
#include "winsock2.h"
#include "ws2tcpip.h"
#include "stdlib.h"
#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "27015"
 
#pragma comment(lib,"ws2_32.lib")
 
int ch_bits(unsigned ch)
    {
        int sum=ch;
        while(ch)
            {
                ch=ch>>1;
                sum-=ch;
            }
        return sum;
    }
 
int str_bits(char * str)
    {
        int sum=0,len=(int)strlen(str);
        for (int i=0; i<len; i++)
            sum+=ch_bits(str[i]);
        return sum;
    }
 
 
 
int main(int argc, char **argv)
{
    WSADATA wsaData;
    SOCKET ConnectSocket=INVALID_SOCKET;
    struct addrinfo *result = NULL,
                    *ptr = NULL,
                    hints;
    char buf[DEFAULT_BUFLEN], sendbuf[DEFAULT_BUFLEN+1];
    int iResult, buflen=DEFAULT_BUFLEN+1;
    if(argc!=2)
        {
            printf("usage: %s server-name\n", argv[0]);
            return 1;
        }
    iResult = WSAStartup(MAKEWORD(2,2),&wsaData);
    if(iResult!=NO_ERROR)
        {
            printf("Error at WSAStartup(): %d\n", iResult);
            return 1;
        }
 
    memset(&hints,0,sizeof(hints));
    hints.ai_family = AF_UNSPEC;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
 
    iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result);
    if(iResult!=NO_ERROR)
        {
            printf("getaddrinfo() failed: %ld\n",WSAGetLastError());
            WSACleanup();
            return 1;
        }
 
    for(ptr=result;ptr!=NULL;ptr=ptr->ai_next)
        {
            ConnectSocket=socket(ptr->ai_family,ptr->ai_socktype,ptr->ai_protocol);
            if(ConnectSocket==INVALID_SOCKET)
                {
                    printf("Error at socket(): %ld\n", WSAGetLastError());
                    freeaddrinfo(result);
                    WSACleanup();
                    return 1;
                }
            iResult=connect(ConnectSocket,ptr->ai_addr,(int)ptr->ai_addrlen);
            if(iResult==SOCKET_ERROR)
                {
                    closesocket(ConnectSocket);
                    ConnectSocket=INVALID_SOCKET;
                    continue;
                }
            break;
        }
 
    if(ConnectSocket==INVALID_SOCKET)
                {
                    printf("Unable to connect to server. \n");
                    WSACleanup();
                    return 1;
                }
 
while(true)
    {
        printf("sending text: ");
        while(!strcmp(fgets(sendbuf, sizeof(sendbuf)-1, stdin),"\n")) {printf("sending text: ");}
        sendbuf[strlen(sendbuf)-1]=0; 
 
        if(!strcmp(sendbuf,"#exit"))
        {
            closesocket(ConnectSocket);
            WSACleanup();
            return 0;
        }
        if(sendbuf[strlen(sendbuf)-1]=='*')
                if(str_bits(sendbuf)%2==0) sendbuf[strlen(sendbuf)]='1';
                else sendbuf[strlen(sendbuf)]='0';      
        else
        if(str_bits(sendbuf)%2==0) sendbuf[strlen(sendbuf)]='0';
        else sendbuf[strlen(sendbuf)]='1';                      
        
        while(true)
        {
            if(send(ConnectSocket, sendbuf, (int)strlen(sendbuf),0)==SOCKET_ERROR)
                {
                    printf("send error %d\n",WSAGetLastError());
                    closesocket(ConnectSocket);
                    WSACleanup();
                    return 1;
                }
            memset(buf,0,buflen);
            if(recv(ConnectSocket,buf,buflen,0)==SOCKET_ERROR)
            {
                printf("recv error %d\n",WSAGetLastError());
                closesocket(ConnectSocket);
                WSACleanup();
                return 1;
            }
            if(!strcmp(buf,"#error"))
            {
                if(sendbuf[strlen(sendbuf)-2]=='*')
                    {
                        sendbuf[strlen(sendbuf)-2]=0;
                        if(str_bits(sendbuf)%2==0) sendbuf[strlen(sendbuf)]='0';
                        else sendbuf[strlen(sendbuf)]='1';  
                        sendbuf[strlen(sendbuf)-1]=0;
                    }   
 
                printf("Error at sending! repeat sending...\n"); 
                continue;
            }
            else {printf("Sent: %s //send next message\n",buf);break;}
        }
    }
 
    printf("recv error %d",WSAGetLastError());
    closesocket(ConnectSocket);
    WSACleanup();
    return 1;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.04.2009, 19:54
Ответы с готовыми решениями:

Сетевые API
Доброго времени суток! Помогите, пожалуйста, в решении вопроса: мне нужно знать, какие именно API используют сетевые сервисы в Windows...

"В системе вероятно отсутствуют сетевые карты или сетевые драйверы"
При переустановке windows 7 выскакивает ошибка &quot;в системе вероятно отсутствуют сетевые карты или сетевые драйверы&quot; Сначала на...

"В системе вероятно отсутствуют сетевые карты или сетевые драйверы"
Здравствуйте. При запуске Windows 7 появляется сначала окно с такой надписью: Woild you like to intialize network connectivity in the...

1
 Аватар для Deicider
98 / 54 / 3
Регистрация: 18.03.2009
Сообщений: 273
09.04.2009, 08:34
А в чем проблема-то? sendbuf это массив чисел, и интерпретировать их можно как угодно, в том числе и как текст, если массив разбирать по одному байту и приводить к типу char.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.04.2009, 08:34
Помогаю со студенческими работами здесь

Сетевые технологии windows 8 и сетевые технологии windows server 2012
Подскажите есть ли разница между: Сетевые технологии windows 8 и сетевые технологии windows server 2012? Или это одно и тоже?

Android SDK Manager не отображает платформы 2.3.3 (API 10), 2.3.1 (API 9). Как быть?
Добрый день! Использую Android Studio под Windows 7. Из-за несовместимости с операционной системой Android SDK Manager не отображает...

Steam API - как можно получить медиану цен через API?
Ребят, как можно получить медиану цен через API ? Интересует количество продаж за последний день. Инфу по предмету получаю таким...

Android Studio не дает работать с API 8 без установленного API 21
Удалил все не интересующие меня библиотеки и поставил только API Level 8. Но при создании приложения вылезает куча ошибок таких как: Что...

WIN API устарел как начать программировать на C++ .NET API (Без VisualStudio)
WIN API устарел как начать программировать на C++ .NET API (Без VisualStudio)


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru