Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка сегментирования при запуске чата написанног, народ помогите я уже незнаю что делать 
:(
    Опции темы
vova_b
Дата 7.3.2008, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 4.2.2008

Репутация: нет
Всего: нет



Привет всем, вот решил написать простенький чат под linux что б мог по локальгой сетке с народ общаться, короче вот смотрите, вот сервак:
Код

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


int GetPort(const char *str);
void Usage();
void Error(const char *msg);
void Work(int sock);

int main (int argc, char **argv)
{
int port;
int sock;
int retcode;
struct sockaddr_in sa;
if(argc!=2 || strcmp(argv[1],"-h")==0)
{
Usage();
}
port=GetPort(argv[1]);
printf("Запускаю сервер на порту %d\n",port);

sock=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
if(sock==-1)
{
Error ("Не могу создать сокет");
}

memset(&sa,0,sizeof(sa));
sa.sin_family=AF_INET;
sa.sin_addr.s_addr=INADDR_ANY;
sa.sin_port=htons(port);
retcode=bind(sock,(struct sockaddr*) (&sa),sizeof(sa));
if(retcode==-1)
{
Error("Ошибка привязи сокета к ip адрусу и номкру порта");
}
retcode=listen(sock,10);
if(retcode==-1)
{
Error("Ощшибка перевода сокета в пассивное состояние");
}
Work(sock);
close(sock);
return 0;
}
int GetPort(const char *str)
{
int port;
port=atoi(str);
if(port<1||port>65535)
{
Error("Магическое число должно быть в диапозоне");
}
return port;
}
void Work(int sock)
{
fd_set ourfds;
fd_set readfds;
char buf[8192];
int len;
int retcode;
int sock2;
int sock3;
char list [1024];
socklen_t size;
struct sockaddr_in sa;

FD_ZERO(&ourfds);
while (42==42){
FD_ZERO(&readfds);
readfds=ourfds;
FD_SET(sock,&readfds);
retcode=select(FD_SETSIZE,&readfds,NULL,NULL,NULL);
if (retcode==-11)
{
Error("Ошибка select");
}
if (FD_ISSET(sock,&readfds))
{
sock2=accept(sock,(struct sockaddr*)(&sa),&size);
if (sock2==-1)
{
Error("Ошибка получения адреса пользователя");
}
printf("Приняли соединение с адреса%s\n",inet_ntoa(sa.sin_addr));
FD_SET(sock2,&ourfds);
}
for (sock=0; sock2<FD_SETSIZE;sock2++)
{
if(FD_ISSET(sock2,&ourfds) && FD_ISSET(sock2,&readfds))
{
len=read(sock2,buf,sizeof(buf));
if(len<0)
{
printf("Ошибка чтения сокета");
FD_CLR(sock2,&ourfds);
}
else if(len==0)
{
printf("Клиент %s закрыл соединение\n",inet_ntoa(sa.sin_addr));
FD_CLR(sock2,&ourfds);
}
else
{
buf[len]=0;
if(getsockname(sock,(struct sockaddr*)(&sa),&size)==-1)
{
printf("Error getsockname\n");
}
printf("Получили с адреса %s: %s\n",inet_ntoa(sa.sin_addr),buf);
if (buf[0]=='s')
{
sock3=atoi(buf+1);
write(sock3,buf,len);
}
else if (buf[0]=='l')
{
for(sock3=0; sock3<FD_SETSIZE; sock++)
{
if(FD_ISSET(sock3,&ourfds))
{
sprintf(list,"Список подключенных пользователей\n%d\n",sock3);
write(sock2,list,strlen(list));
}
}
}
else
{
sprintf(list,"Уважаемый клиент. Нет такой команды!!!\n");
write(sock,list,strlen(list));
}
}
}
}
}
}
void Usage()
{
fprintf(stderr,"Запускать как: ./server port.\n");
exit(-1);
}
void Error(const char *msg)
{
fprintf(stderr,"Ошибка: %s(%s)\n",msg,strerror(errno));
exit(-1);
}


вот клиент

Код

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

int GetPort(const char *str);
void Usage();
void Error(const char *msg);
int Talk(int sock);

int main(int argc, char **argv)
{
int port;
int sock;
int retcode;
struct sockaddr_in servaddr;
struct hostent *host;
if(argc!=3|| strcmp(argv[1],"-h")==0)
{
Usage();
}
port=GetPort(argv[2]);
printf("Запуская клиент на порту %d\n",port);

sock=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
if (sock==-1)
{
Error("Не могу создать сокет");
}
memset(&servaddr,0,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_port=htons(port);
host=gethostbyname(argv[1]);
if  (host==0)
{
Error("Не верный IP");
}
servaddr.sin_addr.s_addr=*(unsigned long*)(host->h_addr);
retcode=connect(sock,(struct sockaddr*)&servaddr,sizeof(servaddr));
if (retcode==-1)
{
Error("Ошибка подключения");
}
Talk(sock);
close(sock);
return 0;
}

int GetPort(const char *str)
{
int port;
port=atoi(str);
return port;
}

int Talk(int sock)
{
char buf[81920];
int len;
int retcode;
fd_set readfds;
while (42==42)
{
FD_ZERO(&readfds);
FD_SET(sock,&readfds);
FD_SET(0,&readfds);
retcode=select(1024,&readfds,0,0,0);
if(retcode==-1)
{
Error("Ошибка select");
}
else
{
if(FD_ISSET(sock,&readfds))
{
len=read(sock,buf,sizeof(buf));
if(len<0)
{
Error("Ошибка чтения сокета");
}
else if (len==0)
{
printf("Сервер закрыл соединение\n");
return 0;
}
else
{
buf[len]=0;
printf("Получил с сервера: %s\n",buf);
}
}
if(FD_ISSET(0,&readfds))
if(len<0)
{
Error("Ошибка чтения");
}
else if (len==0)
{
printf("Сервер закрыл соединение\n");
return 0;
}
else
{
buf[len]=0;
retcode=write(sock,buf,len);
if(retcode==-1)
{
Error("Ошибка отправки");
}
}
}
}
}





void Usage()
{
fprintf(stderr,"Запускать как ./client ip port.\n");
exit(-1);
}
void Error(const char *msg)
{
fprintf(stderr,"Ошибка:%s(%s)\n",msg,strerror(errno));
exit(-1);
}



Компилю так cc server.c и cc client.c
компилеться все на ура!!!
запускаю сервер ./a.out 123
Пишет сервер запушен на порту 1234
Запуская клинт ./client localhost 1234
Клиент запуцстился
А сервак выдает клиет подключен, но как токо ченить начинаю в клиенте писать(всмысле сообщение) выдает ошибка сегментирования! Немогу понять что это такое, читал читал на форумах и не понял, может кто у ся запустит и посмотрит. Спасибо всем!
PM MAIL   Вверх
JackYF
Дата 7.3.2008, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 3
Всего: 162



Цитата(vova_b @  7.3.2008,  18:11 Найти цитируемый пост)
выдает ошибка сегментирования! Немогу понять что это такое

косяк с памятью - записал по неправильному указателю или смещению, стандартный косяк.

Отлаживай с помощью gdb и фронтендов к нему. (действие backtrace). Ну и man gdb.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
vova_b
Дата 7.3.2008, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 4.2.2008

Репутация: нет
Всего: нет



Цитата(JackYF @ 7.3.2008,  18:19)
Цитата(vova_b @  7.3.2008,  18:11 Найти цитируемый пост)
выдает ошибка сегментирования! Немогу понять что это такое

косяк с памятью - записал по неправильному указателю или смещению, стандартный косяк.

Отлаживай с помощью gdb и фронтендов к нему. (действие backtrace). Ну и man gdb.

Я ток недавно программирую на си я непонял что вы имели введу

Добавлено через 13 минут и 48 секунд
Программа компилиться нормально!
PM MAIL   Вверх
vova_b
Дата 7.3.2008, 21:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 4.2.2008

Репутация: нет
Всего: нет



Плиз помогите мне найдите это ошибку, я уже 2 недели сижу немогу понять! smile  smile  smile 
PM MAIL   Вверх
MAKCim
Дата 7.3.2008, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



vova_b, 
отформатируй код для начала


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
vova_b
Дата 8.3.2008, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 4.2.2008

Репутация: нет
Всего: нет



Короче плюнул я и поставил mandriva 2007  ну сказали что могут может, и правда помогло, ошибки сегментирования нет, но зато выскакивает такая ошибка
Ошибка:Ошибка чтения(Invalid or incomplete multibyte or wide character)
Че с этим сделать можно?
PM MAIL   Вверх
JackYF
Дата 8.3.2008, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 3
Всего: 162



Цитата(vova_b @  8.3.2008,  11:53 Найти цитируемый пост)
и правда помогло, ошибки сегментирования нет, но зато выскакивает такая ошибка

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

Это сообщение отредактировал(а) JackYF - 8.3.2008, 14:05


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
vova_b
Дата 8.3.2008, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 4.2.2008

Репутация: нет
Всего: нет



да я уже 2 недели сижу в поисковиках
PM MAIL   Вверх
nickless
Дата 8.3.2008, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 4
Всего: 181



Ну сказали же тебе во 2-м посте
Цитата(JackYF @  7.3.2008,  18:19 Найти цитируемый пост)
Отлаживай с помощью gdb и фронтендов к нему. (действие backtrace). Ну и man gdb. 

инсталлируй какой-нибудь фронтенд вроде kgdb, ddd итд. и вперёд читать документацию к нему. Дебажить эту ошибку надо, а не искать неизвесно что.


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
bsa
Дата 9.3.2008, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



Можно запустить под valgrind (valgrind --tool=memcheck -v --leak-check=full --log-file=program.log ./programm). Очень часто меня выручает, когда ошибка очень не очевидна и связана с порчей памяти.
PM   Вверх
comcon1
Дата 10.3.2008, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: нет
Всего: 17



так, чувак, если не хош заморачиваться с gdb, ладно - напихай принтфов везде и покажи в какой точке вылетает. Мы посмотрим на эту точку и скажем, в чОм дело..


--------------------
PM MAIL   Вверх
andrew_121
Дата 10.3.2008, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 3
Всего: 33



Код для начала отформатируй, а то смотреть даже не хочеться...
А лучше, поставь ссылку на проект...


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
comcon1
Дата 10.3.2008, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: нет
Всего: 17



ошибку лоцировал в отладчике. вызывается из строки 101 клиента. errno устанавливается в 84 (некорректная последовательность символов). Я почему-то думал, что это вылет программы, а на самом деле - это корректное ее завершение по проверке ошибки.


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0596 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.