【问题标题】:error in send data to server向服务器发送数据时出错
【发布时间】:2015-08-17 07:45:32
【问题描述】:

为什么在运行程序并发送数据到server 时返回这个错误recv failed: Transport endpoint is not connected 或者不显示server 接受只是在client 中显示发送数据函数的消息

server.cpp:

int main() {
    char packet[30];
    char buffer[20] = "I got your message";
    int conn_sock, comm_sock, n, m;
    struct sockaddr_in server_addr, client_addr;
    if ((conn_sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
        perror("Couldn't create socket");
        exit(1);
    }
    cout << "Already create socket!!!\n" << endl;

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(0);
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    memset(&server_addr, 0, sizeof(server_addr));
    if (bind(conn_sock, (struct sockaddr *) &server_addr, sizeof(server_addr))
            == -1) {
        perror("couldn't bind");
        exit(1);
    }
    if (listen(conn_sock, 10) == -1) {
        perror("couldn't listen");
        exit(1);
    }

    cout << "Listening For Connection...\r" << endl;
    socklen_t len = sizeof(server_addr);
    if (getsockname(conn_sock, (struct sockaddr *) &server_addr, &len) == -1)

        perror("getsockname");
    else
        printf("port number %d\n", ntohs(server_addr.sin_port));

    while (1) {
        memset(&client_addr, 0, sizeof(client_addr));
        if ((comm_sock = accept(conn_sock, (struct sockaddr *) &client_addr,
                (socklen_t *) &client_addr)) == -1) {
            perror("couldn't accept\n");
            continue;
        }
        cout << "accepted" << endl;
        bzero(packet, 10);
        m = recv(conn_sock, packet, 10, 0);

        if (m < 0) {
            perror("recv failed");
            exit(1);
        }
       cout<<"recieved"<<endl;
        /* Write a response to the client */
        n = send(conn_sock, buffer, sizeof(buffer), 0);

        if (n < 0) {
            perror("ERROR send to client");
            exit(1);
        }

        close(n);
        close(m);
        close(comm_sock);

    }
    close(conn_sock);
    return 0;
}

cilent.cpp:

#define MYPORT 51833
namespace personalization {
bool client::conn() {
    //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" << endl;
    }


    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(MYPORT);
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    if (connect(sock , (struct sockaddr *)&server_addr , sizeof(server_addr)) < 0)
        {
            perror("connect failed. Error");
            return false;
        }

        cout<<"Connected\n";
        return true;

    close(sock);

}
bool client::send_data() {
    //Send some data
     if( send(sock , packet , sizeof( packet ) , 0) < 0)
        {
            perror("Send failed");
            return false;
        }
        cout<<"Data send\n";

        return true;
        close(sock);
    }

bool client::rec_data() {
    char buffer[20];
    string reply;

    //Receive a echo from the server
    if (recv(sock, buffer, sizeof(buffer), 0) < 0) {
        perror("receive failed");
        return false;
    }

    reply = buffer;

    return true;
    close(sock);
}

client::client() {
    // TODO Auto-generated constructor stub
sock=-1;

}

输出是:

server:Already create socket!!!

Listening For Connection...

port number 51833
  client:  Socket created
    Connected
    Data send
    receive failed: Connection reset by peer

或:

server:Already create socket!!!

Listening For Connection...

port number 51833
client:Socket created
    Connected
    Data send
srver:accepted
recv failed: Transport endpoint is not connected

【问题讨论】:

    标签: c++ sockets tcp


    【解决方案1】:

    在服务器的recv和send调用中,需要传递accept返回的socket。

    所以不是

    m = recv(conn_sock, packet, 10, 0);
    

    做

    m = recv(comm_sock, packet, 10, 0);
    

    send 呼叫也是如此。

    另外,不要在n和m上调用close,也就是说去掉这两行代码:

        close(n);
        close(m);
    

    编辑:对不起,虽然我在这,这可能不是您在客户的 send_data 和 rec_data 中想要的:

    return true;
    close(sock);
    

    【讨论】:

    • 感谢您的回答错误已解决,但是当输出client 为data send 时,另一方面服务器不显示输出receive 和accepted 总是,有时显示...为什么???
    • 确保在cout 刷新到屏幕之前服务器不会终止。检查stackoverflow.com/questions/22345226/… 并可能考虑对这些消息使用无缓冲打印功能。如果原问题已解决,请标记为答案,谢谢
    • @carstan flush(cout) 是真的吗?如果是假的,你能告诉我吗...??
    • 我想我需要更多细节,例如:服务器是否继续运行,它是exit,还是您随时终止它?客户端是否成功发送数据并收到响应?您在实施的修复程序中看到了哪些打印输出?
    • 当我运行程序时,我看到已经创建了套接字!!! Listening For Connection... port number 53497 accepted received sending..... 或 Socket created Connected Data send receive your message 在 2 种情况下程序保持运行,是的服务器保持运行,是的客户端已成功发送和接收数据
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2020-10-08
    • 2010-12-03
    • 2016-06-07
    相关资源
    最近更新 更多