The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"Помогите с socket programming"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"Помогите с socket programming"
Сообщение от kzu emailИскать по авторуВ закладки on 17-Авг-02, 00:03  (MSK)
Драсьте,
Я недавно занялся сокетным программированием по Линух на Ц++.
Попытался написать скрипт для посылки команды на сервер и получения ответа от него. Вот что я смог:

#######################################################################

#include<sys/types.h>
#include</usr/include/sys/socket.h>
#include<iostream>
#include<netinet/in.h>
#include <cstdlib>
#include<arpa/inet.h>
#include<stdio.h>
#include<string.h>

void main(int argc, char *argv[]){

char mes [ 200 ], *mes2;
int sock = socket ( AF_INET, SOCK_STREAM, 0 );
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr ( "127.0.0.1" );
addr.sin_port = htons ( 25 );

if (  (connect ( sock, ( struct sockaddr* )&addr, sizeof ( struct sockaddr ))) == -1 ){
perror ( "connect" );
}
recv ( sock, mes, 200, 0 );
cout << mes;

while ( mes2 != -1 ({
cin >> mes2;
if ( mes2 == -1 ){
break;
}

if ( (send ( sock, mes2, strlen ( mes2 ), 0 )) == -1 ){
perror ( "send" );
}

if ( (recv ( sock, mes, 200, 0 )) == -1 ){
perror ( "recv" );
}
cout << mes;
}

}

#########################################################################

Помогите, пожалуйста с отладкой. Дело в том, что после первого send()
скрипт как бы подвисает и не хочет получать ответы от сервера.
Подскажите в чем моя ошибка или, если вопрос слишком глуп направьте на форум для новичков.
Заранее благодарен,
kzu.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "RE: Помогите с socket programming"
Сообщение от Soldier Искать по авторуВ закладки on 18-Авг-02, 09:24  (MSK)
>Драсьте,
>Я недавно занялся сокетным программированием по Линух на Ц++.
>Попытался написать скрипт для посылки команды на сервер и получения ответа от
>него. Вот что я смог:
>

char *mes2;
.........
while ( mes2 != -1 ({
cin >> mes2;
if ( mes2 == -1 ){
  break;
}
...
^^^^^ Это что за экстрим такой? Надо либо, например, mes2[1025], либо использовать malloc для mes2. Повезло вам, если программа еще не "обрадовала" вас SIGSEGV.

Теперь по делу - вы используете 25 порт, т.е. SMTP. В этом случае сервер ожидает символ LineFeed (ASCII код 10) в конце строки. cin, в отличие от fgets, этот символ отбрасывает. В итоге сервер ждет 10, но естественно никогда  не дождется. Поэтому надо либо использовать fgets, либо вставлять символ с кодом 10 в конец строки полученной через cin:

...
int l;
...
cin >> mes2;
...
l=strlen(mes2); mes2[l]=10; mes2[l+1]=0;

Кроме того

> recv ( sock, mes, 200, 0 );
> cout << mes;
безопаснее
l=recv(sock,mes,sizeof(mes)-1,0);
mes[l]=0;

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "RE: Помогите с socket programming"
Сообщение от Аноним emailИскать по авторуВ закладки on 18-Авг-02, 11:43  (MSK)
>>Драсьте,
>>Я недавно занялся сокетным программированием по Линух на Ц++.
>>Попытался написать скрипт для посылки команды на сервер и получения ответа от
>>него. Вот что я смог:
>>
>
>char *mes2;
>.........
>while ( mes2 != -1 ({
> cin >> mes2;
> if ( mes2 == -1 ){
>  break;
> }

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

>...
>^^^^^ Это что за экстрим такой? Надо либо, например, mes2[1025], либо использовать
>malloc для mes2. Повезло вам, если программа еще не "обрадовала" вас
>SIGSEGV.
>
>Теперь по делу - вы используете 25 порт, т.е. SMTP. В этом
>случае сервер ожидает символ LineFeed (ASCII код 10) в конце строки.
>cin, в отличие от fgets, этот символ отбрасывает. В итоге сервер
>ждет 10, но естественно никогда  не дождется. Поэтому надо либо
>использовать fgets, либо вставлять символ с кодом 10 в конец строки
>полученной через cin:

Пожалуйста, перечитывайте свои рекомендации непосредственно перед
отправкой. Soldier! подумайте сами, какое серверу дело, есть у клиента
fgets, или нет.

>

to kzu: а что, по Вашему мнению, должно было произойти?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "RE: Помогите с socket programming"
Сообщение от Soldier Искать по авторуВ закладки on 18-Авг-02, 13:08  (MSK)
>>>Драсьте,
>>>Я недавно занялся сокетным программированием по Линух на Ц++.
>>>Попытался написать скрипт для посылки команды на сервер и получения ответа от
>>>него. Вот что я смог:
>>>
>>
>>char *mes2;
>>.........
>>while ( mes2 != -1 ({
>> cin >> mes2;
>> if ( mes2 == -1 ){
>>  break;
>> }
>
>Пожалуйста, примите за правило не выставлять код с синтаксическими
>ошибками.
>
>>...
>>^^^^^ Это что за экстрим такой? Надо либо, например, mes2[1025], либо использовать
>>malloc для mes2. Повезло вам, если программа еще не "обрадовала" вас
>>SIGSEGV.
>>
>>Теперь по делу - вы используете 25 порт, т.е. SMTP. В этом
>>случае сервер ожидает символ LineFeed (ASCII код 10) в конце строки.
>>cin, в отличие от fgets, этот символ отбрасывает. В итоге сервер
>>ждет 10, но естественно никогда  не дождется. Поэтому надо либо
>>использовать fgets, либо вставлять символ с кодом 10 в конец строки
>>полученной через cin:
>
>Пожалуйста, перечитывайте свои рекомендации непосредственно перед
>отправкой. Soldier! подумайте сами, какое серверу дело, есть у клиента
>fgets, или нет.
>
>>
>
>to kzu: а что, по Вашему мнению, должно было произойти?

Нда... Для тех кто в танке, объясняю еще раз:

cin >> msg2

Допустим вы набрали quit, затем ENTER. msg2 будет содержать ровно 4 символа - q,u,i,t , которые затем передаются серверу. Но сервер в данном случае будет ожидать символа LF или CR как окончание запроса (потому как smtp) Поскольку передаваемая строка не содержит данные символы, сервер будет их ждать пока не вывалиться по таймауту.
Теперь
  fgets(msg2,sizeof(msg2)-1,stdin)

При тех же условиях, msg2 будет содержать 5 символов - 'q','u','i','t' и 10. Теперь передаваемая строка содержит необходимый символ 10 и ... короче сервер будет счастлив и все у нас получиться.

ТАКИМ ОБРАЗОМ ИЗ МОЕГО ПОСТИНГА СЛЕДОВАЛО ЧТО СЕРВЕРУ ЕСТЬ ДЕЛО ДО СИМВОЛА С КОДОМ 10 В КОНЦЕ СТРОКИ, А НЕ ДО ТОГО ЧЕМ ПОЛЬЗУЕТСЯ КЛИЕНТ - fgets-ом ИЛИ cin-ом И БЫЛИ ДАНЫ РЕКОМЕНДАЦИИ КАК ДАННЫЙ СИМВОЛ ВОТКНУТЬ В КОНЕЦ СТРОКИ.

А с точки зрения синтаксиса там почти все правильно, за исключением
  msg2=-1
ибо pointer и integer без приведения типов

Best


  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "RE: Помогите с socket programming"
Сообщение от kzu emailИскать по авторуВ закладки on 18-Авг-02, 23:37  (MSK)
С помощью подсказок я исправил скрипт. Вот что у меня получилось:
.................
while ( mes2 != "-1"){
mes2 = fgets( mes2, strlen (mes2)-1, stdin);

send ( sock, mes2, strlen ( mes2 ), 0 );
perror ( "send" );


l=recv(sock,mes,sizeof(mes)-1,0);
perror ( "recv" );
mes[l]=0;
cout << mes;
}
.................

К сожалению сервер всё равно не хочет отвечать.
Я пробовал использовать добавление символов к cin, но это тоже не дало результата. Сервер не отвечает даже на: HELO Kuz@takas.lt
Если я вам ещё не надоел, то пожалуйста помогите мне встать па путь истинный.
Благодарю за ответы и жду помощи,
kuz.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "RE: Помогите с socket programming"
Сообщение от Soldier Искать по авторуВ закладки on 19-Авг-02, 07:17  (MSK)
>К сожалению сервер всё равно не хочет отвечать.
>Я пробовал использовать добавление символов к cin, но это тоже не дало
>результата. Сервер не отвечает даже на: HELO Kuz@takas.lt
>Если я вам ещё не надоел, то пожалуйста помогите мне встать па
>путь истинный.
>Благодарю за ответы и жду помощи,
>kuz.

Странно. Ниже приведенный код (за основу взят ваш) у меня нормально работает. Проверьте через telnet все ли  в порядке - telnet 127.0.0.1 25 И еще одно. В таких программах лучше  использовать select (man select) для определения есть ли данные для чтения, а уж потом вызывать recv, read и т.д.

#include<sys/types.h>
#include</usr/include/sys/socket.h>
#include<iostream>
#include<netinet/in.h>
#include <cstdlib>
#include<arpa/inet.h>
#include<stdio.h>
#include<string.h>

void main(int argc, char *argv[]){

char mes[1025];
int l;
int sock = socket ( AF_INET, SOCK_STREAM, 0 );
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr ( "127.0.0.1" );
addr.sin_port = htons ( 25 );


if (  (connect ( sock, ( struct sockaddr* )&addr, sizeof ( struct sockaddr ))) == -1) {
perror ( "connect" );
}


l=recv ( sock, mes, sizeof(mes)-1, 0 );
mes[l]=0;
cout << mes;

*mes=0; mes[sizeof(mes)-1]=0;
while ( *mes!='\n' ) {
  fgets(mes,sizeof(mes)-1,stdin);
  send( sock, mes, strlen ( mes), 0 );
  if ( (l=recv ( sock, mes, sizeof(mes)-1, 0 ))<=0) break;
  mes[l]=0;
  cout << mes;
}

}

  Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "RE: Помогите с socket programming"
Сообщение от kzu emailИскать по авторуВ закладки on 19-Авг-02, 21:22  (MSK)
Soldier:

Большое спасибо за ответы. Заработало.
Но только на локальном SMTP, а сервер: mail.takas.lt ( где мой почтовый ящик ), всё ещё ждёт чего-то. Будем разбираться.

Всем спасибо,
kuz.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "RE: Помогите с socket programming"
Сообщение от J Искать по авторуВ закладки on 20-Авг-02, 15:34  (MSK)
>Soldier:
>
>Большое спасибо за ответы. Заработало.
>Но только на локальном SMTP, а сервер: mail.takas.lt ( где мой почтовый
>ящик ), всё ещё ждёт чего-то. Будем разбираться.
>
>Всем спасибо,
>kuz.

ну так можно попробовать зайти на него телнетом на 25 порт и попробовать воспроизвести все, что вы пытаетесь отправить ему из программы
может, там авторизация какая?


  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру