【问题标题】:TCP Sockets, "cannot assign requested address" and " Transport endpoint is already connected" errorsTCP 套接字,“无法分配请求的地址”和“传输端点已连接”错误
【发布时间】:2017-09-22 15:44:05
【问题描述】:

我是使用 TCP 套接字的新手,我不明白运行程序时遇到的错误。我有两个程序同时运行时我希望能够在它们之间传递消息。初始消息通过但随后在尝试返回另一条消息时出现两个错误。当我运行我的第一个程序时,输出是:

Input Message: hello

Waiting for incoming connections...

Connection accepted

Message Sent

Connection error: Transport endpoint is already connected 

现在同时运行另一个程序给出:

Input Message: Hello Back

Connected

Message received

hello

Bind error: Cannot assign requested address

如果有人能解释这些“无法分配请求的地址”和“传输端点已连接”错误,我将不胜感激!谢谢!

第一个程序是:

int main(int argc, char *argv[]) {

    int socket_info, new_socket;
    struct sockaddr_in server, client;
    char message[100];
    char incoming_message[100];

printf("Input Message: ");

fgets(message, 100, stdin);

        //create socket
        socket_info = socket(AF_INET, SOCK_STREAM, 0);
        if (socket_info == -1) {
        printf("Could not create socket");
        }

        //assign values
        server.sin_addr.s_addr = INADDR_ANY;
        server.sin_family = AF_INET;
        server.sin_port = htons( 1100 );

    int y=1;
        if(setsockopt(socket_info, SOL_SOCKET, SO_REUSEADDR, (char*)&y, sizeof(y)) == -1) {
    perror("set reuseaddr");
    return -1;
        }

        //binds socket
        if (bind(socket_info, (struct sockaddr *)&server, sizeof(server)) < 0) {
        perror("Bind error");
        return 1;
        }

        //listen
        listen(socket_info , 5);

        //waiting for connection
        puts("Waiting for incoming connections...");
        int c = sizeof(struct sockaddr_in);

        //accept connection
        new_socket = accept(socket_info, (struct sockaddr *)&client, (socklen_t*)&c);
        if (new_socket < 0){
        perror("accept failed");
        return 1;
        }
        puts("Connection accepted");

        //send message
        if( send(new_socket , message , strlen(message) , 0) < 0) {
        perror("Send failed");
        return 1;
        }
        puts("Message Sent");

        //connects
        if (connect(socket_info, (struct sockaddr *)&server, sizeof(server)) < 0) {
        perror("Connection error");
        return 1;
        }
        puts("Connected");

        //Receive an incoming message
        if( recv(socket_info, incoming_message , sizeof(incoming_message) , 0) < 0) {
        perror("Received failed");
        return 1;
        }
        puts("Message received");
    incoming_message[strlen(incoming_message)-1]=0;
        puts(incoming_message);

close(socket_info);
}

第二个程序是:

int main(int argc, char *argv[]) {

    int socket_info, new_socket;
    struct sockaddr_in server, client;
    char incoming_message[100];
    char message[100];

printf("Input Message: ");

fgets(message, 100, stdin);

        //create socket
        socket_info = socket(AF_INET, SOCK_STREAM, 0);
        if (socket_info == -1) {
        printf("Could not create socket");
        }

        //assign values
        server.sin_addr.s_addr = inet_addr("172.21.8.178");
        server.sin_family = AF_INET;
        server.sin_port = htons( 1100 );

        //connects
        if (connect(socket_info, (struct sockaddr *)&server, sizeof(server)) < 0) {
        perror("Connection error");
           return 1;
        }
        puts("Connected");

        //Receive an incoming message
        if( recv(socket_info, incoming_message , sizeof(incoming_message) , 0) < 0) {
        perror("Received failed");
        return 1;
        }
        puts("Message received");
    incoming_message[strlen(incoming_message)-1]=0;
        puts(incoming_message);

    int y=1;
       if(setsockopt(socket_info, SOL_SOCKET, SO_REUSEADDR, (char*)&y, sizeof(y)) == -1) {
    perror("set reuseaddr");
    return -1;
        }

        //binds socket
        if (bind(socket_info, (struct sockaddr *)&server, sizeof(server)) < 0) {
        perror("Bind error");
        return 1;
        }

        //listen
        listen(socket_info , 5);

        //waiting for connection
        puts("Waiting for incoming connections...");
        int c = sizeof(struct sockaddr_in);

        //accept connection
        new_socket = accept(socket_info, (struct sockaddr *)&client, (socklen_t*)&c);
        if (new_socket < 0){
        perror("accept failed");
        return 1;
        }
        puts("Connection accepted");

    //send message
        if( send(new_socket , message , strlen(message) , 0) < 0) {
        perror("Send failed");
        return 1;
        }
        puts("Message Sent");

close(socket_info);
}

【问题讨论】:

    标签: c sockets tcp


    【解决方案1】:
      if (connect(socket_info, (struct sockaddr *)&server, sizeof(server)) < 0) {
        perror("Connection error");
        return 1;
        }
    
    Connection error: Transport endpoint is already connected 
    

    我假设上面的socket_info 应该是new_socket

    您无法连接侦听套接字。

    您不需要连接监听套接字。您刚刚接受了来自客户端连接的套接字。您应该使用该套接字对该客户端执行 I/O。

    在你的第二个程序中:

    if(setsockopt(socket_info, SOL_SOCKET, SO_REUSEADDR, (char*)&y, sizeof(y)) == -1) {
    perror("set reuseaddr");
    return -1;
        }
    

    这是徒劳的。套接字已通过前面的 connect() 调用隐式绑定。

        //binds socket
        if (bind(socket_info, (struct sockaddr *)&server, sizeof(server)) < 0) {
        perror("Bind error");
        return 1;
        }
    
    Bind error: Cannot assign requested address
    

    您不能绑定已经连接的套接字。

    您也不能将套接字绑定到远程地址。

    你也不能监听连接的套接字。

    你也不能接受它。您不需要需要绑定、收听或接受它。您已经连接到对等体。

    简而言之,您的代码没有任何意义。你需要找到一个合适的教程并学习它。

    incoming_message[strlen(incoming_message)-1] = 0;
    

    这更没有意义。在这里,您正在搜索尾随空字节(甚至可能不存在)并将其前面的字节替换为...空字节。为什么?

    【讨论】:

      猜你喜欢
      • 2018-01-02
      • 2021-07-05
      • 2023-01-18
      • 1970-01-01
      • 2012-04-10
      • 2020-08-05
      • 2020-01-24
      • 2011-10-31
      • 2016-06-28
      相关资源
      最近更新 更多