gpt4 book ai didi

c - 为什么 TCP 服务器收到损坏的消息?

转载 作者:行者123 更新时间:2023-11-30 14:39:18 25 4
gpt4 key购买 nike

我正在尝试在同一端口上设置托管 TCP/UDP 服务器。

UDP 部分工作正常,但 TCP 部分无法正常接收消息。

我尝试用 netcat 例如测试它。当我发送“TCP y u 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));
}
}

最佳答案

好的,问题就在这里:

 connfd = accept(tcp_listenfd, (struct sockaddr*)&cli_addr, &len);
do {
numbytes=recv(tcp_listenfd, tcp_buff, sizeof(tcp_buff), 0);

在您的 recv() 调用中,您在应该传入 connfd 时传入了 tcp_listenfd 。 (此外,您还应该检查所有函数调用的返回值,以确保函数成功,并在函数调用失败时采取适当的操作(例如通过 perror() 打印错误消息)。有关返回值构成该函数的成功与失败的详细信息,请参阅每个函数的手册页)

关于c - 为什么 TCP 服务器收到损坏的消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56131893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com