我试图编写一个程序,在其中一个Pi上键入命令,然后将其发送到另一个Pi。我想让两个类似的程序并行运行。使用下面的代码,我可以使Pis连接并发送1条命令,它们都执行并返回到我可以发送命令的部分,但是客户端挂在那儿的sleep_for(1s)部分。我对使用通讯还比较陌生,因此不胜感激。
我尝试过的大多数事情都涉及将建立连接的代码部分移出while循环。但是正如我说的那样,我不熟悉这种交流方式的工作原理,所以我一直专注于尝试更多地理解它。
客户
int main () {
time_t start_time = 0;
time_t now_time = 0;
int loop = 1;
int Step = 1;
int sockfd = 0, n = 0;
char recvBuff[1024];
struct sockaddr_in serv_addr;
memset(recvBuff, '0',sizeof(recvBuff));
sockfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&serv_addr, '0', sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(5000);
if(inet_pton(AF_INET, "169.254.220.0", &serv_addr.sin_addr)<=0){
printf("\n inet_pton error occured\n");
return 1;
}
if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0){
printf("\n Error : Connect Failed \n");
return 1;
}
while (loop == 1){
if(Step == 1){
sleep_for(1s);
while(Step == 10){
printf("Listening");
while ( (n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0){
recvBuff[n] = 0;
if(fputs(recvBuff, stdout) == EOF){
printf("\n Error : Fputs error\n");
}
}
if(n < 0){
printf("\n Read error \n");
}
Step = atoi(recvBuff);
cout << "Step = " << Step << "\n";
}
}
else if (Step == 2){
printf("2\n");
Step = 1;
}
else if (Step == 15){
return 0;
}
else{
Step = 1;
}
}
}
服务器
int main () {
time_t start_time = 0;
time_t now_time = 0;
int loop = 1;
int Step = 1;
int listenfd = 0, connfd = 0;
struct sockaddr_in serv_addr;
char sendBuff[1025];
printf("Here's johnny");
cout << "\nStep A: " << Step << "\n";
listenfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&serv_addr, '0', sizeof(serv_addr));
memset(sendBuff, '0', sizeof(sendBuff));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(5000);
bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));
listen(listenfd, 10);
while (loop == 1){
if(Step == 1){
connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
cout << "Step ? ";
cin >> Step;
cout << "\n Step B: " << Step << "\n";
snprintf(sendBuff, sizeof(sendBuff), "%d", Step);
write(connfd, sendBuff, strlen(sendBuff));
close(connfd);
printf("closed\n");
}
else if (Step == 2){
printf("2\n");
Step = 1;
}
else if (Step == 15){
return 0;
}
else{
Step = 1;
}
}
}
我期望输出的是步骤2中输入的数字,这表明代码已根据输入转到正确的步骤,而我是在第一次尝试后得到的,但是在第一次输入之后代码会自行挂起。
答案 0 :(得分:0)
if(Step == 1){
sleep_for(1s);
while(Step == 10){
如果if
为1,则仅传递Step
。但是,如果while
为10,则仅进入Step
循环,因为必须这样做,所以永远不会通过设为1,否则我们就不会一开始就while
。因此,while
循环中的代码将无法执行。
while ( (n = read(sockfd, recvBuff, sizeof(recvBuff)-1)) > 0){
recvBuff[n] = 0;
if(fputs(recvBuff, stdout) == EOF){
printf("\n Error : Fputs error\n");
}
}
这是坏的。 while
循环的每次迭代都会覆盖先前接收的字节。如果发送的消息是“ 10”,并且第一个read
获得“ 1”,则第二个获得“ 0”的读取将覆盖“ 1”,而atoi
调用将获得0之十!