LINUX.ORG.RU

проанализировав (разработав) протокол прикладного уровня. к примеру, пусть сервер в первых байтах шлёт размер пакета данных. и контрольную сумму тоже неплохо слать.

boo32
()

Циклично читаешь read-ом, который возвращает количество прочитанных данных, потом суммируешь.

markevichus ★★★
()

На здоровье

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 ★★★★★
()
Ответ на: комментарий от yoghurt

Ыыыы... Я тут красноглажу. У меня консоль и браузер. Код пишу в виме. Эээ...как тут копировать/вставить намутить, ты не в курсе? =)

facelift
() автор топика
Ответ на: комментарий от facelift

И это. Как узнать какая у тебя сейчас раскладка установлена? Я хочу строчку в xmobar добавить.

facelift
() автор топика
Ответ на: комментарий от yoghurt

#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
() автор топика
Ответ на: комментарий от facelift

Ты не поверишь. Тот же самый код, ничего не менял. И сейчас один раз сработало, и больше не работает. Как такое может быть?

facelift
() автор топика
Ответ на: комментарий от yoghurt
#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
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.