c - 如何正确连接部分接收的字符串?
问题描述
我在 C 中使用套接字,我有一个将发送消息的客户端和消息的大小以及将在较短大小的缓冲区中接收此消息的服务器。消息正在正确发送,但是当我尝试将所有缓冲区连接到一个字符串中时遇到问题。
客户端:
char *buffer = "Hello from the client you're receiving this message";
int bytes_sent;
long msgSize = strlen(buffer);
printf("Buffer Size: %ld\n", msgSize);
int msgFileSize = send(SocketFD, &msgSize, sizeof(msgSize),0);
bytes_sent = send(SocketFD, buffer, strlen(buffer), 0);
服务器:
char buffer[8];
ssize_t recsize;
long msgSize;
int msize = recv(ConnectFD, &msgSize, sizeof(msgSize), 0);
int total_byt = 0;
printf("Full Message Size: %ld\n", msgSize);
char full_msg[msgSize];
while (total_byt < msgSize) {
recsize = recv(ConnectFD, (void*)buffer, sizeof buffer, 0);
total_byt += recsize;
strcat(full_msg, buffer);
if (recsize < 0) {
fprintf(stderr, "%s\n", strerror(errno));
exit(EXIT_FAILURE);
}
printf("recsize: %d\n ", (int)recsize);
sleep(1);
printf("datagram: %.*s\n", (int)recsize, buffer);
}
printf("full message: %s\n", full_msg);
服务器的输出如下所示:
Full Message Size: 51
recsize: 8
datagram: Hello fr
recsize: 8
datagram: om the c
recsize: 8
datagram: lient yo
recsize: 8
datagram: u're rec
recsize: 8
datagram: eiving t
recsize: 8
datagram: his mess
recsize: 3
datagram: age
full message: ��9�Hello from the client you're receiving this message mess
解决方案
这里的问题很少。
strlen
返回不包括null
字符的长度。long msgSize = strlen(buffer);
因此,您需要有 1 个额外的地方来存放
null
char。char full_msg[msgSize+1]; full_msg[0] = '\0';
strcat
asbuffer
未null
终止存在未定义的行为。recsize = recv(ConnectFD, (void*)buffer, sizeof buffer, 0); strcat(full_msg, buffer);
采用
strncpy(full_msg, buffer, sizeof buffer);
最后
null
确定后终止full_msg
循环。while (total_byt < msgSize) { …. } full_msg[total_byt] = '\0';
推荐阅读
- r - 如何过滤时间窗口内最近发生的事件?
- javascript - 突出显示和禁用第一个和第二个表中的行,所选数据相同
- material-ui - 使用 Material-ui 和 ClojureScript 创建主题
- jenkins - 如何从 Jenkins REST API 获取在“构建后操作”中触发的 Jenkins 作业的详细信息?
- html - 如何使一个部分既可滚动又与页面的其余部分完全一样高?
- javascript - 订阅的自定义完整方法是否会自行取消订阅?
- python - `fitsvm() 为参数 'c' 获取了多个值` 错误
- c# - 如何在客户端启动 GMAIL Api 身份验证?
- javascript - 在 TypeScript 中简化/重构嵌套的 forEach 循环
- postgresql - 如何在现有表(postgres)的特定位置插入列?