我编写了一个TCP客户端/服务器程序来反转字符串,但结果部分正确。
客户端:
#include<stdio.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<sys/types.h>
#include<string.h>
void main()
{
struct sockaddr_in server, client;
char buffer[20], temp;
int n, sock, newsock, i, j;
sock = socket(AF_INET, SOCK_STREAM, 0);
server.sin_family = AF_INET;
server.sin_port = 2000;
server.sin_addr.s_addr = inet_addr("127.0.0.1");
bind(sock, (struct sockaddr*) &server, sizeof(server));
listen(sock, 2);
n = sizeof(client);
new sock = accept(sock, (struct sockaddr*) &client, &n);
for(;;)
{
recv(newsock, buffer, sizeof(buffer), 0);
i = 0;
j = strlen(buffer) - 1;
while(i<j)
{
temp = buffer[i];
buffer[i] = buffer[j];
buffer[j] = temp;
i++;
j--;
}
send(newsock, buffer, sizeof(buffer), 0);
}
}
服务器:
it("shall create event table", function(done) {
eventList = {
"events": [{
"name": "A",
}, {
"name": "B",
}, {
"name": "C",
}, {
"name": "D",
}]
};
eventUtil.listWidget({
elementID: "test",
dataURL: "js/events.json"
}).then(function(){
var listDiv = document.getElementById('list');
expect(listDiv.innerHTML).toContain('<caption>Events ABC</caption>');
done();
});
});
现在,当我运行它并假设我输入字符串为“你好,你好吗”但结果只是“olleh”并且跳过句子的其余部分。我在这里遗漏了什么吗?
答案 0 :(得分:6)
你的问题很早就开始了,在scanf
函数中,%s
读取直到第一个空格(就在“你好”之后)。你需要阅读直到行尾(getline
可以为你做到这一点)。
答案 1 :(得分:1)
您的客户只能“收到”一次。您不能保证将整个消息放回一个数据包中,因此您需要接收,直到获得所发送的字节数,或者实现一些其他方式来识别消息的结尾。 在客户端,更改:
recv(sock,buffer,sizeof(buffer),0);
类似于:
while (you haven't gotten the entire packet)
{
recv(sock,buffer,sizeof(buffer),0);
//append buffer to another buffer
}