Wireshark 显示 CR 从我的服务器应用程序发送到客户端,但我的程序将 CR 发送到与客户端不同的 IP/端口

Wireshark shows CR being sent to a client from my server app but my program sends a CR to a different IP/Port than the client

提问人:rabbit 提问时间:10/14/2023 更新时间:10/14/2023 访问量:52

问:

我有一个简单的 linux ansi c 套接字程序,它基本上侦听 tcp 端口 (infd),接受来自一个保持连接的输入设备的连接(不是我的选择),然后逐字节读取数据,并在适当的时候将其写入第三个设备 (outfd)。第三种设备要求在每个命令后发送回车。它唯一一次写回输入设备是当它收到“空闲”消息时,我在程序的主循环中写回以下响应。

unsigned char idle[3];  
idle[0]=0xF1;
idle[1]=0x00;
idle[2]=0xFF;

//idle message TCP only xF1x00xFF
if(recieved==0xF1){
    res = read(infd,&recieved,1);
    res = read(infd,&recieved,1);
    res = write(infd,idle,3);

}

我唯一写回车符的地方发生在一个单独的函数中,因此文件描述符是一个局部变量。

int sendOutput(unsigned char *data, struct sockaddr_in *outaddr){
        int n,outfd;
    if ((outfd = socket(AF_INET, SOCK_STREAM, 0)) <0) {
        fprintf(errorfd,"ERROR creating output socket to send out\n");
        fclose(errorfd);
        return(FALSE);
    }    

    if (connect(outfd, (struct sockaddr *)outaddr, sizeof(*outaddr)) < 0) {
        fprintf(errorfd,"ERROR connecting to out server (%i) %s \n",errno,strerror(errno));
        fflush(errorfd);
    }
    else{       
        n = write(outfd, data, strlen(data));
        if (n < 0) {
            fprintf(errorfd,"ERROR writing to out server (%i) %s\n",errno,strerror(errno));
            fflush(errorfd);
        }
        write(outfd,"\r",1);            
        n=read(outfd,data,9);  //read back commandline prompt but do nothing with it
    }
    shutdown(outfd,SHUT_WR);
    close(outfd);   
    return(TRUE);   
}

当我运行数据包跟踪时,我看到一个回车符 (x0d) 从我的设备发送到客户端设备,但我的代码只发送我上面列出的写入。客户端设备的制造商“声称”CR 给他们带来了问题。

我已经检查过,回车来自我的 IP / MAC,所以我不相信它是另一个带有欺骗 IP 发送它的设备。

任何想法如何实现?

输出设备正在接收数据和 CR,因此我完全不知道输入设备是如何发送回车的。outfd 是一个套接字,在 sperate 函数中打开、写入和关闭。数据按预填充套接字结构传入(IP 和端口与 infd 套接字不同)。

C Linux 套接字 tcpclient tcpserver

评论

1赞 Some programmer dude 10/14/2023
什么?它包含什么?data
0赞 Some programmer dude 10/14/2023
如果获得响应的唯一方法是发送“空闲命令”,那么如果 不是“空闲命令”,您的函数会发生什么?readsendOutputdata
0赞 rabbit 10/14/2023
data 是发送到输出系统的命令,将始终包含一个值,否则不会调用该函数。基本上,我的系统是另外两个第三方系统之间的翻译器。当我看到输入系统中的 xxx 时,我将 yyy\r 发送到输出系统。
1赞 500 - Internal Server Error 10/14/2023
这段代码是不完整的,所以我们只能推测,但出于好奇,如果你注释掉除最终之外的所有内容,问题还会出现吗?sendOutputreturn
1赞 Some programmer dude 10/15/2023
如果除了此“idle”命令之外,没有其他命令会导致服务器响应,则任何其他命令都将导致调用无限期地阻塞。read

答: 暂无答案