Я пытаюсь настроить хостинг TCP / UDP-сервера на том же порту.
UDP-часть работает нормально, но TCP-часть не получает сообщения должным образом.
Я пытался протестироватьэто с Netcat, например.когда я посылаю «TCP yu do dis», он выводит что-то вроде «D (») и продолжает вращаться в цикле do while.
//Creating TCP listen socket
tcp_listenfd=socket(AF_INET, SOCK_STREAM, 0);
bzero(&tcp_servaddr, sizeof(tcp_servaddr));
tcp_servaddr.sin_family=AF_INET;
tcp_servaddr.sin_port=htons(atoi(tcp_port));
tcp_servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
//Binding TCP socket
setsockopt(tcp_listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
bind(tcp_listenfd,(struct sockaddr*)&tcp_servaddr,sizeof(tcp_servaddr));
listen(tcp_listenfd, 10);
//Creating UDP listen socket
udp_listenfd=socket(AF_INET, SOCK_DGRAM, 0);
bzero(&udp_servaddr, sizeof(udp_servaddr));
udp_servaddr.sin_family=AF_INET;
udp_servaddr.sin_port=htons(atoi(udp_port));
udp_servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
//Binding UDP listen socket
bind(udp_listenfd, (struct sockaddr*)&udp_servaddr, sizeof(udp_servaddr));
//Clear descriptor set
FD_ZERO(&rset);
//Max file descriptor
maxfd = max(tcp_listenfd, udp_listenfd)+1;
while(1){
// set listenfd and udpfd in readset
FD_SET(tcp_listenfd, &rset);
FD_SET(udp_listenfd, &rset);
nready = select(maxfd, &rset, NULL, NULL, NULL);
if (FD_ISSET(tcp_listenfd, &rset)) {
printf("TCP ready!\n");
len=sizeof(cli_addr);
connfd = accept(tcp_listenfd, (struct sockaddr*)&cli_addr, &len);
do {
numbytes=recv(tcp_listenfd, tcp_buff, sizeof(tcp_buff), 0);
printf("Received message: %s\n", tcp_buff);
}while(strcmp(tcp_buff, "HELLO\n")!=0);
send(tcp_listenfd, payload, strlen(payload)+1, 0);
close(connfd);
bzero(&cli_addr, sizeof(cli_addr));
}
if(FD_ISSET(udp_listenfd, &rset)){
printf("UDP ready!\n");
len=sizeof(cli_addr);
do{
recvfrom(udp_listenfd, udp_buff, 1024, 0,(struct sockaddr *)&cli_addr, &len);
}while(strcmp(udp_buff, "HELLO\n")!=0);
sendto(udp_listenfd, payload, strlen(payload)+1, 0, (struct sockaddr *)&cli_addr, len);
close(udp_listenfd);
bzero(&cli_addr, sizeof(cli_addr));
}
}