我正在尝试在两台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()“没有时间”在程序继续进行另一个循环之前发送值。这可能是问题吗?或者我在客户的代码中做错了什么?
答案 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将有助于加快发送速度。