Форум — Development Как узнать сколько данных пришло в сокет? 0 0 Соединяюсь клиентом по TCP. Как узнать сколько данных послал сервер? Ссылка
проанализировав (разработав) протокол прикладного уровня. к примеру, пусть сервер в первых байтах шлёт размер пакета данных. и контрольную сумму тоже неплохо слать. boo32 ★ (25.05.10 19:34:23 MSD) Ссылка
Циклично читаешь read-ом, который возвращает количество прочитанных данных, потом суммируешь. markevichus ★★★ (25.05.10 19:34:37 MSD) Ссылка
На здоровье static long bytes_available (int sock) { #ifdef G_OS_UNIX long int avail = 0; size_t bytes; if (ioctl (sock, FIONREAD, (char *) &bytes) >= 0) return avail = (long int) *((int *) &bytes); #elif defined (G_OS_WIN32) unsigned long bytes = 0; unsigned long dummy = 0; DWORD sizew = 0; if (::WSAIoctl (sock, FIONREAD, &dummy, sizeof (dummy), &bytes, sizeof (bytes), &sizew, 0,0) == SOCKET_ERROR ) return -1; return bytes; #endif } yoghurt ★★★★★ (25.05.10 19:44:34 MSD) Показать ответ Ссылка
Ответ на: На здоровье от yoghurt 25.05.10 19:44:34 MSD Вернула 0. Что делать? facelift ★ (25.05.10 19:54:41 MSD) автор топика Показать ответ Ссылка
Ответ на: комментарий от facelift 25.05.10 19:54:41 MSD Код в студию yoghurt ★★★★★ (25.05.10 20:04:07 MSD) Показать ответы Ссылка
Ответ на: комментарий от yoghurt 25.05.10 20:04:07 MSD Ыыыы... Я тут красноглажу. У меня консоль и браузер. Код пишу в виме. Эээ...как тут копировать/вставить намутить, ты не в курсе? =) facelift ★ (25.05.10 20:10:48 MSD) автор топика Показать ответ Ссылка
Ответ на: комментарий от facelift 25.05.10 20:10:48 MSD И это. Как узнать какая у тебя сейчас раскладка установлена? Я хочу строчку в xmobar добавить. facelift ★ (25.05.10 20:12:52 MSD) автор топика Ссылка
Ответ на: комментарий от yoghurt 25.05.10 20:04:07 MSD #include «CSocket.h» #include <sys/types.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <netinet/in.h> #include <netdb.h> #include <fcntl.h> #include <string.h> #include «CBuffer.h» CSocket::CSocket() { using namespace std; m_Socket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); if(m_Socket < 0) { // BUGBUG: ????? ?????? ? stderr // printf(«%s\n», «ERROR: Can't create socket»); cerr << «ERROR: Create socket failed» << endl; return; } } CSocket::~CSocket() { } void CSocket::connect(const std::string &host, unsigned short port) { struct sockaddr_in mpd_sockaddr; // BUGBUG: ??????? ????? ????? ???? ??????? ????? ??? ??? ????? // BUGBUG: ? ??? ??????? inet_addr? hostent *hostent = gethostbyname(host.c_str()); mpd_sockaddr.sin_addr.s_addr = *(u_long *)hostent->h_addr_list[0]; mpd_sockaddr.sin_family = PF_INET; // BUGBUG: ??????? ??? ????? ????? ???? ??????? ???? // BUGBUG: ? ??? ??????? htons? mpd_sockaddr.sin_port = htons(port); if(::connect(m_Socket, (struct sockaddr *)(&mpd_sockaddr), sizeof(mpd_sockaddr)) != 0) { // BUGBUG: ????? ?????? ? stderr // printf(«%s\n», «ERROR: Can't connect to MPD»); // BUGBUG: ?????????? ????? return; } } void CSocket::send(const char *str) { ::send(m_Socket, str, strlen(str), 0); } void CSocket::send(const char *str, int size) { ::send(m_Socket, str, size, 0); } void CSocket::send(const void *prt, int size) { ::send(m_Socket, prt, size, 0); } void CSocket::send(const std::string &str) { ::send(m_Socket, str.c_str(), str.size(), 0); } void CSocket::send(CBuffer *pBuf) { } void CSocket::recv(CBuffer *pBuf) { using namespace std; size_t bytes = 0; int iores = ioctl(m_Socket, FIONREAD, (char *)&bytes); cout << " ------ IO RES: " << iores << endl; long int dataSize = (long int) *((int *) &bytes); cout << " ----- DATA SIZE: " << dataSize << endl; const int BUF_SIZE = 100; char buff[BUF_SIZE]; int size = 0; do { size = ::recv(m_Socket, buff, BUF_SIZE, 0); cout << " ----- SIZE: " << size << endl; pBuf->addBuffer(buff, size); } while(size >= BUF_SIZE); } facelift ★ (25.05.10 20:24:37 MSD) автор топика Показать ответы Ссылка
Ответ на: комментарий от facelift 25.05.10 20:24:37 MSD Вот мой код. facelift ★ (25.05.10 20:24:57 MSD) автор топика Ссылка
Ответ на: комментарий от facelift 25.05.10 20:24:37 MSD Ты не поверишь. Тот же самый код, ничего не менял. И сейчас один раз сработало, и больше не работает. Как такое может быть? facelift ★ (25.05.10 20:27:20 MSD) автор топика Ссылка
Ответ на: комментарий от facelift 25.05.10 20:24:37 MSD Ну а код использования где? Тут всё очевидно. yoghurt ★★★★★ (25.05.10 20:35:32 MSD) Показать ответ Ссылка
Ответ на: комментарий от yoghurt 25.05.10 20:35:32 MSD #include <iostream> #include "CBuffer.h" #include "CSocket.h" int main(int argc, char *argv[]) { using namespace std; CBuffer buf; CSocket sock; sock.connect("127.0.0.1", 6600); sock.recv(&buf); while(!buf.isEmpty()) { cout << "RL: " << buf.readLine() << endl; } sock.send("currentsong\n"); sock.recv(&buf); while(!buf.isEmpty()) { cout << buf.readLine() << endl; } sock.send("status\n"); sock.recv(&buf); while(!buf.isEmpty()) { cout << buf.readLine() << endl; } /* CSocket sock; sock.connect(host, port); sock.send(buf); sock.recv(buf); */ return 0; } facelift ★ (25.05.10 20:38:22 MSD) автор топика Показать ответ Ссылка
Ответ на: комментарий от facelift 25.05.10 20:38:22 MSD Пруф, так сказать Проперло Не проперло facelift ★ (25.05.10 20:46:56 MSD) автор топика Ссылка
Открыл кран. Как узнать, сколько воды оттуда выльется? Legioner ★★★★★ (25.05.10 22:51:31 MSD) Показать ответ Ссылка