为什么程序运行只执行一次
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()
仍然可能崩溃
我已经编写了用于实验的服务器和客户端程序。我想达到这样的效果:一旦服务器传输“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()
仍然可能崩溃