ниписание клиент-сервера
И так мне надо написать клиент-серверное сетевое приложение реализующее функционал системы обмена сообщениями (аськи на пример). нужен программа-сервер и клиент. И все это дело надо написать на C++ под Linux. Есть проблемма, дело в том, что я никогда не писал такие программы, да и вообщем новичек в этом деле. Абсолютно не знаю с чего начать и как продолжить, поэтому прошу вашей помощи и надеюсь на нее! Заранее спасибо!
И так мне надо написать клиент-серверное сетевое приложение реализующее функционал системы обмена сообщениями (аськи на пример). нужен программа-сервер и клиент. И все это дело надо написать на C++ под Linux. Есть проблемма, дело в том, что я никогда не писал такие программы, да и вообщем новичек в этом деле. Абсолютно не знаю с чего начать и как продолжить, поэтому прошу вашей помощи и надеюсь на нее! Заранее спасибо!
Не то, что бы я когнитивно диссонировал, но вопрос имею задать: вам для учебы?
З.Ы. С названия темы - порвало...
Может быть, имеет смысл взяться за что-то полегче?
я бы с радостью, но не мне это решать) поэтому прошу помощи!
#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/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);
}
:)
не скажешь, что у меня в клиенте не так?
у меня ошибка при копилировании:
client.cpp:62:error: invalid conversion from `void*` to `char*`
Ну а потом нужно наверно будет попробовать Typecast попробуй разные варианты
(char *)переменная
или так
(char *)&переменная
или так
*(char *)переменная
или так
*(char *)&переменная
я тут сам путаюсь
вот както так ну или сначала найди в какой строчке ошибка
Ну а потом нужно наверно будет попробовать Typecast попробуй разные варианты
вот както так ну или сначала найди в какой строчке ошибка
насколько я понял, то получается, ошибка в строке 62
Ну это все конечно замечатель, но просто я хотел увидить эту строчку в глаза
вот в этой
{
int len;
void *data;
}let;
или если это не поможет то попробуй так, ток структуру обратно тогда востанови.
(void *)let.data = calloc (len2, sizeof(char));
Да и вообще могбы пока не выдлять память чтоб не запутаться, просто создал бы строку
[COLOR="Red"]char *stroca=" My messege "[/COLOR] и отправил бы
Нда... Профессионально.
А может правильно сделать?
или если это не поможет то попробуй так, ток структуру обратно тогда востанови.
Да и вообще могбы пока не выдлять память чтоб не запутаться, просто создал бы строку
[COLOR="Red"]char *stroca=" My messege "[/COLOR] и отправил бы
попробывал и так и так... не работает ((
Ага =) Самообучение рулит
Ну может и так...
Че теперь пишет? тоже самое?
А может правильно сделать?
оооо точно заработало, спасибо...
Ну может и так...
Че теперь пишет? тоже самое?
ага...
Ммм ну я предпологаю, что когда к твоему серверу подключится второй клиент
то тебе нужно будет создать второй сокет, а потом пользоваться им, но это всеголишь предположение, я не делал с двумя клиентами, как-то не думал об этом. Но не исключено, что что-нибудь жахнет =)
client_sockfd2= accept(server_sockfd, (struct sockaddr *) &client_address, (socklen_t *) &client_len);
то тебе нужно будет создать второй сокет, а потом пользоваться им, но это всеголишь предположение, я не делал с двумя клиентами, как-то не думал об этом. Но не исключено, что что-нибудь жахнет =)
а можешь весь код написать?))
ммм ну вот у ся на винде поэксперементировал и получилось вот что
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);
И работать твой сервер буде следовательно только после того как к нему подключатся два клиента
Думаю должно завестись, но ничего не гарантирую.
Этот код можешь впихнуть после строчки в твоем Сервере
И работать твой сервер буде следовательно только после того как к нему подключатся два клиента
Думаю должно завестись, но ничего не гарантирую.
так... стоп... я отвлекся... 1 код это для второго клиента, а 2ой добовление к серверу?
да, согласен...)
впихнул этот код, запускаю сервер и два клиента....ии... ни каких изменений(
пишу в клиенте, сервер пишет что ждет, и в терминале(с клиентом) снова desktop...
char ch2;
bind is ok
listen is ok
server waiting
server waiting
asd
~/desktop>
./client
asd
~/desktop>
на др клиент не че не приходит
#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);
}
}
serv.cpp: In function ‘int main()’:
serv.cpp:43: ошибка: expected initializer before ‘listen’
serv.cpp:44: ошибка: нет декларации ‘client_sockfd2’ в этой области видимости
Arsen@linux-5whq:~/Desktop>
непонятно....
Дружише учись находить ошибки самостоятельно.
Да и я чутка модернизировал код так что посотри
Дружише учись находить ошибки самостоятель.
Да и я чутка модернизировал код так что посотри
нуууу)) я ведь написал в самом начале>>> новичек, никогда и ничего подобного не писал... так что мне свойственоо больше спрашивать)
Да и смотрю аву ты поставил не совсем туду куда хотел)
Да и смотрю аву ты поставил не совсем туду куда хотел)
не стал проверять в тот день, ужасно спать хотел...думал, если опять что-то не получится, то всю ночь буду возиться.... вобщем теперь пишет, что ошибка сегментирования, когда сообщение посылаю