TCP套接字,“无法分配请求的地址”和“传输端点已连接”错误

时间:2015-08-11 03:07:37

标签: c sockets tcp

我是使用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);
}

1 个答案:

答案 0 :(得分:2)

  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;

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