Форум программистов, компьютерный форум, киберфорум
Наши страницы

С под Linux

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 5.00
syslinger
1 / 1 / 0
Регистрация: 03.07.2010
Сообщений: 17
#1

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

04.04.2011, 01:47. Просмотров 2409. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Сокеты, sendto() - не отсылается датаграмма (C Linux):

Не отсылается почта - PHP
Здравствуйте, есть вот такая функция: function sendMail() { $subject = &quot;Запрос&quot;; $message = getNames(); //return...

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

Письмо отсылается два раза - PHP
Написал скрипт, который отправляет эл.письма на адреса из списка. В списке около 3 000 адресов (это не спам, а база библиотечных...

Socket sendto - C++
Посылаю пакет используя sendto (UDP) Как определить что пакет успешно отправлен (с компа)? Проблема в том, что не выдается ошибок при...

Не отсылается почта после выполнения скрипта... - C# ASP.NET
Использую CDONTS. Скрипт выполняется, но сообщение остается на сервере в папке Queue. Очевидно, надо настроить SMTP-сервис в IIS? Помогите,...

Ошибка sendto() 10047 - C++
Ошибка 10047, как пофиксить ? Сокет в порядке , &amp;sockaddr тоже. void netSend(const char* data, SOCKADDR_IN* addr) { ...

2
accept
4832 / 3253 / 165
Регистрация: 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 / 0
Регистрация: 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
Привет! Вот еще темы с ответами:

Посылка файла через sendto(...) - C++
Через протокол UDP. Нужно открывать файл для чтения и указатель на него передавать в sendto?

При отправке письма вместо русских букв отсылается тупость - Python
Да да знаю я не первый кто задает этот вопрос, но я все перечитал и ничего не выходит можете помочб? #biblioteki import Tkinter from...

шлюзе с freeBSD ping: sendto: Operation not permitted - FreeBSD
Возможно у кого была похожая проблема: Есть сервер на freeBSD, который работает как шлюз в интернет для примерно 200 человек(сеть...

Редактирование меню windows xp sendto, низпадающий список в нем - Администрирование Windows
Чтобы мои пользователи через контекстное меню виндовое отправить sendto могли отправлять друг другу по пути обмен\название отдела\фио ...


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

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

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