Программа сокетов выдает ошибку "Конечная точка транспорта уже подключена"

Я пытаюсь создать очень простую клиент-серверную программу чата, в которой две программы могут общаться друг с другом. Однако функция принятия дает мне ошибку «недопустимый аргумент». Я вставляю код здесь:

#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("error3\n");

    recvid = recvfrom(recvsockid, recv_msg, 100, 0, (struct sockaddr*)&myaddr, &clientlen);
    if (recvid < 0)
    {
        printf("\nError in receive");
        break;
    }

} while (1);

return 0;
}

Буду признателен, если кто-нибудь подскажет, почему я получаю эту ошибку и как ее исправить.

Большое спасибо.


person Arani    schedule 26.03.2012    source источник


Ответы (2)


Ваша проблема в том, что вы пытаетесь подключиться и прослушивать один и тот же сокет sockid. Я почти уверен, что вы имели в виду bindid для прослушивания.

Редактировать 0:

Поскольку вы создаете обе стороны TCP-подключения в одной и той же программе, вам нужны два дескриптора сокета, то есть два вызова socket(2) в коде установки, один для подключения и один для приема клиентских подключений.

person Nikolai Fetissov    schedule 26.03.2012
comment
Я исправил ошибку. Однако теперь я получаю сообщение об ошибке Недопустимый аргумент от функции принятия. - person Arani; 26.03.2012

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

Вы не инициализировали clientlen, если вы посмотрите документацию для accept():

address_len Указывает на структуру socklen_t, которая на входе указывает длину предоставленной структуры sockaddr, а на выходе указывает длину сохраненного адреса.

Итак, перед вызовом accept() установите для него длину myaddr:

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