TCP程序在C语言中反转字符串给出一半结果

时间:2016-01-26 06:09:50

标签: c string tcp

我编写了一个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”并且跳过句子的其余部分。我在这里遗漏了什么吗?

2 个答案:

答案 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
}