telnet客户端在recv()之后没有响应
我刚刚开始学习如何编写socket代码,但有一个我无法解决的问题 因此,我试图创建一个telnet客户端,我成功地从服务器接收到了第一条消息,但在这条接收线之后,我的程序卡住了,无法执行任何其他操作。甚至连简单的printf行都没有 提前感谢,, 瑞奇 代码如下:telnet客户端在recv()之后没有响应,c,linux,sockets,telnet,C,Linux,Sockets,Telnet,我刚刚开始学习如何编写socket代码,但有一个我无法解决的问题 因此,我试图创建一个telnet客户端,我成功地从服务器接收到了第一条消息,但在这条接收线之后,我的程序卡住了,无法执行任何其他操作。甚至连简单的printf行都没有 提前感谢,, 瑞奇 代码如下: #include <stdio.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> void
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
void error_msg(char msg[256]){
printf("error at %s\n", msg);
}
void main(){
struct sockaddr_in serv_addr;
char buffer[2048], server_reply[2048];
printf("trying to connect to []...\n");
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd<0) error_msg("socket");
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr("192.168.0.1");
serv_addr.sin_port = htons(23);
int conn = connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr));
if(conn<0) error_msg("connect");
printf("connected to server\n");
bzero(server_reply, 2048);
bzero(buffer, 2048);
while(1){
int n_recv = recv(sockfd , server_reply , sizeof(server_reply) , 0);
if(n_recv > 0){
printf("%s", server_reply);
sleep(1);
scanf("%s" , buffer);
int n_send = send(sockfd , buffer , sizeof(buffer), 0);
if(n_send < 0) printf("send error, server is not responding...\n");
}
if(n_recv < 0) printf("recv error, server is not responding...\n");
}
close(sockfd);
}
#包括
#包括
#包括
#包括
无效错误消息(字符消息[256]){
printf(“错误在%s\n”,msg);
}
void main(){
服务地址中的结构sockaddr\u;
字符缓冲区[2048],服务器应答[2048];
printf(“正在尝试连接到[]…\n”);
int sockfd=套接字(AF_INET,SOCK_STREAM,0);
如果(sockfd不知道返回值是什么,则远程端可能已关闭连接:
请看我对您问题的评论,并发布这些数据,我应该能够提供更多帮助。当它大于0时,您正在打印,<0,但当它为0时,又如何呢?请输入fprintf(STDERR)(这很重要)在调用recv之前和之后,以及在one after中,返回码和errno设置为什么?另外,您如何知道是否成功接收到来自服务器的消息?如果n_recv为0,您将处于忙碌循环中-不会打印任何内容。此外,您是否确定正在接收任何数据。您是否尝试使用一些工具监控流量像Wireshark或tcpdump之类的东西?我已经检查过了。返回值是24,而不是0。使用Wireshark,我在recv()之后和send()之前丢失了服务器的响应。不要执行send(sockfd,buffer,sizeof(buffer),0)
而应该说send(sockfd,buffer,strlen(buffer),0)
。此外,telnet协议有一些必须遵守的初始化。感谢您的回答。我添加了一些printf来检查返回值,它不是0。它是24(我想是服务器响应线的大小?)。我还与wireshark进行了检查,显然服务器在recv()之后和send()之前已经停止回复我的连接此外,您不能只打印从recv获得的数据,也不能保证它以null结尾。
The return value will be 0 when the peer has performed an orderly shutdown.