Пишу клиент-сервер. В клиенте есть вызов 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)
- Форум Проблема с конструтором std::string и const char* (2008)
- Форум Сокеты передача сообщений между компьютерами. Помогите найти ошибку. (2012)
- Форум Работа с сокетами в C (2010)
- Форум Соединится с сервером по сокету? (2020)
- Форум Таймаут для connect() (2009)
- Форум Сканер портов (2000)
- Форум Сокеты, Передача данных, C/C++ (2006)
- Форум phtread и fork() (2010)
- Форум Сокеты (2019)