“TCP套接字”;无法分配请求的地址";及;“传输终结点已连接”;错误

“TCP套接字”;无法分配请求的地址";及;“传输终结点已连接”;错误,c,sockets,tcp,C,Sockets,Tcp,我不熟悉使用TCP套接字,我不理解在运行程序时遇到的错误。我有两个程序,当同时运行时,我希望能够在两个程序之间传递消息。最初的消息通过了,但是当试图返回另一条消息时,我得到了两个错误。当我运行第一个程序时,输出为: Input Message: hello Waiting for incoming connections... Connection accepted Message Sent Connection error: Transport endpoint is already

我不熟悉使用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);
}
intmain(intargc,char*argv[]){
int插座信息,新插座;
服务器、客户端中的结构sockaddr_;
字符消息[100];
字符传入_消息[100];
printf(“输入消息:”);
fgets(信息,100,标准输入);
//创建套接字
socket\u info=socket(AF\u INET,SOCK\u STREAM,0);
如果(套接字信息==-1){
printf(“无法创建套接字”);
}
//赋值
server.sin\u addr.s\u addr=INADDR\u ANY;
server.sinu family=AF\u INET;
server.sin_port=htons(1100);
int y=1;
if(setsockopt(socket\u info,SOL\u socket,SO\u REUSEADDR,(char*)&y,sizeof(y))=-1){
perror(“set reuseaddr”);
返回-1;
}
//绑定套接字
if(绑定(socket_info,(struct sockaddr*)&server,sizeof(server))<0){
perror(“绑定错误”);
返回1;
}
//听
听(插座信息,5);
//正在等待连接
puts(“等待传入连接…”);
int c=sizeof(结构sockaddr_in);
//接受连接
新建套接字=接受(套接字信息,(结构sockaddr*)和客户端,(socklen\u t*)和c);
如果(新的_插座<0){
perror(“接受失败”);
返回1;
}
看跌期权(“已接受连接”);
//发送消息
如果(发送(新的_套接字,消息,strlen(消息),0)<0){
perror(“发送失败”);
返回1;
}
放入(“已发送的消息”);
//连接
if(connect(socket_info,(struct sockaddr*)&server,sizeof(server))<0){
perror(“连接错误”);
返回1;
}
看跌期权(“关联”);
//接收传入消息
if(recv(套接字信息、传入消息、sizeof(传入消息)、0)<0){
perror(“接收失败”);
返回1;
}
puts(“收到的信息”);
传入_消息[strlen(传入_消息)-1]=0;
puts(传入消息);
关闭(插座信息);
}
第二个方案是:

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);
}
intmain(intargc,char*argv[]){
int插座信息,新插座;
服务器、客户端中的结构sockaddr_;
字符传入_消息[100];
字符消息[100];
printf(“输入消息:”);
fgets(信息,100,标准输入);
//创建套接字
socket\u info=socket(AF\u INET,SOCK\u STREAM,0);
如果(套接字信息==-1){
printf(“无法创建套接字”);
}
//赋值
server.sin_addr.s_addr=inet_addr(“172.21.8.178”);
server.sinu family=AF\u INET;
server.sin_port=htons(1100);
//连接
if(connect(socket_info,(struct sockaddr*)&server,sizeof(server))<0){
perror(“连接错误”);
返回1;
}
看跌期权(“关联”);
//接收传入消息
if(recv(套接字信息、传入消息、sizeof(传入消息)、0)<0){
perror(“接收失败”);
返回1;
}
puts(“收到的信息”);
传入_消息[strlen(传入_消息)-1]=0;
puts(传入消息);
int y=1;
if(setsockopt(socket\u info,SOL\u socket,SO\u REUSEADDR,(char*)&y,sizeof(y))=-1){
perror(“set reuseaddr”);
返回-1;
}
//绑定套接字
if(绑定(socket_info,(struct sockaddr*)&server,sizeof(server))<0){
perror(“绑定错误”);
返回1;
}
//听
听(插座信息,5);
//正在等待连接
puts(“等待传入连接…”);
int c=sizeof(结构sockaddr_in);
//接受连接
新建套接字=接受(套接字信息,(结构sockaddr*)和客户端,(socklen\u t*)和c);
如果(新的_插座<0){
perror(“接受失败”);
返回1;
}
看跌期权(“已接受连接”);
//发送消息
如果(发送(新的_套接字,消息,strlen(消息),0)<0){
perror(“发送失败”);
返回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;