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

Windows сокеты, ошибки в recvfrom

30.06.2012, 01:14. Просмотров 5690. Ответов 5
Метки нет (Все метки)

Проблема с сокетами:
Посылаю строку с одного компьютера на другой, вот код:
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
#include "stdafx.h"
#include <string.h>
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <winsock2.h>   
#pragma comment (lib, "ws2_32.lib")   
#define PORT 5000
 
     
 
  
 
using namespace System;
using namespace std;
 
int main(array<System::String ^> ^args)
{
    Console::WriteLine(L"Initialize...");
    
    WORD wVersion;       
    WSADATA wsaData;        
    wVersion = MAKEWORD (2, 0);   
    SOCKET sd;  
    int wsaInitError = WSAStartup (wVersion, &wsaData);    
    if (wsaInitError != 0)
    {
        exit (1);
    }
    else
    {    
        sd = socket (PF_INET, SOCK_DGRAM, 0);
    }
 
    int answer;
    
    char ip[15];
    
 
    cout<<"Enter respondent IP: ";
    cin >> ip;
    const char * IP = ip;
 
    struct sockaddr_in addr;
    memset (&addr, 0, sizeof (struct sockaddr_in));
  
    addr.sin_family = AF_INET;
    addr.sin_port = htons (PORT);
    addr.sin_addr.s_addr = inet_addr (IP);
    int serror = bind (sd, (struct sockaddr *) &addr, sizeof (struct sockaddr_in));
    struct sockaddr_in addr1;
    addr1.sin_family = AF_INET;
    int size = sizeof (struct sockaddr_in);
    int error;
    char * bf = new char[5];
    char buf[5];
    int send = 0;
    int receiver = 0;
 
 v: cout<<"You want send or receive(1/2)?\n";
    cin >> answer;
    if (answer == 1)
    {
        
        cout<<"We ready! Enter message: ";
        cin >> buf;
        cout<<"\n";
        send = sendto (sd, buf, 5, 0, (struct sockaddr *) &addr, size);
        error = WSAGetLastError();
        cout <<"errors: "<< error<<"\n";
    
    
    
    }
    else if(answer == 2)
    {
        cout<<"We listen PORT #5000!\n";
        receiver = recvfrom (sd, bf, 5, 0, (struct sockaddr *) &addr1, &size);
        error = WSAGetLastError();
        cout <<"addr1.sin_addr: "<<inet_ntoa(addr1.sin_addr)<<"\naddr1.sin_family: "<<addr1.sin_family;
        cout <<"NEW MASSAGE: " << bf <<"\n";
 
    }
    goto v;
 
    
    
    return 0;
}
Когда вбиваю 127.0.0.1 и свой IP все пашет (проверяю на том же компьютере), но когда ввожу IP второго компьютера функция recvfrom дает 10022 ошибку, а в буфере бред, или программа зависает на этой же функции (We listen PORT #5000! и все), успешные передачи были, но с частотой 1 успешная на 50 не успешных. Sendto идет без ошибок.
Что делать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.06.2012, 01:14
Ответы с готовыми решениями:

Таймер ожидания для recvfrom (сокеты, UDP)
Как установить таймер ожидания для функции recvfrom?

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

Сокеты в Windows
Начал изучать сокеты по книге Й. Снейдера &quot;Эфективное программирование TCP/IP&quot;. В конце 1 главы...

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

__________________

Записывайтесь на профессиональные курсы C++ разработчиков
5
166 / 164 / 27
Регистрация: 20.04.2010
Сообщений: 607
30.06.2012, 01:34 2
поправь на socket (AF_INET, SOCK_DGRAM, 0);
и вторая стрруктура sockaddr_in не заполнена. вот видимо и не понимает откуда читать.
0
48 / 47 / 7
Регистрация: 19.06.2012
Сообщений: 134
30.06.2012, 01:37 3
http://msdn.microsoft.com/en-u... 85%29.aspx

WSAEINVAL:
The socket has not been bound with bind, or an unknown flag was specified, or MSG_OOB was specified for a socket with SO_OOBINLINE enabled, or (for byte stream-style sockets only) len was zero or negative.
0
12 / 12 / 0
Регистрация: 25.06.2011
Сообщений: 165
30.06.2012, 01:53  [ТС] 4
Цитата Сообщение от Aneron Посмотреть сообщение
поправь на socket (AF_INET, SOCK_DGRAM, 0);
Поправил, тестирую...

Цитата Сообщение от Aneron Посмотреть сообщение
и вторая стрруктура sockaddr_in не заполнена. вот видимо и не понимает откуда читать.
Вроде и не надо, вот пруф:
http://www.gamedev.ru/code/art... 260&page=2

Добавлено через 1 минуту
Цитата Сообщение от programm1r Посмотреть сообщение
http://msdn.microsoft.com/en-u... 85%29.aspx

WSAEINVAL:
The socket has not been bound with bind, or an unknown flag was specified, or MSG_OOB was specified for a socket with SO_OOBINLINE enabled, or (for byte stream-style sockets only) len was zero or negative.
Вроде забиндил, остальное не подходит

Добавлено через 7 минут
Цитата Сообщение от Aneron Посмотреть сообщение
поправь на socket (AF_INET, SOCK_DGRAM, 0);
Не помогло.
+ Когда перевожу в receive с левых ip приходит строка:"N"... мистика
0
166 / 164 / 27
Регистрация: 20.04.2010
Сообщений: 607
30.06.2012, 10:55 5
возьми самые банальные recv и send.
и нечего мудрить.
http://citforum.ru/book/cook/winsock.shtml
0
12 / 12 / 0
Регистрация: 25.06.2011
Сообщений: 165
21.07.2012, 01:09  [ТС] 6
Нашел ошибку:
C++
1
2
3
4
5
6
7
struct sockaddr_in addr;
memset (&addr, 0, sizeof (struct sockaddr_in));
  
    addr.sin_family = AF_INET;
    addr.sin_port = htons (PORT);
    addr.sin_addr.s_addr = inet_addr (IP);
    int serror = bind (sd, (struct sockaddr *) &addr, sizeof (struct sockaddr_in));
Здесь нужно забиндить локальный адрес, а я биндил IP принимающего.
Вот как нужно:
C++
1
2
3
4
5
6
7
struct sockaddr_in addr;
memset (&addr, 0, sizeof (struct sockaddr_in));
  
    addr.sin_family = AF_INET;
    addr.sin_port = htons (PORT);
    addr.sin_addr.s_addr = inet_addr ("127.0.0.1");
    int serror = bind (sd, (struct sockaddr *) &addr, sizeof (struct sockaddr_in));
Эта проблема решена:
Цитата Сообщение от doon Посмотреть сообщение
Когда перевожу в receive с левых ip приходит строка:"N"... мистика
Единственная проблема - программа ничего не принимает, когда находится в receive(We listen PORT #5000! и все).
В чем может быть проблема?

Добавлено через 6 часов 20 минут
ВСЕ ВЫШЛО! И самое приятное то, что сам разобрался.
C++
1
2
3
4
5
6
7
struct sockaddr_in addr;
memset (&addr, 0, sizeof (struct sockaddr_in));
  
    addr.sin_family = AF_INET;
    addr.sin_port = htons (PORT);
    addr.sin_addr.s_addr = 0;
    int serror = bind (sd, (struct sockaddr *) &addr, sizeof (struct sockaddr_in));
Если в параметр sin_addr.s_addr структуры sockaddr_in передать 0, то компьютер принимает подключения на все IP-адреса
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.07.2012, 01:09

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

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

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

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

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


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

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

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