Форум программистов, компьютерный форум, киберфорум
Наши страницы
С под Linux
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/14: Рейтинг темы: голосов - 14, средняя оценка - 4.50
syslinger
1 / 1 / 1
Регистрация: 03.07.2010
Сообщений: 17
1

Сокеты, sendto() - не отсылается датаграмма

04.04.2011, 01:47. Просмотров 2476. Ответов 2
Метки нет (Все метки)

Доброе время суток! Есть программа-сервер, которая отсылает введенную с клавиатуры строчку в программу-клиент, на мой взгляд написано все логично - однако системный вызов sendto() отказывается работать, все время возвращая отрицательное значение, не отсылая датаграмму, на момент запуска проги порт 51000 был всегда свободен. Буду очень благодарен за помощь.

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
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
 
int main(int argc, char *argv[])
 { 
  int socksrv;        // дескриптор сокета сервера
  int port=51000;   // номер порта на клиенте
  char sendline[1000];   //отсылаемая строка
  char loopaddr[]="127.0.0.1";
  struct sockaddr_in serv_addr, cli_addr;    //объявляем адресные структуры для сервера и клиента 
  
  //создаем структуру адреса сервера
  bzero(&serv_addr,sizeof(serv_addr));
  serv_addr.sin_family=AF_INET;
  serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);  //разрешаем отправку датаграмм с любого интерфейса
  serv_addr.sin_port=htons(0);      //просим систему выделить порт по ее усмотрению                         
  
  //заполняем структуру адреса клиента, т.е. указываем адрес назначения
  bzero(&cli_addr,sizeof(cli_addr));
  serv_addr.sin_family=AF_INET;
  serv_addr.sin_port=htons(51000);
  //заносим ip-адрес в поле структуры в сетвом порядке байт
  if (inet_aton(loopaddr, &cli_addr.sin_addr)==0)
  {
  printf("Invalid IP address\n");
  return 1;
  }  
 
  //создаем дескриптор сокета сервера
  socksrv=socket(PF_INET,SOCK_DGRAM,0);  
  // проверили корректность создания
  if (socksrv==-1)                     
  {
  printf("socket() error\n");
  return 1;
  }
 
  // выполняем привязку сокета к адресу и проверяем корректность создания 
  if (bind(socksrv,(struct sockaddr*) &serv_addr,sizeof(serv_addr))<0) 
  {
  printf("bind() error\n");
  return 1;
  }     
  //все, сокет сервера создан, сокет клиента клиента прописан
 
  printf("Set string: ");
  fgets(sendline,1000,stdin);
 
  //посылаем данные 
  
  if (sendto(socksrv,sendline, strlen(sendline)+1,0,(struct sockaddr *) &cli_addr,sizeof(cli_addr))<0)
  {
  printf("send error\n");
  close(socksrv);
  return 1;
  }
 
   return 1;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.04.2011, 01:47
Ответы с готовыми решениями:

Не отсылается почта
Здравствуйте, есть вот такая функция: function sendMail() { $subject =...

Не отсылается POST data
Есть следующий код, делающий POST-запрос. Не могу разобраться, почему ничего не...

Письмо отсылается два раза
Написал скрипт, который отправляет эл.письма на адреса из списка. В списке...

Sendto
Всем привет. Вобщем проблем следующий. есть поле SendTo, юзер которий...

Не отсылается почта после выполнения скрипта...
Использую CDONTS. Скрипт выполняется, но сообщение остается на сервере в папке...

2
accept
4833 / 3255 / 454
Регистрация: 10.12.2008
Сообщений: 10,569
04.04.2011, 02:16 2
Цитата Сообщение от syslinger Посмотреть сообщение
serv_addr.sin_port=htons(0); //просим систему выделить порт по ее усмотрению
а потом посылаем на int port=51000; // номер порта на клиенте

в клиенте нужно указывать порт сервера, на который посылается датаграмма
2
syslinger
1 / 1 / 1
Регистрация: 03.07.2010
Сообщений: 17
04.04.2011, 12:24  [ТС] 3
Ну да, точно, в куске кода
C
1
2
3
4
//заполняем структуру адреса клиента, т.е. указываем адрес назначения
  bzero(&cli_addr,sizeof(cli_addr));
  serv_addr.sin_family=AF_INET;
  serv_addr.sin_port=htons(51000);
вместо структуры serv_addr должна стоять структура cli_addr, а то получается что я отсылаю датаграмму опять же на сервер)) Спасибо!!!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2011, 12:24

Socket sendto
Посылаю пакет используя sendto (UDP) Как определить что пакет успешно...

Ошибка sendto() 10047
Ошибка 10047, как пофиксить ? Сокет в порядке , &amp;sockaddr тоже. void...

Вся почта отсылается через учётную запись админа
Здравствуйте уважаемые форумчане . Я только начинаю осваивать Lotus Domino 7...


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

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

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