注册

Linux报 “socket is not connected” 异常的原因以及解决办法

当调用一些socket系统调用(例如send、recv、connect、accept等)时,会出现"socket is not connected"错误信息。这种错误通常是由以下几个原因引起的:

  1. socket创建时未绑定地址,而在发送或接收数据时调用了send、recv等函数。

  2. socket断开连接,但未使用shutdown函数关闭该socket,再次调用send、recv等函数时会出现错误信息。

  3. 在socket未连接时调用了connect函数。

解决这些问题可以通过以下几种方式:

  1. 绑定地址
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
inet_pton(AF_INET, IP, &addr.sin_addr.s_addr);
/*创建套接字, 设置套接字为非阻塞模式*/
socket_fd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
/*绑定地址到套接字*/
if(bind(socket_fd, (struct sockaddr*)&addr, sizeof(addr)) < 0){
    perror("bind error");
    return -1;
}
  1. 关闭socket连接
close(socket_fd);
  1. 连接socket
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_port = htons(PORT);
inet_pton(AF_INET, IP, &addr.sin_addr.s_addr);
/*创建套接字, 设置套接字为非阻塞模式*/
socket_fd = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);
/*连接服务器*/
if( connect(socket_fd, (struct sockaddr*)&addr, sizeof(addr)) < 0){
    if(errno != EINPROGRESS){
        printf("Connect Error: %s\n", strerror(errno));
        return -1;
    }
    /*调用select等待连接结果*/
    FD_ZERO(&write_fds);
    FD_SET(socket_fd, &write_fds);
    if(select(socket_fd + 1, NULL, &write_fds, NULL, NULL) < 0){
        printf("Select Error: %s\n", strerror(errno));
        return -1;
    }
    if(!FD_ISSET(socket_fd, &write_fds)){
        printf("Connect Error: Timeout\n");
        return -1;
    }
}

总之,解决"socket is not connected"问题的关键是找到引发问题的原因,然后采取适当的措施。