2010-03-06 101 views
-1

我有一個錯誤:插座在linux

[email protected]:~/socket$ g++ Socket.cpp 
Socket.cpp: In member function ‘int Socket::recv(std::string&) const’: 
Socket.cpp:135: error: ‘cout’ is not a member of ‘std’ 

Socket.cpp來源:

// Implementation of the Socket class. 


#include "Socket.h" 
#include "string.h" 
#include <string.h> 
#include <errno.h> 
#include <fcntl.h> 



Socket::Socket() : 
    m_sock (-1) 
{ 

    memset (&m_addr, 
    0, 
    sizeof (m_addr)); 

} 

Socket::~Socket() 
{ 
    if (is_valid()) 
    ::close (m_sock); 
} 

bool Socket::create() 
{ 
    m_sock = socket (AF_INET, 
     SOCK_STREAM, 
     0); 

    if (! is_valid()) 
    return false; 


    // TIME_WAIT - argh 
    int on = 1; 
    if (setsockopt (m_sock, SOL_SOCKET, SO_REUSEADDR, (const char*) &on, sizeof (on)) == -1) 
    return false; 


    return true; 

} 



bool Socket::bind (const int port) 
{ 

    if (! is_valid()) 
    { 
     return false; 
    } 



    m_addr.sin_family = AF_INET; 
    m_addr.sin_addr.s_addr = INADDR_ANY; 
    m_addr.sin_port = htons (port); 

    int bind_return = ::bind (m_sock, 
     (struct sockaddr *) &m_addr, 
     sizeof (m_addr)); 


    if (bind_return == -1) 
    { 
     return false; 
    } 

    return true; 
} 


bool Socket::listen() const 
{ 
    if (! is_valid()) 
    { 
     return false; 
    } 

    int listen_return = ::listen (m_sock, MAXCONNECTIONS); 


    if (listen_return == -1) 
    { 
     return false; 
    } 

    return true; 
} 


bool Socket::accept (Socket& new_socket) const 
{ 
    int addr_length = sizeof (m_addr); 
    new_socket.m_sock = ::accept (m_sock, (sockaddr *) &m_addr, (socklen_t *) &addr_length); 

    if (new_socket.m_sock <= 0) 
    return false; 
    else 
    return true; 
} 


bool Socket::send (const std::string s) const 
{ 
    int status = ::send (m_sock, s.c_str(), s.size(), MSG_NOSIGNAL); 
    if (status == -1) 
    { 
     return false; 
    } 
    else 
    { 
     return true; 
    } 
} 


int Socket::recv (std::string& s) const 
{ 
    char buf [ MAXRECV + 1 ]; 

    s = ""; 

    memset (buf, 0, MAXRECV + 1); 

    int status = ::recv (m_sock, buf, MAXRECV, 0); 

    if (status == -1) 
    { 
     std::cout << "status == -1 errno == " << errno << " in Socket::recv\n"; 
     return 0; 
    } 
    else if (status == 0) 
    { 
     return 0; 
    } 
    else 
    { 
     s = buf; 
     return status; 
    } 
} 



bool Socket::connect (const std::string host, const int port) 
{ 
    if (! is_valid()) return false; 

    m_addr.sin_family = AF_INET; 
    m_addr.sin_port = htons (port); 

    int status = inet_pton (AF_INET, host.c_str(), &m_addr.sin_addr); 

    if (errno == EAFNOSUPPORT) return false; 

    status = ::connect (m_sock, (sockaddr *) &m_addr, sizeof (m_addr)); 

    if (status == 0) 
    return true; 
    else 
    return false; 
} 

void Socket::set_non_blocking (const bool b) 
{ 

    int opts; 

    opts = fcntl (m_sock, 
    F_GETFL); 

    if (opts < 0) 
    { 
     return; 
    } 

    if (b) 
    opts = (opts | O_NONBLOCK); 
    else 
    opts = (opts & ~O_NONBLOCK); 

    fcntl (m_sock, 
    F_SETFL,opts); 

} 

而且socket.h中:

// Definition of the Socket class 



#ifndef Socket_class 

#define Socket_class 





#include <sys/types.h> 

#include <sys/socket.h> 

#include <netinet/in.h> 

#include <netdb.h> 

#include <unistd.h> 

#include <string> 

#include <arpa/inet.h> 





const int MAXHOSTNAME = 200; 

const int MAXCONNECTIONS = 5; 

const int MAXRECV = 500; 



class Socket 

{ 

public: 

    Socket(); 

    virtual ~Socket(); 



    // Server initialization 

    bool create(); 

    bool bind (const int port); 

    bool listen() const; 

    bool accept (Socket&) const; 



    // Client initialization 

    bool connect (const std::string host, const int port); 



    // Data Transimission 

    bool send (const std::string) const; 

    int recv (std::string&) const; 





    void set_non_blocking (const bool); 



    bool is_valid() const { return m_sock != -1; } 



private: 



    int m_sock; 

    sockaddr_in m_addr; 





}; 





#endif 
+5

你真的寫了所有的代碼無需先編譯它? –

+0

不是這是套接字編程的文件之一,並且錯誤出現在這個文件中。它使用make命令編譯 – user216112

+8

您應該確保在發佈之前至少有一點要自己調查問題。你得到的編譯錯誤甚至與套接字有關,谷歌可能告訴你。 – mnemosyn

回答

17

頂部添加此的文件:

#include <iostream> 
4

要添加到約翰的回答,也解決首要這樣:

// string.h is deprecated 
#include <string> 
// or 
#include <cstring> 
+3

是與 *完全不同的*庫。 –