向服务器发送数据时出错

时间:2015-08-17 07:45:33

标签: c++ sockets tcp

为什么在运行程序并将数据发送到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

1 个答案:

答案 0 :(得分:0)

在服务器的recvsend调用中,您需要传递从accept返回的套接字。

所以而不是

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

DO

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

同样适用于send电话。

此外,请勿在{{1​​}}和n上致电关闭,也就是说删除这两行代码:

m

编辑:对不起,当我在这里时,这可能不是您在客户的 close(n); close(m); send_data中的意图:

rec_data
相关问题