【问题标题】:Bad file descriptor error while sending data through tcp socket通过 tcp 套接字发送数据时出现错误的文件描述符错误
【发布时间】:2015-11-07 10:12:02
【问题描述】:

我想创建数据然后发送到server。在添加新传感器(每个传感器都是一个新网络)后,来自每个传感器信息的数据应在Network.cpp 中创建并使用client.cpp 发送,我使用继承使用Network 类的函数添加到client 类或反之亦然,但我需要帮助才能为我的程序工作正确使用功能。当我运行程序时出现此错误:

连接失败。错误:错误的文件描述符

我错过了什么?

Network.h:

class Network :public client{
public:
    Network();
    void add(Sensor new_sensor);
    virtual ~Network();
private:
    vector<Sensor> sensors;
}

Network.cpp:

void Network::add(const client &a,Sensor new_sensor) {
    sensors.push_back(new_sensor);
    unsigned int Header[2] = {0xe1,0xe2};
    uint16_t u16;
    u16 = htons(Header[2]);
    memcpy(packet + 0, &u16, 2);
    unsigned int SensorSn[4] = { 0x1e, 0x25, 0x71, 0x80 };
    uint32_t u32;
    u32 = htons(SensorSn[4]);
    memcpy(packet + 2, &u32, 4);
    uint32_t a32;
    unsigned int SensorTemp[4] = { 0x00, 0x00, 0x00, 0x23 };
    a32 = htons(SensorTemp[4]);
    memcpy(packet + 6, &a32, 4);
        a.send_data();
}

client.h:

class client {
public:
    client();
    void conn(string, int);
    void send_data() const;
    string receive(int);
    virtual ~client();
private:
    int sock;
    struct sockaddr_in server_addr;
protected:
    char packet[10];
};

} 

client.cpp:

void client::conn(string address, int port) {
    //create socket if it is not already created
    if (sock == -1) {
        //Create socket
        sock = socket(AF_INET, SOCK_STREAM, 0);
        if (sock == -1) {
            perror("Could not create socket");
        }

        cout << "Socket created\n" << endl;  //doesn't show this line!!!
    }
    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(1234);
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    while(1){
    int m=connect(sock, (struct sockaddr *) &server_addr, sizeof(server_addr));
    if (m==-1){
        perror("connect failed. Error");       
        continue;
    }
    }
    cout << "Connected\n";  //doesn't show this line!!!
    close(sock);


}
void client::send_data()const {
    int n=send(sock, packet, sizeof(packet), 0)  ;
if (n==-1){
    perror("send failed. Error");  ///my program stop in this line
            exit(1);

}
    cout << "Data send"<<endl;

    close(sock);
}

【问题讨论】:

  • 编译时包含所有警告和调试信息 (g++ -Wall -Wextra -g)。使用调试器 (gdb)。 sock 是什么?它是如何初始化的? client 构造函数是什么?你的问题跑题了,我们不会调试你的代码。

标签: c++ sockets tcp


【解决方案1】:

您是否记得在构造函数中将sock 初始化为-1

【讨论】:

  • @everybody 计划否决这个答案:这是一个反问。这是一个答案。这是一个正确的答案。显然 socket 变量没有被设置为一个有效的 socket,很明显这里提到的原因就是原因。
猜你喜欢
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 2016-09-17
  • 1970-01-01
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 2019-01-28
相关资源
最近更新 更多