【问题标题】:Why does the program run only once为什么程序只运行一次
【发布时间】:2020-12-27 00:36:28
【问题描述】:

我已经编写了用于实验的服务器和客户端程序。我想要达到这个效果:一旦服务器传输“HELLO”,客户端就会收到它并发送回“HELLO FROM WIN”并等待下一个信息。但是,服务器只得到第一个响应,客户端崩溃(几秒钟后关闭),下面是一些代码。

client.c

int main(int argc, char * argv[]){
char receive[6] = "";
char *send = "HELLO FROM WIN";

startupWSA();
SOCKET sock = createTCPSocket();
    
while(1){
    recv(sock,receive,6,0);
    
    printf("%s\n",payload);
    printf("%s\n",receive);
    memset(receive,'\0',6);

    sendto(sock,send,16,0,(const struct sockaddr *)&addr,sizeof(addr));
    memset(send,'\0',16);

}
}

server.py

from socket import *
serverPort = 5555
serverSocket = socket(AF_INET,SOCK_STREAM)
serverSocket.bind(('',serverPort))
serverSocket.listen(1)
print('socket is ready')

connectionSocket,addr = serverSocket.accept()
while True:
    send = input('>')
    connectionSocket.send(send.encode())
    receive = connectionSocket.recv(1024).decode()
    print(receive)

有人可以帮助我吗?谢谢。

【问题讨论】:

  • 如果客户端死了,这说明你的服务器只得到 1 个响应。
  • 您在 C 程序中收到的字符串很可能不会以空字符结尾,这意味着您在打印时可能会越界。
  • 你为什么要memset(send,'\0',16);
  • 您不能将sendto 与TCP 套接字一起使用,请使用send
  • 另外,您的局部变量 send 正在从套接字库中隐藏 send 函数

标签: python c tcp


【解决方案1】:
char *send = "HELLO FROM WIN";

这是一个指向只读字符串文字的指针。在 C 中,您可以拥有一个指向它的非常量指针(我相信直到 C11),但您仍然不能写入它。您尝试在此处执行此操作:

memset(send,'\0',16);

这是未定义的行为,因此崩溃是一种确定的可能性(也是一种很好的可能性 - 比在将代码部署到生产之前“工作”要好得多!)

要绕过它,您可以将 send 更改为具有自动存储功能的数组:

char send[] = "HELLO FROM WIN";

并确保您不会写出越界:

sendto(sock,send,sizeof(send),0,(const struct sockaddr *)&addr,sizeof(addr));
memset(send, '\0', sizeof(send));

【讨论】:

    【解决方案2】:

     char *send = "HELLO FROM WIN";
    

    您将send 声明为指针并将其初始化为指向常量字符串文字“HELLO FROM WIN”。

    该常量通常位于只读内存区域中的某个位置,因此当您尝试使用 memset() 来覆盖它时,您的程序会崩溃。

    通过以下方式将其声明为数组:

     char send[16] = "HELLO FROM WIN";
    

     char send[] = "HELLO FROM WIN";
    

    但在后一种情况下,数组大小仅为 15,因此您的 memset() 仍然可能崩溃

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多