Я пытаюсь реализовать механизм, при котором клиент отправляет закодированное сообщение через 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
.