- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想做的是保持一个开放的服务器并让不同的客户端向服务器发送一个字符串,服务器将该字符串保存在 char rcvdmessage[16] 中并将其发送回客户端。我是 C 的新手,我不明白为什么我的代码会这样运行
如果第一个客户端发送“Hello World”,则服务器向客户端发送“Hello World”。如果第二个客户端发送“Bye”,在第二次迭代中,服务器将发送“Byelo World”。
有没有办法在每个循环开始时清除我的 rcvdmessage[16]?我在 rcvdmessage 初始化下尝试了 memset[rcvdmessage,0,16],但随后服务器向客户端发送了一个空字符数组。
while(1){
// accept - creating a new socket for the accepted connection
addr_size = sizeof their_addr;
otherfd = accept(sockfd, (struct sockaddr *)&their_addr, &addr_size);
// if(otherfd == -1){
// fprintf(stderr, "failed to accept, error: %d\n", bind_check);
// perror("ERROR on accepting");
// return 1;
// } else fprintf(stderr, "success accept, %d\n", bind_check);
// receive message
char rcvdmessage[16];
int bytes_rcvd = recv(otherfd, rcvdmessage, strlen(rcvdmessage), 0);
// if(bytes_rcvd == -1){
// fprintf(stderr, "failed to receive, error: %d\n", bytes_rcvd);
// perror("ERROR on receiving");
// } else{
// printf("Rcvd %s, %d bytes\n", rcvdmessage, bytes_rcvd);
// }
// send the received message
int bytes_sent = send(otherfd, rcvdmessage, strlen(rcvdmessage), 0);
// if(bytes_sent == -1){
// fprintf(stderr, "failed to send, error: %d\n", bytes_sent);
// perror("ERROR on sending");
// } else{
// printf("Sent %s, %d bytes\n",rcvdmessage, bytes_sent);
// }
// memset(rcvdmessage, 0, strlen(rcvdmessage));
}
最佳答案
strlen
函数是获取null-terminated字节串的长度。
要获得数组的完整大小,您需要使用 sizeof
运算符(operator):
int bytes_rcvd = recv(otherfd, rcvdmessage, sizeof rcvdmessage, 0);
// ^^^^^^
另请注意,除非您的对等方发送的数据确实以 null 结尾,否则在 send
调用中使用 strlen
也是错误的。使用 recv
函数给出的接收数据的大小:
int bytes_sent = send(otherfd, rcvdmessage, bytes_rcvd, 0);
// ^^^^^^^^^^
然后对于你的问题,虽然上面会解决它,但你必须记住未初始化的“自动”变量(局部非静态变量)将保持未初始化状态。它们的值或内容将不确定并且看起来是随机的。
在循环内“替换”局部变量的正确方法是你所做的,只需在你已经做的地方定义它。它似乎包含旧数据是因为不确定部分,并且发生是因为编译器足够聪明,可以在每次迭代中重用相同的内存。
关于c - 在 C 中回显客户端服务器 - 我有一个开放的服务器,它从不同的客户端获取字符串 - 我如何在新的迭代中替换旧的 char[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54228325/
我是一名优秀的程序员,十分优秀!