Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

ниписание клиент-сервера

50K
15 января 2010 года
iCrash
30 / / 12.01.2010
Здраствуйте форумчане!
И так мне надо написать клиент-серверное сетевое приложение реализующее функционал системы обмена сообщениями (аськи на пример). нужен программа-сервер и клиент. И все это дело надо написать на C++ под Linux. Есть проблемма, дело в том, что я никогда не писал такие программы, да и вообщем новичек в этом деле. Абсолютно не знаю с чего начать и как продолжить, поэтому прошу вашей помощи и надеюсь на нее! Заранее спасибо!
Страницы:
10K
15 января 2010 года
palevo060
144 / / 05.09.2009
Начинается) ну на тебе статью там есть и под Linux и по Windows
9
15 января 2010 года
Lerkin
3.0K / / 25.03.2003
Цитата: iCrash

И так мне надо написать клиент-серверное сетевое приложение реализующее функционал системы обмена сообщениями (аськи на пример). нужен программа-сервер и клиент. И все это дело надо написать на C++ под Linux. Есть проблемма, дело в том, что я никогда не писал такие программы, да и вообщем новичек в этом деле. Абсолютно не знаю с чего начать и как продолжить, поэтому прошу вашей помощи и надеюсь на нее! Заранее спасибо!


Не то, что бы я когнитивно диссонировал, но вопрос имею задать: вам для учебы?

З.Ы. С названия темы - порвало...

50K
15 января 2010 года
iCrash
30 / / 12.01.2010
ну можно и так сказать... это не школьная программа... я на стажировку хожу
9
15 января 2010 года
Lerkin
3.0K / / 25.03.2003
Цитата: iCrash
ну можно и так сказать... это не школьная программа... я на стажировку хожу


Может быть, имеет смысл взяться за что-то полегче?

50K
15 января 2010 года
iCrash
30 / / 12.01.2010
Цитата: Lerkin
Может быть, имеет смысл взяться за что-то полегче?


я бы с радостью, но не мне это решать) поэтому прошу помощи!

50K
15 января 2010 года
iCrash
30 / / 12.01.2010
Сервер (вроде работает)

Цитата:
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
int err=-1;
int server_sockfd, client_sockfd;
int server_len, client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;

server_sockfd = socket(AF_INET, SOCK_STREAM, 0);

server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons(9734);
server_len = sizeof(server_address);
err=(bind(server_sockfd, (struct sockaddr *) &server_address, server_len));

if(err!=0) printf("bind error!\n");
else printf("bind is ok\n");
err=-1;

err=(listen(server_sockfd, 5));
if(err!=0) printf("listen error!\n");
else printf("listen is ok\n");
while(1)
{
char ch;

printf("server waiting\n");

client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd, (struct sockaddr *) &client_address, (socklen_t *) &client_len);

read(client_sockfd, &ch, 1);
ch++;
write(client_sockfd, &ch, 1);
close(client_sockfd);
}
}



а вот с клиентом что-то не так

Цитата:
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>

void client();

struct letter
{
int len;
char *data;
}let;

int main()
{
client();
}

void client()
{
int sockfd;
int len,len2=0;
struct sockaddr_in address;
int result;
char ch;
char lenbuf[256], *buf;

sockfd = socket (AF_INET, SOCK_STREAM, 0);

address.sin_family = AF_INET;
address.sin_addr.s_addr= inet_addr("127.0.0.1");
address.sin_port = htons(9734);
len = sizeof(address);

result = connect(sockfd, (struct sockaddr *) &address, len);

if(result==-1)
{
printf("don't connect\n");
perror("ppos: client");
exit(1);
}

buf = lenbuf;
printf;
while((*buf++=getchar())!= '\n')/*считываем данные в буф-массив, одновременно выясняя их количество*/
{
if(len2==255)
{
printf("buff is full \n");/*проверка переполнения*/
break;
}
len2++;
}
*buf='\0';

let.len=len2;/*заносим в структуру длинну сообщения в символах*/
let.data = calloc (len2, sizeof(char));/*динамически выделяем память под входящие данные*/
if(!let.data) printf("memory error data\n");/*проверяем - выделилась ли память*/
strncpy(let.data, lenbuf, len2);/*копируем из буф-массива данные в структуру*/

write(sockfd, &let.data, 1);
read(sockfd, &let.data, 1);
puts(let.data);
close(sockfd);
exit(0);
}

50K
15 января 2010 года
iCrash
30 / / 12.01.2010
просмотрел файлы, и если не ошибаюсь то написано под windows?
10K
15 января 2010 года
palevo060
144 / / 05.09.2009
Да да я уже удалил =) забыл что про Linux говорим )
50K
15 января 2010 года
iCrash
30 / / 12.01.2010
Цитата: palevo060
Да да я уже удали =) забыл что про Linux говорим )


:)
не скажешь, что у меня в клиенте не так?

10K
15 января 2010 года
palevo060
144 / / 05.09.2009
Вообще не знаю, а что конкретно не работает, соединение есть? Сам сервер хоть работает. Ты его проверял, не знаю че там на Линухе а на Винде я проверяю командой telnet 192.23.25.12 975 а вот чета с 127.0.0.1 не прокатывало
50K
15 января 2010 года
iCrash
30 / / 12.01.2010
Цитата: palevo060
Вообще не знаю, а что конкретно не работает, соединение есть? Сам сервер хоть работает. Ты его проверял, не знаю че там на Линухе а на Винде я проверяю командой telnet 192.23.25.12 975 а вот чета с 127.0.0.1 не прокатывало



у меня ошибка при копилировании:

Цитата:
client.cpp: In function `void client()`:
client.cpp:62:error: invalid conversion from `void*` to `char*`

10K
15 января 2010 года
palevo060
144 / / 05.09.2009
Для начала попробуй найдти где именно эта, ошибка ( ну там поудаляй какиенить строчки и смотри когда исчезниет сообщение)
Ну а потом нужно наверно будет попробовать Typecast попробуй разные варианты
Цитата:

(char *)переменная
или так
(char *)&переменная
или так
*(char *)переменная
или так
*(char *)&переменная
я тут сам путаюсь


вот както так ну или сначала найди в какой строчке ошибка

50K
15 января 2010 года
iCrash
30 / / 12.01.2010
Цитата: palevo060
Для начала попробуй найдти где именно эта, ошибка ( ну там поудаляй какиенить строчки и смотри когда исчезниет сообщение)
Ну а потом нужно наверно будет попробовать Typecast попробуй разные варианты

вот както так ну или сначала найди в какой строчке ошибка



насколько я понял, то получается, ошибка в строке 62

10K
15 января 2010 года
palevo060
144 / / 05.09.2009
Цитата: iCrash
насколько я понял, то получается, ошибка в строке 62



Ну это все конечно замечатель, но просто я хотел увидить эту строчку в глаза

50K
15 января 2010 года
iCrash
30 / / 12.01.2010
Цитата: palevo060
Ну это все конечно замечатель, но просто я хотел увидить эту строчку в глаза



вот в этой

Цитата:
let.data = calloc (len2, sizeof(char));/*динамически выделяем память под входящие данные*/

10K
15 января 2010 года
palevo060
144 / / 05.09.2009
Ну предлагаю поменять у этой структуре char* на void* и посмотреть жахнет или нет =)
Цитата:
struct letter
{
int len;
void *data;
}let;



или если это не поможет то попробуй так, ток структуру обратно тогда востанови.

Цитата:

(void *)let.data = calloc (len2, sizeof(char));



Да и вообще могбы пока не выдлять память чтоб не запутаться, просто создал бы строку
[COLOR="Red"]char *stroca=" My messege "[/COLOR] и отправил бы

9
15 января 2010 года
Lerkin
3.0K / / 25.03.2003
Цитата: palevo060
Ну предлагаю поменять у этой структуре char* на void* и посмотреть жахнет или нет =)


Нда... Профессионально.

А может правильно сделать?

 
Код:
let.data = (char*)calloc (len2, sizeof(char));
50K
15 января 2010 года
iCrash
30 / / 12.01.2010
Цитата: palevo060
Ну предлагаю поменять у этой структуре char* на void* и посмотреть жахнет или нет =)


или если это не поможет то попробуй так, ток структуру обратно тогда востанови.



Да и вообще могбы пока не выдлять память чтоб не запутаться, просто создал бы строку
[COLOR="Red"]char *stroca=" My messege "[/COLOR] и отправил бы



попробывал и так и так... не работает ((

10K
15 января 2010 года
palevo060
144 / / 05.09.2009
Цитата:
Нда... Профессионально.


Ага =) Самообучение рулит

Цитата:
А может правильно сделать?


Ну может и так...

Цитата:
попробывал и так и так... не работает ((


Че теперь пишет? тоже самое?

50K
15 января 2010 года
iCrash
30 / / 12.01.2010
Цитата: Lerkin
Нда... Профессионально.

А может правильно сделать?
 
Код:
let.data = (char*)calloc (len2, sizeof(char));



оооо точно заработало, спасибо...

50K
15 января 2010 года
iCrash
30 / / 12.01.2010
Цитата: palevo060
Ага =) Самообучение рулит

Ну может и так...

Че теперь пишет? тоже самое?



ага...

50K
15 января 2010 года
iCrash
30 / / 12.01.2010
а теперь как сделать чтоб сервер приинимал информацию с 1ого клиента и посылал на 2ой клиент?
10K
15 января 2010 года
palevo060
144 / / 05.09.2009
Цитата: iCrash
а теперь как сделать чтоб сервер приинимал информацию с 1ого клиента и посылал на 2ой клиент?


Ммм ну я предпологаю, что когда к твоему серверу подключится второй клиент
то тебе нужно будет создать второй сокет, а потом пользоваться им, но это всеголишь предположение, я не делал с двумя клиентами, как-то не думал об этом. Но не исключено, что что-нибудь жахнет =)

Цитата:

client_sockfd2= accept(server_sockfd, (struct sockaddr *) &client_address, (socklen_t *) &client_len);

50K
15 января 2010 года
iCrash
30 / / 12.01.2010
Цитата: palevo060
Ммм ну я предпологаю, что когда к твоему серверу подключится второй клиент
то тебе нужно будет создать второй сокет, а потом пользоваться им, но это всеголишь предположение, я не делал с двумя клиентами, как-то не думал об этом. Но не исключено, что что-нибудь жахнет =)



а можешь весь код написать?))

10K
15 января 2010 года
palevo060
144 / / 05.09.2009
Цитата: iCrash
а можешь весь код написать?))



ммм ну вот у ся на винде поэксперементировал и получилось вот что

Цитата:

int client_sockfd2
listen(server_sockfd, 5);
client_sockfd2= accept(server_sockfd, (struct sockaddr *) &client_address, (socklen_t *) &client_len);
read(client_sockfd2, &ch, 1);


Этот код можешь впихнуть после строчки в твоем Сервере

Цитата:

client_sockfd = accept(server_sockfd, (struct sockaddr *) &client_address, (socklen_t *) &client_len);



И работать твой сервер буде следовательно только после того как к нему подключатся два клиента

Думаю должно завестись, но ничего не гарантирую.

50K
15 января 2010 года
iCrash
30 / / 12.01.2010
Цитата: palevo060
ммм ну вот у ся на винде поэксперементировал и получилось вот что


Этот код можешь впихнуть после строчки в твоем Сервере



И работать твой сервер буде следовательно только после того как к нему подключатся два клиента

Думаю должно завестись, но ничего не гарантирую.



так... стоп... я отвлекся... 1 код это для второго клиента, а 2ой добовление к серверу?

10K
15 января 2010 года
palevo060
144 / / 05.09.2009
Нет этот для сервера. Но он не полностью готов я думал, что ты хоть это уже дописать сам сможешь. Если я все за тя напишу ты так ничему и не научишься
50K
15 января 2010 года
iCrash
30 / / 12.01.2010
Цитата: palevo060
Нет этот для сервера. Но он не полностью готов я думал, что ты хоть это уже дописать сам сможешь. Если я все за тя напишу ты так ничему и не научишься



да, согласен...)

впихнул этот код, запускаю сервер и два клиента....ии... ни каких изменений(
пишу в клиенте, сервер пишет что ждет, и в терминале(с клиентом) снова desktop...

10K
15 января 2010 года
palevo060
144 / / 05.09.2009
Ну сообщение хоть одно приходит? У тебя так и будет одно сообщение потому что те нужно создать второй буфер, потому что первый у тебя уже используется
Цитата:

char ch2;

50K
15 января 2010 года
iCrash
30 / / 12.01.2010
вот, посмотри....
10K
15 января 2010 года
palevo060
144 / / 05.09.2009
Ну сначала сам взгляни на кртинку, на ней мало чего разглядишь
50K
15 января 2010 года
iCrash
30 / / 12.01.2010
Цитата: palevo060
Ну сначала сам взгляни на кртинку, на ней мало чего разглядишь



Цитата:
./server
bind is ok
listen is ok
server waiting
server waiting



Цитата:
./client
asd
~/desktop>
./client
asd
~/desktop>



на др клиент не че не приходит

10K
15 января 2010 года
palevo060
144 / / 05.09.2009
ммм ну попробуй так
Цитата:

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
int err=-1;
int server_sockfd, client_sockfd;
int server_len, client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;

server_sockfd = socket(AF_INET, SOCK_STREAM, 0);

server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);
server_address.sin_port = htons(9734);
server_len = sizeof(server_address);
err=(bind(server_sockfd, (struct sockaddr *) &server_address, server_len));

if(err!=0) printf("bind error!\n");
else printf("bind is ok\n");
err=-1;

err=(listen(server_sockfd, 5));
if(err!=0) printf("listen error!\n");
else printf("listen is ok\n");
while(1)
{
char ch;

printf("server waiting\n");

client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd, (struct sockaddr *) &client_address, (socklen_t *) &client_len);

char ch2[512];
int client_sockfd2;
listen(server_sockfd, 5);
client_sockfd2= accept(server_sockfd, (struct sockaddr *) &client_address, (socklen_t *) &client_len);
read(client_sockfd2, &ch2, 1);
write(client_sockfd, &ch, 1);

read(client_sockfd, &ch, 1);
printf("%s",ch);
write(client_sockfd, &ch, 1);
close(client_sockfd);
}
}

50K
15 января 2010 года
iCrash
30 / / 12.01.2010
Цитата:
Arsen@linux-5whq:~/Desktop> g++ -o serv serv.cpp
serv.cpp: In function ‘int main()’:
serv.cpp:43: ошибка: expected initializer before ‘listen’
serv.cpp:44: ошибка: нет декларации ‘client_sockfd2’ в этой области видимости
Arsen@linux-5whq:~/Desktop>




непонятно....

10K
15 января 2010 года
palevo060
144 / / 05.09.2009
Ну я забыл поставить ;
Цитата:
int client_sockfd2;


Дружише учись находить ошибки самостоятельно.
Да и я чутка модернизировал код так что посотри

50K
15 января 2010 года
iCrash
30 / / 12.01.2010
Цитата: palevo060
Ну я забыл поставить ;

Дружише учись находить ошибки самостоятель.
Да и я чутка модернизировал код так что посотри



нуууу)) я ведь написал в самом начале>>> новичек, никогда и ничего подобного не писал... так что мне свойственоо больше спрашивать)

50K
15 января 2010 года
iCrash
30 / / 12.01.2010
фуф...умаялся очень... вообщем, спасибо те большое palevo060, очень помог. думаю завтра будут новые вопросы :D
10K
15 января 2010 года
palevo060
144 / / 05.09.2009
Дак код хоть пашет то? мнеж интересно)
Да и смотрю аву ты поставил не совсем туду куда хотел)
50K
18 января 2010 года
iCrash
30 / / 12.01.2010
Цитата: palevo060
Дак код хоть пашет то? мнеж интересно)
Да и смотрю аву ты поставил не совсем туду куда хотел)



не стал проверять в тот день, ужасно спать хотел...думал, если опять что-то не получится, то всю ночь буду возиться.... вобщем теперь пишет, что ошибка сегментирования, когда сообщение посылаю

50K
24 января 2010 года
iCrash
30 / / 12.01.2010
проблема не решена....
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог