c++ - 绑定(bind)套接字失败,errno 88

标签 c++ sockets serversocket

<分区>

我正在为我的问题寻找答案,但没有找到相关的答案。 我正在编写一个非常简单的代码,用于在运行 ubuntu 14.04 的虚拟机 (VBOX) 上运行服务器。

我关闭了我的防火墙和我的防病毒程序(读到它可能是相关的)

我重新检查(并寻找​​不同的端口)该端口未在使用中,但继续接收 bind() 函数的返回值 -1,错误号为 88(非套接字上的套接字操作)。

我在端口 7777 上运行服务器。 还尝试在我的主机上运行此代码

有人可以建议我做错了什么吗?

p.s 还用 valgrind 检查了代码是否有内存泄漏,但看起来没问题。

代码如下:

#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <iostream>
#include <fstream>
#include <strings.h>
#include <stdlib.h>
#include <string>
#include <pthread.h>
#include <errno.h>

using namespace std;

#define NUM_OF_THREADS  3

static int  connFd;

void *task1(void *);

/*
 * 
 */
int main(int argc, char** argv) {

    int pid, portNo, listenFd;
    socklen_t len; // store the size of the address
    bool loop = false;
    struct sockaddr_in svrAdd, clntAdd;

    pthread_t threadArr[NUM_OF_THREADS];

    if (argc < 2){
        cerr << "ERROR: ./server <port>" << endl;
        return 0;
    }

    portNo = atoi(argv[1]); // TODO verify the port is between 1024 and 65535

    //Create the socket
    if (listenFd = socket(AF_INET, SOCK_STREAM, 0) < 0){
        cerr << "ERROR: cannot open socket." << endl;
        return 0;
    }

    bzero((char*)&svrAdd, sizeof(svrAdd));

    svrAdd.sin_family = AF_INET;
    svrAdd.sin_addr.s_addr = INADDR_ANY;
    svrAdd.sin_port = htons(portNo);

    cout << "port number is : " << portNo << endl;

    //bind socket
    int bound = bind(listenFd, (struct sockaddr *)&svrAdd, sizeof(svrAdd));
    if ( bound < 0 ){
        cerr << "ERROR: cannot bind, error number: " << errno << endl;
        return 0;
    }

    listen(listenFd, 5);

    len = sizeof(clntAdd);

    int noTread = 0;

    while(noTread < 3){
        cout << "Listening..." << endl;

       if (connFd = accept(listenFd, (struct sockaddr*)&clntAdd, &len)<0){
            cerr << "ERROR: cannot accept connection" << endl;
            return 0;
        }
        else{
            cout << "Connection successful" << endl;
        }

        pthread_create(&threadArr[noTread], NULL, task1, NULL);
        noTread++;
    }

    for (int i=0; i < 3; i++){
        pthread_join(threadArr[i], NULL);
    }
    /*int sockfd, newsockfd, portno, clilen, n;
    char buffer[256];
    struct sockaddr_in serv_addr, cli_addr;

    if (argc < 2){
        fprintf(stderr, "ERROR, no port provided");
        exit(1);
    }

    if(sockfd = socket(AF_INET, SOCK_STREAM, 0) <  0){
        error("ERROR opening socket");
    }

    bzero((char *) &serv_addr, sizeof(serv_addr));

    portno = atoi(argv[1]);
    serv_addr.sin_family = AF_INET;

    serv_addr.sin_port = htons(portno);
    serv_addr.sin_addr.s_addr - INADDR_ANY;

    if(bind(sockfd, (struct sockaddr*)&))*/

    return 0;
}

void *task1(void *dummyPt){
    cout << "Thread number:  " << pthread_self() << endl;
    char test[300];
    bzero(test, 301);
    bool loop = false;
    while (!false){
        bzero(test, 301);
        read(connFd, test, 300);
        string tester(test);
        cout << "\n\t\t TESTER = " << tester << endl;

        if(tester == "exit"){
            break;
        }
    }
    cout << "\n Closing thread and conn" << endl;
    close(connFd);
}

执行结果:

错误:无法绑定(bind),错误号:88 端口号是:7777

运行成功(总时间:162ms)

请帮忙, 谢谢。

最佳答案

if (listenFd = socket(AF_INET, SOCK_STREAM, 0) < 0){

优先级问题。此条件的结果是将 0 或 1 分配给 listenFd。 试试这个:

if ((listenFd = socket(AF_INET, SOCK_STREAM, 0)) < 0){

关于c++ - 绑定(bind)套接字失败,errno 88,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30139702/

相关文章:

C++ 奇怪的访问冲突 Visual Studio 2015 RC

python - Python套接字编程如何接收所有数据

c - 对 `writen' 的 undefined reference

ruby-on-rails - 将 Apache 负载均衡器代理到 Unix 套接字而不是端口

python - 我怎样才能让我的连接计数器下降

java - 如何从客户端服务器程序中的服务器控制台获取输入

java - Android ServerSocket 端口选择

c++ - 包含对其他对象的引用的对象的深层拷贝

我的输入文件中没有读取 C++ 空格?

c++ - 从 Maven 访问自定义(非 Java) Artifact 存储库