Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
2 / 2 / 0
Регистрация: 30.05.2012
Сообщений: 8
1

WinSock C#

11.02.2014, 23:22. Показов 3180. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
И так, привожу сразу проблему которую не могу решить. Есть у меня один код на UDP сервере для приема данных:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
IntPtr socket = WSA.WSA.Socket(WSA.WSA.SOCK_STREAM_UDP, WSA.WSA.PPROTO_UDP);
WSA.WSA.AdvBind("192.168.0.150", 8080, socket);
void recvClientUDP()
        {
            byte[] recvBuff = new byte[512];
            WSA.WSA.sockaddr SockAddrClient = new WSA.WSA.sockaddr();
            while (true)
            {
                int iResult;
                iResult = WSA.WSA.RecvFrom(socket, recvBuff, 512, 0, SockAddrClient, Marshal.SizeOf(SockAddrClient));
                if (iResult > 0)
                {
                    logStr += "\r\n--Client connected: " + SockAddrClient.sin_addr.ToString() + "--";
                }
                else if (iResult == 0 || iResult == -1)
                {
                    break;
                }
            }
        }
есть код на UDP клиенте для отправки данных:
C#
1
2
3
4
5
6
                IntPtr socket = WSA.WSA.Socket(WSA.WSA.SOCK_STREAM_UDP, WSA.WSA.PPROTO_UDP);
                WSA.WSA.sockaddr serverAddr = new WSA.WSA.sockaddr();
                serverAddr.sin_addr = WSA.WSA.inet_addr("192.168.0.150");
                serverAddr.sin_port = WSA.WSA.htons((short)8080);
                serverAddr.sin_family = 2;
                WSA.WSA.SendTo(socket, sendBuff, 512, WSA.WSA.SocketFlags.None, ref serverAddr, Marshal.SizeOf(serverAddr));
функции берутся из специально написанного модуля (*.dll), которые в свою очередь импортируются из ws2_32.dll, собственно:
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
public struct sockaddr
        {
            public short sin_family;
            public short sin_port;
            public int sin_addr;
            public long sin_zero;
        }
 
[DllImport("ws2_32.dll", SetLastError = true)]
        private static extern IntPtr socket(Int32 af, Int32 type, Int32 protocol);
 
[DllImport("ws2_32.dll")]
        private static extern int bind(IntPtr socket, ref sockaddr addr, int namelen);
 
[DllImport("ws2_32.dll", SetLastError = true)]
        private static extern int recvfrom(IntPtr socketHandle, byte[] pinnedBuffer, int len, SocketFlags socketFlags, sockaddr SockAdd, int Size);
 
[DllImport("ws2_32.dll", SetLastError = true)]
        private static extern int sendto(IntPtr socketHandle, byte[] pinnedBuffer, int len, SocketFlags socketFlags, ref sockaddr SockAdd, int Size);
 
[DllImport("ws2_32.dll")]
        public static extern short htons(int hostshort);
 
[DllImport("wsock32.dll")]
        public static extern int inet_addr(string cp);
 
public static int SendTo(IntPtr socketHandle, byte[] pinnedBuffer, int len, SocketFlags socketFlags, ref sockaddr SockAdd, int Size)
        {
            return sendto(socketHandle, pinnedBuffer, len, socketFlags, ref SockAdd, Size);
        }
 
        public static int RecvFrom(IntPtr socketHandle, byte[] pinnedBuffer, int len, SocketFlags socketFlags, sockaddr SockAdd, int Size)
        {
            return recvfrom(socketHandle, pinnedBuffer, len, socketFlags, SockAdd, Size);
        }
 
public static IntPtr Socket( int sock_stream, Int32 protocol)
        {
            return socket(AF_INET, sock_stream, protocol);
        }
 
public static int AdvBind(string ipAddress, int port, IntPtr socketHandle)
        {
            sockaddr remoteAddress; 
            int resultCode = -1; 
            int errorCode = 0;
 
            if (socketHandle != IntPtr.Zero)
            {
                    remoteAddress = new sockaddr();
                    remoteAddress.sin_family = AF_INET;
                    remoteAddress.sin_port = htons((short)port);
                    remoteAddress.sin_addr = inet_addr(ipAddress);
                    remoteAddress.sin_zero = 0;
 
                    if (remoteAddress.sin_addr != 0)
                    {
                        resultCode = bind(socketHandle, ref remoteAddress, Marshal.SizeOf(remoteAddress));
                        errorCode = WSAGetLastError();
                    }              
            }
            return resultCode;
        }
Так, вот, все собственно работает как надо, пакеты приходят как надо буфер заполняется, но проблема в том что при использовании RecvFrom должна также и заполняться структура SockAddrClient, возвращающая данные клиента, отправившего данное сообщение, а она не заполняется, в чем может быть проблема?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.02.2014, 23:22
Ответы с готовыми решениями:

Альтернатива winsock.dll
Доброе время суток, только начинаю знакомится с .Net, но уже успел получить первое задание, нужно...

WinSock
#include "winsock2.h" #define MAX_PACKET_SIZE 4096 WSADATA ws; hostent* hn; char buff ; if...

Winsock и C++
Есть сервер и клиент, в общем всё работает, но как сделать чтобы к серверу могло подключиться 100+...

VB 6 Winsock
1) Как с помощью WinSock в VB 6 отправить готовый пакет на определённый айпи? Вот собственно сам...

2
Yukikaze
11.02.2014, 23:28
  #2

Не по теме:

Я боюсь спрашивать, но почему C#? Если C# то почему WinSock, почему не родные шарповые сокеты?

0
2 / 2 / 0
Регистрация: 30.05.2012
Сообщений: 8
11.02.2014, 23:56  [ТС] 3
Цитата Сообщение от Yukikaze Посмотреть сообщение
Я боюсь спрашивать, но почему C#? Если C# то почему WinSock, почему не родные шарповые сокеты?
такое задание было, объязательное использование WSA
0
11.02.2014, 23:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.02.2014, 23:56
Помогаю со студенческими работами здесь

Winsock
Всем привет.Начал разбиратся с сокетами и сразуже появились проблемы отправки и получения...

WinSock
Имеется два приложения. Они связываются через winsock... но если отослать что-либо от одного...

WinSock на C++
Только начинаю осваивать WinSock написал простейшее приложение-сервер и приложение-клиент и че та...

Winsock
День добрый. Есть такой код: long CUDPInterface::OpenPort() { m_connection_state = false;...


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

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