bind:对非套接字的套接字操作
bind: Socket operation on non-socket
我写了一个服务器端和一个客户端,不断得到'bind: Socket operation on non-socket'
我已经研究了这个问题,在另一个应用程序中运行了其他代码,并且已经耗尽了8个小时试图找到这个bug。
代码是:
void TCPSocket::buildTCPSocket(int port)
{
initializeSocket1();
getSocket();
bindSocket();
listenToSocket();
acceptSocket();
// now you can send() and recv() with the
// connected client via socket connectedTCPSocket
}
void TCPSocket::getSocket()
{
// Get an internet domain socket AF_INET
if(socket1 = socket(AF_INET, SOCK_STREAM,0) == -1)
{
perror("socket");
exit(1);
}
}
void TCPSocket::bindSocket()
{
// Bind to a port on the host
int myAddressSize = sizeof(myAddress);
int bindReturnValue = bind(socket1, (struct sockaddr *) &myAddress, AddressSize);
if (bindReturnValue == -1)
{
perror("bind"); // <== Error message generated here
exit(1);
}
printf("Socket for TCP bound to port %dn", port);
}
同样,在此之前,我用这个函数memset内存块。
void TCPSocket::initializeSocket1()
{
// Fill tcpSocket struct with 0's
memset(&myAddress, ' ', sizeof(myAddress));
myAddress.sin_family = AF_INET;
myAddress.sin_addr.s_addr = INADDR_ANY;
// Conver PORT to big-endian if necessary
myAddress.sin_port = htons(this->port);
}
变量在类的头文件中声明。
public:
struct sockaddr_in myAddress, clientAddress;
void buildTCPSocket(int newPort);
private:
int port;
int socket1, socket2;
socklen_t clientAddressLength;
—编辑代码现在应该更清楚一点了。在getSocket()中初始化socket1。
我已经看到了一堆人错过了父母在if,但我认为我消除了错误通过声明myAddressSize和bindReturnValue。
欢迎任何意见。
谢谢你!泰德S
好,问题解决了。当然,问题永远不在于你在哪里找,你会在哪里找到它。这是更正后的代码。问题是在调用socket()时缺少一组父类。
void TCPSocket::getSocket()
{
// Get an internet domain socket AF_INET
if((socket1 = socket(AF_INET, SOCK_STREAM,0)) == -1)
{
perror("socket");
exit(1);
}
}
再次感谢!
我几乎可以向你保证,你得到这个错误是因为你没有初始化socket1。
通常你需要这样做:
int socket1 = socket(AF_INET, SOCK_STREAM, 0);
bind(socket1, ...);
我没有看到任何代码在那里设置socket1。毕竟,这就是错误消息告诉您的内容。Socket1不是套接字,所以失败。
编辑:接下来,这也是我尽量避免使用 语法的原因之一。if ((foo = bar()) == ERROR)
{
// handle me
}
用:
void TCPSocket::getSocket()
{
// Get an internet domain socket AF_INET
socket1 = socket(AF_INET, SOCK_STREAM, 0);
if (socket == -1)
{
perror("socket");
exit(1);
}
}
相关文章:
- 当套接字连接断开时检测C/C++Unix
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 套接字读取后,我在缓冲区中看到意外输入
- 如何使用阻止套接字 API 添加消息发送操作 (smtp) 的进度?
- 无法对套接字执行操作,因为系统缺少足够的缓冲区空间或队列已满
- C/C++ 套接字:如果我在 IPv6 TCP 连接之前执行任何操作,则连接将失败
- 使用 CAsynSocket,如何捕获套接字操作的退出代码?
- 哪些 IO 操作会导致在使用套接字时将完成数据包发送到完成端口
- 套接字API:非套接字上的套接字操作
- 如何处理在同一套接字上发布多个操作的情况
- 取消套接字轮询操作
- 大规模套接字操作的分段故障
- 非套接字上的套接字操作,zmq选项
- Poco:如何从另一个线程中止阻塞套接字操作
- 多线程套接字操作与进度条更新
- Unix套接字:具有多个关联集的select()执行的操作超出了它应该执行的操作
- 来自 Boost::asio 套接字async_read_some操作的内存泄漏
- bind:对非套接字的套接字操作