【发布时间】:2016-02-04 12:38:31
【问题描述】:
我正在尝试在两台 Ubuntu 计算机之间建立 TCP 连接。 服务器应该向客户端发送单个字符值。客户端应该打印这些字符。 在服务器和客户端之间建立连接似乎按预期工作,但是当我调用 send() 时,客户端没有输出。
实现输出的唯一方法是在无限循环中发送相同的字符值,这会导致在客户端控制台中打印无限数量的字符,或者通过更改客户端代码中的 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() “没有时间”在程序继续另一个循环之前发送值。这可能是问题吗?还是我在客户端的代码中做错了什么?
【问题讨论】:
-
我建议在服务器套接字上设置
TCP_NODELAY选项。这是怎么做的:unixguide.net/network/socketfaq/2.16.shtml