【问题标题】:connect to socket failed - errno 88 (cpp)连接到套接字失败 - errno 88 (cpp)
【发布时间】:2017-06-20 13:06:54
【问题描述】:

我正在尝试创建服务器/客户端通信,但它使用 errno 88 连接函数失败。我检查了 socketfd 是否有效(因为这个 errno 意味着我正在尝试对非套接字对象进行套接字操作)。

int main (int argc, char *argv[])
{
// Validity check
if (argc != VALID_ARG_NUM) {
    std::cout << INVALID_ARG;
    return 0; // todo - return 0 is correct??
}

int port;
struct sockaddr_in server_address;

// server_address initialization.
server_address.sin_family = AF_INET;
server_address.sin_port = htons((uint32_t)atof(argv[3]));
server_address.sin_addr.s_addr = inet_addr(argv[2]);
memset(&(server_address.sin_zero), '\0', sizeof(server_address));

// Create the client socket.
if (sockfd = socket(AF_INET, SOCK_STREAM, 0) < 0) {
    std::cout << "ERROR: socket " << errno << "." << std::endl;
    exit(1);
}
// Connect to server.
if (connect(sockfd, (struct sockaddr *)&server_address, sizeof(server_address)) < 0) {
    std::cout << "ERROR: connect " << errno << "." << std::endl;
    std::cout << CON_FAIL;
    close(sockfd);
    exit(1);
}
.......

谢谢。

【问题讨论】:

  • 如果您有可用的 Boost,或者能够下载它,我强烈建议您使用 Boost Asio 进行套接字编程。
  • errno 中的错误代码实际上是平台相关的。请告诉我们您使用的平台(操作系统)。并使用例如strerror 从错误代码中获取可打印的字符串。
  • 对不起,操作系统是linux。
  • 好的,我按照你告诉我的那样更改了它,但它仍然卡住 - 管道坏了..
  • Bind return error 88的可能重复

标签: c++ sockets


【解决方案1】:

语句的优先级

sockfd = socket(AF_INET, SOCK_STREAM, 0) < 0

sockfd = ((socket(AF_INET, SOCK_STREAM, 0)) < 0)

因此您分配了一个布尔值,它被隐式转换为整数(或sockfd 具有的任何类型)。你的意思可能是

(sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0

【讨论】:

  • 好的,我按照你告诉我的那样更改了它,但它仍然卡住 - 管道坏了..
  • @MichalShalom:嗯,就是an entirely different problem
【解决方案2】:

我认为这部分导致缓冲区溢出:

memset(&(server_address.sin_zero), '\0', sizeof(server_address));

在编写某些字段之前,您应该将整个结构归零:

struct sockaddr_in server_address;
// server_address initialization.
memset(&server_address, 0, sizeof(server_address));
server_address.sin_family = AF_INET;

【讨论】:

  • 我改了,还是 errno 88 :/
【解决方案3】:

Broken pipe 通常意味着远程对等端关闭连接。你确定你的服务器代码没问题吗?也许它只是做这样的事情?

int main()
{
...
listen();
accept();

return 0;//procees exits and therefore brakes connection
}

【讨论】:

    猜你喜欢
    • 2015-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    相关资源
    最近更新 更多