为什么程序运行只执行一次

Why does the program run only once

我已经编写了用于实验的服务器和客户端程序。我想达到这样的效果:一旦服务器传输“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,'[=11=]',6);

    sendto(sock,send,16,0,(const struct sockaddr *)&addr,sizeof(addr));
    memset(send,'[=11=]',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)

谁能帮帮我?谢谢

char *send = "HELLO FROM WIN";

这是一个指向 read-only 字符串文字的指针。在 C 中,你可以有一个指向它的 non-const 指针(我相信直到 C11),但你仍然不能写入它。您尝试在此处执行此操作:

memset(send,'[=11=]',16);

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

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

char send[] = "HELLO FROM WIN";

并确保您不会写越界:

sendto(sock,send,sizeof(send),0,(const struct sockaddr *)&addr,sizeof(addr));
memset(send, '[=13=]', sizeof(send));

 char *send = "HELLO FROM WIN";

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

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

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

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

 char send[] = "HELLO FROM WIN";

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