C TCP Server在关闭之前不发送数据

时间:2016-02-04 12:38:31

标签: c linux sockets tcp

我正在尝试在两台Ubuntu计算机之间建立TCP连接。 服务器应该向客户端发送单个char值。客户端应该打印这些字符。 建立服务器和客户端之间的连接似乎正如预期的那样工作,但是当我调用send()时,客户端上没有输出。

实现输出的唯一方法是在无限循环中发送相同的char值,这会导致在客户端控制台中打印无限数量的字符,或者通过更改客户端代码中的if语句(请参阅从if(len> 0)到if(len> = 0)的代码如下。在这种情况下,只要我通过CTRL + C关闭服务器,就会正确打印发送的字符,但它也会多次打印最后发送的字符。因此,当服务器仍在运行时,我无法在客户端接收值。

这是服务器的代码:

int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in adresse;
adresse.sin_family = AF_INET;
adresse.sin_addr.s_addr = INADDR_ANY;
adresse.sin_port = htons (2457);

bind ( serverSocket, (struct sockaddr *) &adresse, sizeof (adresse))
listen (serverSocket, 1);

while(1)
{
socklen_t adrlen = sizeof(struct sockaddr_in);
int conSocket= accept ( serverSocket, (struct sockaddr *) &adresse, &adrlen ); 
if(conSocket => 0)
{
    char charToSend;
    while(1)
    {
        charToSend = returnChar();
        if(send(conSocket= , &charToSend, 1, 0) == -1)
        {
            printf("Error\n"); 
        } 
    }
    close(conSocket);           
}
close(serverSocket);
}

这是客户的代码:

int clientSocket = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in adresse;
adresse.sin_family = AF_INET;
adresse.sin_port = htons (2457);
inet_aton ("192.168.2.101", &adresse.sin_addr);

if (connect ( clientSocket, (struct sockaddr *) &adresse, sizeof (adresse)) == 0)
{               
while(1)
{
    char recvd[2];
    int len = recv(clientSocket, recvd, 1, 0);
    recvd[1] = '\0';
    if(len > 0)
    {
            printf("%s", recvd);
    }
}
}

服务器代码中的函数returnChar()用于处理来自传感器的信息并返回char值。它不会在完成信号处理之前终止,并且在此期间运行循环。

我唯一的想法是send()“没有时间”在程序继续进行另一个循环之前发送值。这可能是问题吗?或者我在客户的代码中做错了什么?

2 个答案:

答案 0 :(得分:3)

在我看来,问题出在客户端。您打印char没有行终止。因此,所有内容都缓存在客户端标准输出流中。请将'\n'添加到printf中:printf("%s\n", recvd);

答案 1 :(得分:0)

实际上,问题可能出在客户端。 使客户端的输出无缓冲:

setvbuf(stdout, NULL, _IONBF, (size_t)0);

或简单地使用无缓冲的,而不是标准的(缓冲的)I / O:

write(fileno(stdout), recvd, (size_t)1);

虽然,由于您的流量是单向的,因此建议使用TCP_NODELAY将有助于加快发送速度。