Ник:
Пароль:

Контакты

E-mail: info@starterkit.ru
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
Телеграм: t.me/starterkit_ru

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:4
Поисковых ботовПоисковых ботов:3
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:8
Форум » starterkit.ru » Старый форум » SK-MAT91SAM9XE512
Сервер/клиент TCP
Ton (Guest)
Добавлено 30.11.1999 00:00 Редактировалось 11.04.2009 12:36
0
Сообщение: 1
Ton (Guest)

Topic opened
Спуститься к концу Подняться к началу
Ton (Guest)
Добавлено 10.04.2009 10:34 Редактировалось 10.04.2009 10:34 Сообщение: 2
Ton (Guest)

Проблема в следующем. Написал простейший TCP сервер и клиент. Запускаю на Win, соединение устанавливается. Отсылается строка типа char* с клиента и принимается на сервере. Все нормально работает. Переношу сервер на плату. Запускаю, все работает. Но при попытке отослать строку с Win на плату, она не приходит. То есть сервер реагирует, говорит что что-то соединилось, срабатывает функция accept(), но сами данные не приходят. Может быть проблема в типе передаваемых данных... непойму. Сервер висит на 192.168.0.1 Помогите кто может. Спасибо.

server.cpp:
Код

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
//16820416 = inet_addr(192.168.0.1)
//16777343 = inet_addr(127.0.0.1)
int main ()
{
printf("SERVER TCP
");
int ss,bb,ll,aa,rr;
int size;
char *buf;
sockaddr_in sock,sock_in;
sock.sin_family=AF_INET;
sock.sin_port=htons(1033);
sock.sin_addr.s_addr=16820416;
size=sizeof(sock);
ss=socket(AF_INET,SOCK_STREAM,0);
bb=bind(ss,(sockaddr*) &sock,size);
listen(ss,5);

while(1)
{
aa=accept(ss,(sockaddr *)&sock_in,(socklen_t*)&size);
//if (aa!=-1) printf("ACCEPT!
");
rr=recv(aa,buf,60,0);
if (rr>=0)
{
printf(buf);
printf("
");
}
}
printf("
");
return 0;
}


client.cpp:
Код

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main ()
{
printf("CLIENT TCP
");
int ss,cc,sd;
int size;
char data[255];
sockaddr_in sock;
sock.sin_family=AF_INET;
sock.sin_port=htons(1033);
sock.sin_addr.s_addr=16820416;
size=sizeof(sock);

while(1)
{
ss=socket(AF_INET,SOCK_STREAM,0);
cc=connect(ss,(sockaddr *)&sock,size);
//if (cc==0) printf("CONNECT!!!");
scanf("%s",data);
sd=send(ss,data,60,0);
}
printf("
");
return 0;
}


_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Отредактированно Ton 10.04.2009 г. в 17:08:50
Спуститься к концу Подняться к началу
sasamy (Guest)
Добавлено 10.04.2009 16:13 Редактировалось 10.04.2009 16:13 Сообщение: 3
sasamy (Guest)

Цитата
Отсылается строка типа char* с клиента и принимается на сервере. Все нормально работает. Переношу сервер на плату. Запускаю, все работает. Но при попытке отослать строку с Win на плату, она не приходит.

Странно что вообще работает а не сегфолтится - на стороне сервера указатель на буфер определен
char *buf;
а кто будет место под сам буфер выделять ?
Спуститься к концу Подняться к началу
alexey123 (Guest)
Добавлено 10.04.2009 16:44 Редактировалось 10.04.2009 16:44 Сообщение: 4
alexey123 (Guest)

похоже на SK она и сыплется по тихому, а Win32 как-то дозволяет такое раздолбайство.
Спуститься к концу Подняться к началу
repairman (Guest)
Добавлено 10.04.2009 17:13 Редактировалось 10.04.2009 17:13 Сообщение: 5
repairman (Guest)

Считается хорошим тоном использовать htons, htonl и т.п., т.к. аритектура процессора может быть с разной чередностью байт в слове (т.н. endian)

Вот так - очень смело...
Код
sock.sin_addr.s_addr=16820416;


На big-endian машине получится один ip адрес, на little-endian - совсем другой... в общем, Вам случайно повезло, что оба процессора little-endian...

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Отредактированно repairman 10.04.2009 г. в 17:21:16
Спуститься к концу Подняться к началу
Ton (Guest)
Добавлено 10.04.2009 17:22 Редактировалось 10.04.2009 17:22 Сообщение: 6
Ton (Guest)

2sasamy: да наверно дело действительно в размере буфера, что-то я не обратил внимание на него, раз работало под Win... Добавил строку buf=new char [60]; В результате: при компиляции под ARM, ругается на следующее
Код

# arm-none-linux-gnueabi-gcc server.cpp -o server -static
/tmp/cckJrlvl.o: In function `main':
server.cpp:(.text+0x18): undefined reference to `operator new[](unsigned int)'
collect2: ld returned 1 exit status
#


2repairman: да, наверно вы правы. но все таки я уверен, что в данном случае ip-адрес получается правильный, ведь соединение устанавливается, т.е. проблема думаю не в этом...
Спуститься к концу Подняться к началу
sasamy (Guest)
Добавлено 10.04.2009 17:38 Редактировалось 10.04.2009 17:38 Сообщение: 7
sasamy (Guest)

Есть много хороших книжек по С - не поленитесь прочитать, или хотя бы как справочник использовать, Керниган&Риччи будет оптимальным вариантом. По вопросу - если буфер небольшой можно и статически память выделить
char buf[60];
если нужно динамически выделять память - используйте аллокаторы типа malloc, например
buf = (char *)malloc(60);
при выходе не забывайте подчищать за собой память
free(buf); // это для случая выделения памяти через malloc
Спуститься к концу Подняться к началу
Ton (Guest)
Добавлено 10.04.2009 18:19 Редактировалось 10.04.2009 18:19 Сообщение: 8
Ton (Guest)

2sasamy: да, все теперь работает, спасибо большое. Поищу-ка я Кернигана и Риччи, чтот даж не слышал о таких...
Спуститься к концу Подняться к началу
repairman (Guest)
Добавлено 11.04.2009 11:35 Редактировалось 11.04.2009 11:35 Сообщение: 9
repairman (Guest)

В родном мануале по libc очень много примеров с пояснениями:

http://www.gnu.org/software/libc/manual/

Касательно выделения памяти:
http://www.gnu.org/software/libc/manual/html_mono/libc.html#Unconstrained-Allocation

Кстати, примеры TCP и UDP серверов/клиентов там тоже есть....

К примеру:
16.9.6 Byte Stream Socket Example
16.9.7 Byte Stream Connection Server Example
16.10.3 Datagram Socket Example
16.10.4 Example of Reading Datagrams

и т.д. и т.п.

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Отредактированно repairman 11.04.2009 г. в 11:53:15
Спуститься к концу Подняться к началу
sasamy (Guest)
Добавлено 11.04.2009 12:36 Редактировалось 11.04.2009 12:36 Сообщение: 10
sasamy (Guest)

Стоит наверно добавить что GNU никогда не было и скорей всего не будет стандартом. Зачем такие крайности - черпать информацию нужно с официальных источников. Человек элементарно никогда не слышал о K&R.. Наклепали уже наши университеты "программистов" отождествляющих С++ с MFC и "дельфистов", счас блин другая мода пойдет - gnu... Ничего не имею против gnu - там они вроде оговариваются что есть в стандарте posix а чего нет и является гнутым расширением.
Спуститься к концу Подняться к началу
Форум » starterkit.ru » Старый форум » SK-MAT91SAM9XE512