Windows套接字api绑定函数编译问题
Windows socket api bind function compile issues
我试图在windows上绑定tcp套接字,当期望从函数返回整数时,我得到编译错误。我不是一个c++程序员,通常不工作在Windows上,所以我有麻烦跟踪这个问题。我注意到的一件事是,如果我没有包括winsock头文件,那么我使用的处理套接字的所有其他函数,如send, recv, accept和connect都会引发编译错误,但bind函数没有引发编译错误。这让我相信我在某种程度上拉入了一个不同的绑定函数,而不是我所期望的。
整个应用程序包含的头文件列表
#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>
包含的库是
#pragma comment(lib, "Ws2_32.lib")
#pragma comment(lib, "User32.lib")
试图使用bind函数的类是
//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);
}
};
msdn上的bind的文档说这个函数返回一个int。
我在尝试编译时得到的编译错误是
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
我在VirtualBox的虚拟机上运行Windows 8。我使用Visual studio 2012命令开发人员命令行来编译我的代码。任何建议,为什么绑定不工作,如预期将非常感激。
这让我相信我在某种程度上是不同的
是的,你正在拉入std::bind。如果你看<mutex>
里面,它有#include <functional>
这条线,它包括std::bind
。您可能在某个地方有一个using namespace std;
,它使std
名称空间中的所有名称可见。
另外,你想要的绑定是在Winsock2.h
中,我没有看到它的#include
。
请阅读为什么在c++中"使用命名空间std;"被认为是一种不好的做法?我建议删除任何using指令(这可能是导致这个问题的原因),并完全限定所有内容。
当使用<mutex>
并且使用"using namespace std"
用::bind()
代替bind()
相关文章:
- Rextester 语言编译C++问题
- C++ 多级虚拟继承编译问题
- 编译问题:在函数"_start"中:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 使用 CImg 库的 std::min 和 std::max 的编译问题
- Qt Visual Studio 2015 加载项编译问题
- libssh 问题编译问题未定义的错误
- 在 armhf 上使用 cmake 在 qt 上的编译问题 "Syntax error: wird unexpected (expecting " ) " "
- LLVM 万花筒教程 JIT 编译问题
- PX 转换例程编译问题
- 模板类编译问题与 typedef 变量
- 在 Ubuntu 16.04 LTS 上使用 c++ 编译问题?
- 编译问题与 Ubuntu Linux
- C++编译问题错误 - C2332:<类:缺少标记名称>
- AIX C++映射编译问题
- Ubuntu 下的 Cmake 和 Intel IPP 的编译问题
- 如何解决我在 Ubuntu 19.04 下使用 GLFW 时遇到的这个编译问题?
- wxWebView在Ubuntu上的编译问题
- C++constexpr编译问题
- CMake - OpenVR 编译问题
- C++ SD 总线源文件编译问题