Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
telnet客户端在recv()之后没有响应_C_Linux_Sockets_Telnet - Fatal编程技术网

telnet客户端在recv()之后没有响应

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

我刚刚开始学习如何编写socket代码,但有一个我无法解决的问题

因此,我试图创建一个telnet客户端,我成功地从服务器接收到了第一条消息,但在这条接收线之后,我的程序卡住了,无法执行任何其他操作。甚至连简单的printf行都没有

提前感谢,, 瑞奇

代码如下:

#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.