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

Как написать библиотеку для работы с сокетами?

26.11.2012, 12:19. Показов 2571. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Я написал программу клиент-сервер,передающую некий буфер серверу. Теперь хочу сделать это все в виде DLL библиотеки,однако как то с трудом это дело идет.Проблема в том, что там все цепляется друг за друга, и вечно компилятор ругается что те или иные объекты не инициализированы,не найдены и т.д. Сама схема такая 1-ая функция: инициализировать библиотеку,открыть сокет,структуры разные. 2) Начать принимать сообщения. Подскажите как это дело написать в виде отдельных функций.Пример если можно
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.11.2012, 12:19
Ответы с готовыми решениями:

Посоветуйте библиотеку для работы с сетью
Собсно сабж. Boost.asio и Qt не предлагать. Хочу посмотреть еще варианты.

Подскажите библиотеку для работы с электронной почтой
Подскажите библиотеку для работы с електронной почтой. В частности удалением писем. ОС:Windows IDE: Eclipse CDT Compiler: MinGW32 ...

Разработать объектно-ориентированную библиотеку для работы со структурами данных
постановка задачи Разработать объектно-ориентированную библиотеку для работы со структурами данных по одной из следующих тем в...

4
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,457
26.11.2012, 13:08
а вы выберите функцию для примера только не слишком сложную которую хотите таким образом реализовать и мы нарисуем как это должно выглядеть, а иначе как догадаться, что там у вас? сферических коней в вакууме рисовать? тогда
Dynamic-Link Library: Теория + Практика
http://alphacity.netii.net/tree/friend.htm
0
3 / 3 / 1
Регистрация: 15.09.2011
Сообщений: 104
26.11.2012, 13:34  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
а вы выберите функцию для примера только не слишком сложную которую хотите таким образом реализовать и мы нарисуем как это должно выглядеть, а иначе как догадаться, что там у вас? сферических коней в вакууме рисовать? тогда
Dynamic-Link Library: Теория + Практика
http://alphacity.netii.net/tree/friend.htm
ок,вот пример.Я в H-файле описал сокет, и структуру, которые по замыслу должны передаваться. Вот код
C++
1
2
3
4
5
6
//H-файл
#include <winsock2.h> 
#include <windows.h>
SOCKET rtp;
//HOSTENT* hst;
unsigned int a=50000; //Порт
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
__declspec(dllexport) void InitServerRTP (unsigned int rtpport,LPVOID rtp)  //Входные параметры должны быть взяты из SDP,адрес,порт,указатель на буфер 
{
    WSADATA wsaData;
    //SOCKET rtp;
    SOCKADDR_IN local_addr;
    char buff[1024];
 
   
 
    // шаг 1 - подключение библиотеки 
    if(WSAStartup(MAKEWORD(2,2),&wsaData))      //При удаче 0
{
    printf("WSAStartup error: %d\n",
             WSAGetLastError());
      return -1;
}
 
    // шаг 2 - создание сокета
  // rtp=((SOCKET*)rtp)[0];
    rtp=socket(AF_INET,SOCK_DGRAM,0);
    if (rtp==INVALID_SOCKET)
    {
      printf("Socket() error: %d\n",WSAGetLastError());
      WSACleanup();
      return -1;
    }
 
    // шаг 3 - связывание сокета с локальным адресом 
   
    local_addr.sin_family=AF_INET;
    local_addr.sin_addr.s_addr=INADDR_ANY;
    local_addr.sin_port=htons(rtpport);
 
    if (bind(rtp,(SOCKADDR *) &local_addr,
        sizeof(local_addr)))
    {
      printf("bind error: %d\n",WSAGetLastError());
      closesocket(rtp);
      WSACleanup();
      return -1;
    }
 
}
 
 
__declspec(dllexport) void WaitingMes (LPVOID rtp)//адрес
{
HOSTENT *hst;
rtp=((SOCKET*)rtp)[0];
    // шаг 4 обработка пакетов, присланных клиентами
    while(1)
    {
      SOCKADDR_IN client_addr;
      int client_addr_size = sizeof(client_addr);
      
      int bsize=recvfrom(rtp,&buff[0],
        sizeof(buff)-1,0,
        (SOCKADDR *) &client_addr, &client_addr_size);
     
      
      printf("UDP DEMO echo-Server\n");
     
      if (bsize==SOCKET_ERROR)
      printf("recvfrom() error: %d\n",
             WSAGetLastError());
 
      // Определяем IP-адрес клиента и прочие атрибуты
     
      hst=gethostbyaddr((char *)
            &client_addr.sin_addr,4,AF_INET);
      printf("+%s [%s:%d] new DATAGRAM!\n",
      (hst)?hst->h_name:"Unknown host",
      inet_ntoa(client_addr.sin_addr),
      ntohs(client_addr.sin_port));
 
      // добавление завершающего нуля
      buff[bsize]=0;
 
      // Вывод на экран 
      printf("C=>S:%s\n",&buff[0]);
 
    
    }
    return 0;
  }
Вызов
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "stdafx.h"
#include "..\MyDll\MyDll.h"
#include "..\MyDll\DataSock.h"
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    
    //InitSockForServer();
    InitServerRTP(a,&rtp);
    WaitingMes(&rtp);
    getchar();
    return 0;
}
Все время получаю ошибку от ресивфром10038
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,457
26.11.2012, 16:29
1 Определять переменные в заголовочном файле плохо. Переменные должны определяться в модуле. В заголовочном файле должно быть объявление переменных со спецификатором extern. Однако в вашем случае это невозможно - модуль представляет собой DLL и доступ в него закрыт (во всяком случае при традиционном использовании DLL). Поэтому вам следует отказаться от выноса переменных за пределы своей программы - объявляйте и определяйте эти переменные в той точке своей программы где они используются и передавайте их функциям DLL в качестве параметров.
2 SOCKET = UINT_PTR = unsigned int. во всяком случае в BC++ 6.0. Почему он у вас LPVOID?
3 учитывая сказанное в результате операции ((SOCKET*)rtp)[0] будет получено вообще непонятно что.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
27.11.2012, 02:09
Может лучше писать статик-либ вместо dll, ну и открытый код соответственно ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.11.2012, 02:09
Помогаю со студенческими работами здесь

Разработать объектно-ориентированную библиотеку для работы со структурами данных
Постановка задачи: Разработать объектно-ориентированную библиотеку для работы со структурами данных по одной из следующих тем в...

[filesystem, cross-platform] посоветуйте библиотеку для работы с файловыми путями
Добрый день. нужно что-то цивилизованное, что отвечает требованиям: 1. (важно) что бы можно было собирать целевой продукт...

Как написать графическую библиотеку?
Есть много графических библиотек(MFC, VCL, WxWidgets). А как можно создать свою(хотя-бы примитивную)???:umnik:

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

Написать библиотеку функций для работы с однонаправленным линейным списком
помогите дописать программу задания 1. Написать библиотеку функций для работы с однонаправленным линейным списком, данные в котором...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru