Проблема с TCP и UDP соединениями в программе на C - PullRequest
1 голос
/ 09 октября 2011

Я пытаюсь реализовать механизм, при котором клиент отправляет закодированное сообщение через UDP на сервер.При получении этого сообщения необходимо установить TCP-соединение между сервером и клиентом.Я сталкиваюсь с этой странной проблемой: когда я пытаюсь установить TCP-соединение с клиентом, connect() не выполняется на стороне клиента, если сервер получил UDP-пакет от клиента как раз заранее.Если я пытаюсь установить TCP-соединение с клиентом без каких-либо сообщений UDP, то все работает нормально.Я приложил код со стороны сервера и стороны клиента.

int sockfd, sockfd2, newsockfd, n;
char msg[1000];
sockaddr_in serverAddress, serverAddress2, clientAddress;
socklen_t len = sizeof(clientAddress);

/*create a socket*/
sockfd = socket(AF_INET, SOCK_DGRAM, 0);

/*bind socket to an address*/
serverAddress.sin_family = AF_INET;
serverAddress.sin_addr.s_addr = INADDR_ANY;
serverAddress.sin_port = htons(12330);
bind(sockfd, (sockaddr *)&serverAddress, sizeof(sockaddr_in));

/*-----*/
n = recvfrom(sockfd, msg, 1000, 0, (sockaddr *)&clientAddress, &len);
sendto(sockfd, msg, strlen(msg), 0, (sockaddr *)&clientAddress, sizeof(clientAddress));

sockfd2 = socket(AF_INET, SOCK_STREAM, 0);
bzero(&serverAddress2,sizeof(serverAddress2));
serverAddress2.sin_family = AF_INET;
serverAddress2.sin_addr.s_addr = INADDR_ANY;
serverAddress2.sin_port = htons(12345);
bind(sockfd2, (sockaddr *)&serverAddress2, sizeof(serverAddress2));
listen(sockfd2, 10);

newsockfd = accept(sockfd2, (sockaddr *)&clientAddress, &len);
close(sockfd);
close(newsockfd);
close(sockfd2);

Кроме того, ни одна из функций bind(), listen() или socket() не выдает ошибку.

код на стороне клиента выглядит следующим образом: -

/* create a UDP socket: SOCK_DGRAM */
sockfd = socket(AF_INET,SOCK_DGRAM,0);
printf("enter data ");
gets(sendline);  

sendto(sockfd, sendline, strlen(sendline), 0, (struct sockaddr *) &servaddr, sizeof(servaddr));

/* wait for echo */
slen = sizeof(servaddr);
n = recvfrom(sockfd, recvline, STRLEN, 0, (struct sockaddr *) &servaddr, &slen);
close(sockfd);

wait(1000);
sockfd2=socket(AF_INET,SOCK_STREAM, 0);
client_addr.sin_family = AF_INET;
client_addr.sin_addr.s_addr=INADDR_ANY;
client_addr.sin_port = htons(12345);
bind(sockfd2, (struct sockaddr *) &client_addr, sizeof(client_addr));

connect(sockfd2,(struct sockaddr *) &servaddr,sizeof(servaddr));

Соединение здесь возвращает -1.

1 Ответ

2 голосов
/ 09 октября 2011

Прежде всего, если connect() вернет -1, отметьте errno в <errno.h>. Это должно сказать вам, почему это несчастно.

Во-вторых, это, вероятно, связано с тем, что bind() клиентский сокет перед подключением, что выглядит странно. Вы обычно только bind() на стороне сервера, чтобы открыть порт для сокета. Клиентская сторона соединения обычно не связана с портом, поэтому, если вам это не нужно, отбросьте bind() и попробуйте снова.

...