c语言 - 套接字程序出现"Transport endpoint is already connected"错误



我正在尝试创建一个非常简单的客户端-服务器聊天程序,其中两个程序可以相互通信。但是,accept函数给了我一个错误"invalid argument"。我在这里粘贴代码:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <errno.h>
int main()
{
struct sockaddr_in myaddr;
struct sockaddr_in otheraddr;
int sockid;
int bindid;
int recvsockid;
int clientlen;
int connectid;
char send_msg[100] = "Program 1", recv_msg[100];
int recvid, sendid;
int myport_id = 4550;
int otherport_id = 4560;
sockid = socket(AF_INET, SOCK_STREAM, 0);
//fcntl(sockid, F_SETFL, O_NONBLOCK);
if (sockid < 0)
{
    printf("nCould not create socket");
}
bzero((char*)&myaddr, sizeof(struct sockaddr_in));
myaddr.sin_family = AF_INET;
myaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
myaddr.sin_port = htons(myport_id);
bzero((char*)&otheraddr, sizeof(struct sockaddr_in));
otheraddr.sin_family = AF_INET;
otheraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
otheraddr.sin_port = htons(otherport_id);

bindid = bind(sockid, (struct sockaddr*)&myaddr, sizeof(struct sockaddr_in));
if(bindid < 0)
    printf("bind error n");
listen(bindid, 5);
do
{
    connectid = connect(sockid, (struct sockaddr*)&otheraddr, sizeof(struct sockaddr_in));
if (connectid < 0 && !(errno == EINPROGRESS))
{
    //printf("%s", strerror(errno));
    perror("connect");
    exit(1);
}
    recvsockid = accept(sockid, (struct sockaddr*)&myaddr, &clientlen);
if (recvsockid < 0 && !(errno == EINPROGRESS || errno == EAGAIN))
{
    perror("accept");
    exit(1);
}
} while (connectid < 0 && recvsockid < 0);
do
{
    gets(send_msg);
    sendid = sendto(sockid, send_msg, 100, 0, (struct sockaddr*)&otheraddr, sizeof(struct sockaddr_in));
    fprintf(stderr, "%d", sendid);
    if(sendid < 0)
        printf("error3n");
    recvid = recvfrom(recvsockid, recv_msg, 100, 0, (struct sockaddr*)&myaddr, &clientlen);
    if (recvid < 0)
    {
        printf("nError in receive");
        break;
    }
} while (1);
return 0;
}

如果有人能告诉我为什么会出现这个错误,以及如何纠正,我将不胜感激

非常感谢。

您的问题是试图在同一个套接字sockid上进行连接和侦听。我敢肯定你是说bindid是为了听。

编辑0:

由于您在同一程序中创建TCP连接的两侧,因此需要两个套接字描述符,即在设置代码中对socket(2)的两个调用,一个用于连接,另一个用于接受客户端连接。

recvsockid = accept(sockid, (struct sockaddr*)&myaddr, &clientlen);

如果您查看accept()的文档,则尚未初始化clientlen

地址_伦指向socklen_t结构,该结构在输入时指定提供的sockaddr结构的长度,在输出时指定存储地址的长度。

因此,在调用accept()之前将其设置为myaddr的长度:

client_len = sizeof myaddr;
recvsockid = accept(sockid, (struct sockaddr*)&myaddr, &clientlen);

最新更新