如何解决为什么程序只运行一次
我编写了用于实验的服务器和客户端程序。我想达到这种效果:服务器传输“ HELLO”后,客户端将收到它并发送回“ HELLO FROM WIN”,并等待下一个信息。但是,服务器只得到第一个响应,客户端被击碎(几秒钟后关闭),下面是一些代码。
client.c
When Filebeat is running on a Linux system with systemd,it uses by default the -e command line option,that makes it write all the logging output to stderr so it can be captured by journald. Other outputs are disabled.
server.py
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,(const struct sockaddr *)&addr,sizeof(addr));
memset(send,16);
}
}
有人可以帮助我吗?谢谢。
解决方法
char *send = "HELLO FROM WIN";
这是指向只读字符串文字的指针。在C语言中,允许您使用非const指针(直到我相信C11为止),但是您仍然无法对其进行写入。您可以在这里尝试这样做:
memset(send,'\0',16);
这是未定义的行为,因此崩溃是绝对有可能的(也是一种很好的方法-比“工作”要好得多,直到将代码部署到生产中为止!)
要解决此问题,您可以将send
更改为具有自动存储功能的阵列:
char send[] = "HELLO FROM WIN";
并确保您不会超出范围:
sendto(sock,send,sizeof(send),(const struct sockaddr *)&addr,sizeof(addr));
memset(send,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()
仍然可能崩溃
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。