简体   繁体   中英

Windows socket api bind function compile issues

I am trying to bind a tcp socket on windows and when expecting an integer back from the function I get a compile error. I am not a c++ programmer and usually do not work on Windows so I am having trouble tracking this issue down. One thing I did notice was that if I did not include the winsock header file all of the other functions I use dealing with sockets such as send, recv, accept and connect all raise compile errors but one was not raised for the bind function. This leads me to believe that I am some how pulling in a different bind function then I am expecting.

The list of included header files for the entire application

#include <fstream>
#include <string>
#include <ctime> 
#include <mutex>
#include <stdio.h>
#include <strsafe.h>
#include <map>
#include <iterator>
#include <process.h>
#include <queue>
#include <iostream>
#include <winsock.h>

The included library's are

#pragma comment(lib, "Ws2_32.lib")
#pragma comment(lib, "User32.lib")

And the class that is trying to use the bind function is

//implement an interface for udp and tcp socket classes to implement
class Socket 
{
public:
    virtual void sendm(const char *buf) = 0;
    virtual int recvm(char *buf) = 0;

    struct hostent  *phe;       /* pointer to host information entry    */
    struct servent  *pse;       /* pointer to service information entry */
    struct protoent *ppe;       /* pointer to protocol information entry  */
    struct sockaddr_in sin;     /* an Internet endpoint address     */
    int type, status;       /* socket descriptor and socket type */
    SOCKET s;                   /* socket */
};

class TCPSocket : public Socket {
public:
    TCPSocket(const char *host, const char *service, bool master_socket){
        initialize_socket(host, service, master_socket);
    }
    ~TCPSocket(void);


    SOCKET initialize_socket(const char *host, const char *service, bool master_socket) {
        cout << "host: " << host << endl;
        cout << "service: " << service << endl;
        char* transport = "tcp";
        int qlen = 10;
        int portbase = 0;
        memset(&sin, 0, sizeof(sin));
        sin.sin_family = AF_INET;
        if (pse = getservbyname(service, transport) ) {
            sin.sin_port = htons(ntohs((u_short)pse->s_port) + portbase);
        }
        else if ((sin.sin_port = htons((u_short)atoi(service))) == 0)
        {
            cout << "can't get " << service << " service" << endl;
            exit(1);
        }

        /* Map protocol name to protocol number */
        if ( (ppe = getprotobyname(transport)) == 0)  {
            cout << "Can't get \"" << transport << "\" protocol entry "<< endl;
            exit(1);
        }

        /* Map host name to IP address, allowing for dotted decimal */
        if (master_socket) {
            sin.sin_addr.s_addr = htonl( INADDR_ANY ); 
        } 
        else {
            if ( phe = gethostbyname(host) ) {
                memcpy(&sin.sin_addr, phe->h_addr, phe->h_length);
            }
            else if ( (sin.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE) {
                cout << "Can't get \"" << host << "\" IP address "<< endl;
                exit(1);
            }
        }


        type = SOCK_STREAM;

        s = socket(AF_INET, type, ppe->p_proto);

        if (s == INVALID_SOCKET) {
            cout << "Socket Error: " << GetLastError() << endl;
            exit(1);
        }

        if (master_socket) {    
            status = bind(s, (sockaddr *)&sin, sizeof(sin));
            /* if (status != 0) { */
            /*   cout << "Bind Error: " << service << " port: " << GetLastError(); */
            /* } */
            status = listen(s, qlen);
            if (status != 0) {
                cout << "can't listen on " << service << " port: " << GetLastError();
                exit(1);
            }
        } else {    
            int status = connect(s, (struct sockaddr*)&sin, sizeof(sin));
            if ( status != 0 ) {
                cout << "could not connect" << endl;
                exit(1);
            }
        }
        return s;       
    }

    SOCKET acceptSocket() {
        return accept(s, (struct sockaddr*)&sin, (int*)sizeof(sin)); 
    }

    void sendm(const char *buf) {
        send(s, buf, strlen(buf), 0);
    }

    int recvm(char *buf) {
        return recv(s, buf, BUFFER_SIZE, 0);
    }
};

The documentation on bind on msdn says this function returns an int.

The compile error I get when attempting to compile is

error C2440: '=' : cannot convert from 'std::_Bind<_Forced,_Ret,_Fun,_V0_t,_V1_t,_V2_t,_V3_t,_V4_t,_V5_t,<unnamed-symbol>>' to 'int'
with
[
    _Forced=false,
    _Ret=void,
    _Fun=SOCKET &,
    _V0_t=sockaddr *,
    _V1_t=unsigned int,
    _V2_t=std::_Nil,
    _V3_t=std::_Nil,
    _V4_t=std::_Nil,
    _V5_t=std::_Nil,
    <unnamed-symbol>=std::_Nil
]
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

I am working with Windows 8 running on a VM in VirtualBox. I am using Visual Studios 2012 command developer command line to compile my code. Any suggestions as to why bind is not working as expected would be very much appreciated.

This leads me to believe that I am some how pulling in a different bind function then I am expecting.

Yes, you are pulling in std::bind . If you look inside <mutex> it has this line #include <functional> which includes std::bind . You probably have a using namespace std; somewhere which makes all the names from the std namespace visible.

Also, the bind you want is in Winsock2.h , and I didn't see an #include for it.

Please read Why is 'using namespace std;' considered a bad practice in C++? . I would recommend removing any using directives (which is probably the cause of this issue) and fully qualify everything.

when using <mutex> and have "using namespace std"

use ::bind() instead of bind()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM