2014-04-24 4 views
0

// Приведенный ниже код работает нормально, но используется для отправки строки. Какие изменения я должен внести, чтобы отправить буфер (адрес буфера), содержащий заголовок с полями другого типа данных? (Я новичок в программировании. Так что, извините нуб во мне)Программа сокета TCP для отправки буфера.

ClientSocket.cpp 

ClientSocket::ClientSocket (std::string host, int port) 
{ 
    if (! Socket::create()) 
    { 
     throw SocketException ("Could not create client socket."); 
} 

    if (! Socket::connect (host, port)) 
    { 
     throw SocketException ("Could not connect."); 
    } 

} 


const ClientSocket& ClientSocket::operator << (const std::string& s) const 
{ 
    if (! Socket::send (s)) 
    { 
     throw SocketException ("Could not write to socket."); 
    } 

    return *this; 

} 


const ClientSocket& ClientSocket::operator >> (std::string& s) const 
{ 
    if (! Socket::recv (s)) 
    { 
     throw SocketException ("Could not read from socket."); 
    } 
    return *this; 
} 






simple_client_main.cpp 

#include "ClientSocket.h" 
#include "SocketException.h" 
#include <iostream> 
#include <string> 

int main (int argc, int argv[]) 
{ 
    try 
    { 

     ClientSocket client_socket ("169.254.103.63", 30000); 

     std::string reply; 

     try 
    { 
     client_socket << "Test message."; 
     client_socket >> reply; 
    } 
     catch (SocketException&) {} 

     std::cout << "We received this response from the server:\n\"" << reply << "\"\n";; 

    } 
    catch (SocketException& e) 
    { 
     std::cout << "Exception was caught:" << e.description() << "\n"; 
    } 

    return 0; 
} 




ServerSocket.cpp 

// Implementation of the ServerSocket class 

#include "ServerSocket.h" 
#include "SocketException.h" 


ServerSocket::ServerSocket (int port) 
{ 
    if (! Socket::create()) 
    { 
     throw SocketException ("Could not create server socket."); 
    } 

    if (! Socket::bind (port)) 
    { 
     throw SocketException ("Could not bind to port."); 
    } 

    if (! Socket::listen()) 
    { 
     throw SocketException ("Could not listen to socket."); 
    } 

} 

ServerSocket::~ServerSocket() 
{ 
} 


const ServerSocket& ServerSocket::operator << (const std::string& s) const 
{ 
    if (! Socket::send (s)) 
    { 
     throw SocketException ("Could not write to socket."); 
    } 

    return *this; 

} 


const ServerSocket& ServerSocket::operator >> (std::string& s) const 
{ 
    if (! Socket::recv (s)) 
    { 
     throw SocketException ("Could not read from socket."); 
    } 

    return *this; 
} 

void ServerSocket::accept (ServerSocket& sock) 
{ 
    if (! Socket::accept (sock)) 
    { 
     throw SocketException ("Could not accept socket."); 
    } 
} 




simple_server_main.cpp 

#include "ServerSocket.h" 
#include "SocketException.h" 
#include <string> 
#include <iostream> 

int main (int argc, int argv[]) 
{ 
    std::cout << "running....\n"; 

    try 
    { 
     // Create the socket 
     ServerSocket server (30000); 

     while (true) 
    { 

     ServerSocket new_sock; 
     server.accept (new_sock); 

     try 
     { 
      while (true) 
     { 
      std::string data; 
      new_sock >> data; 
      new_sock << data; 
     } 
     } 
     catch (SocketException&) {} 

    } 
    } 
    catch (SocketException& e) 
    { 
    std::cout << "Exception was caught:" << e.description() << "\nExiting.\n"; 
    } 

    return 0; 
} 

ответ

0

Вы должны добавить новый посыл() и ПРИЕМ() функции, которые вы не показан. Сокет может отправлять двоичные данные, но вы должны указать его размер в байтах. На стороне recv() возникнет вопрос, сколько байтов вам нужно, прежде чем у вас будет целая структура. Обычно это требует добавления некоторого протокола, такого как префикс длины для каждого сообщения.

Смежные вопросы