Пишу клиент-сервер. В клиенте есть вызов send. Так вот примерно 1 из 10 запусков програмы, заканчивается тем, что прога вываливается при send. При этом нет никаких ошибок.
Вот часть кода клиента (некоторые переменные определены в классе):
void socket::send_data(char *data_)
{
sd = socket( PF_INET, SOCK_STREAM, 0 );
if (connect(sd, (struct sockaddr*)&addr, sizeof(addr)) == -1)
{
perror("Connect ");
exit(errno);
}else{
char data[2048];
memcpy(data, data_, strlen(data_)+1);
printf("before\n");
if(send(sd, (char *)&data, 2048, 0) == -1){
perror("Send ");
exit(errno);
}
printf("after\n");
close(sd);
}
}
А вот что выводится в консоль при ошибке:
src $ ./client
before
...и всё...
Часть кода сервера:
void socket::recv_data()
{
while(1){
int client;
socklen_t size = sizeof(addr);
printf( "Waiting for connect...\n" );
client = accept(sd, (struct sockaddr*)&addr, &size );
printf("Connected: %s:%d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
recv(client, &buffer, sizeof(buffer), 0);
printf( "data = %s\n", buffer );
close(client);
}
close(sd);
}
У клиента и сервера данный класс (soсket) явлется потомком класса base_thread.
Вот он:
class base_thread {
public :
virtual ~base_thread() {}
// Must be implemented by real client
virtual void *init() = 0;
int start() {
int n = pthread_create(&pth_, 0, real_run, this);
pthread_detach(pth_);
return n;
}
pthread_t id() const {
return pth_;
}
private :
pthread_t pth_;
static void * real_run(void *arg) {
base_thread *t = static_cast<base_thread *>(arg);
return t->init();
}
};
Вот init() socket:
void *socket::init()
{
addr_len = sizeof(addr);
addr.sin_family = AF_INET;
addr.sin_port = htons( port );
inet_aton( host, &addr.sin_addr );
}
Есть ещё класс base:
...
tsocket = new socket(...);
socket->start();
base *obj = new base(..., tsocket);
obj->start();
...
Класс base, так же является потомком base_thread, вот его init():
void* base::init()
{
int n = 0, r = 0, fd_log = 0;
char *buf = new char[0];
char *line = new char[1024];
fd_log = open( path, O_RDONLY );
if (fd_log < 0){
printf("File %s not found!\n", path);
return 0;
}
r = read(fd_log, &buf[0], 1);
while(r > 0){
while(buf[0] != '\n' && r > 0){
r = read(fd_log, &buf[0], 1);
line[n] = buf[0];
n++;
}
r = read(fd_log, &buf[0], 1);
line[n+1] = '\0';
socket->send_data(line);
n = 0;
}
close(fd_log);
}

Ответ на:
комментарий
от stpg

Ответ на:
комментарий
от cyclon


Ответ на:
комментарий
от lv

Ответ на:
комментарий
от cyclon

Ответ на:
комментарий
от anonymous

Ответ на:
комментарий
от lv

Ответ на:
комментарий
от cyclon

Ответ на:
комментарий
от cyclon
Ответ на:
комментарий
от cyclon
Ответ на:
комментарий
от lv
Ответ на:
комментарий
от anonymous
Ответ на:
комментарий
от anonymous

Ответ на:
комментарий
от anonymous

Ответ на:
комментарий
от cyclon
Ответ на:
комментарий
от cyclon

Ответ на:
комментарий
от lv

Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Сокеты в Си (продолжене) (2005)
- Форум Соединится с сервером по сокету? (2020)
- Форум Проблема с конструтором std::string и const char* (2008)
- Форум phtread и fork() (2010)
- Форум Сокеты передача сообщений между компьютерами. Помогите найти ошибку. (2012)
- Форум Работа с сокетами в C (2010)
- Форум Сокеты, Передача данных, C/C++ (2006)
- Форум Сокеты (2019)
- Форум многопоточное копирование фала через сокет (2015)
- Форум C++[RAII], c network, recv неоправданный интервал (2008)