基于OK6410的WIFI四驱小车(下)

应用程序server:

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
#include <netdb.h>
#include <sys/ioctl.h>
#include <termios.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/time.h>
#include <strings.h>
#include <errno.h>
#include <sys/wait.h>
#include "mygpio.h"
#include "mydrive.h"




#define MAXBUF 1024
void main()
{
int fd=0; //小车文件号
fd=open("/dev/mygpio",O_RDWR);
int sockfd,new_fd;
int len;
fd_set rfds;
    struct timeval tv;
    int retval, maxfd = -1;
char recvbuff[MAXBUF+1]; //receiver buff
struct sockaddr_in serveraddr,their_addr; //define socket address struct
sockfd = socket(AF_INET,SOCK_STREAM,0); //服务器端开始建立sockfd描述符
//服务器填充sockaddr结构
bzero(&serveraddr,sizeof(struct sockaddr));  //初始化,置0
serveraddr.sin_family = AF_INET;      //Internet
serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);//接收任何IP地址的数据
serveraddr.sin_port = htons(5000); //设置监听端口号
/*捆绑sockfd描述符到IP地址*/
bind(sockfd,(struct sockaddr *)&serveraddr,sizeof(struct sockaddr_in)); 
if((listen(sockfd,1024))==-1)//设置允许连接的最大客户端数1024
{
perror("listen");
exit(1);
}

while (1) { 
printf("waitting ...\n");
len = sizeof(struct sockaddr);
        if((new_fd = accept(sockfd,(struct sockaddr *) &their_addr,&len))==-1)
  {
 perror("accept");
 exit(errno);
  }
/*开始处理每个新连接上的数据收发*/
while(1){
            FD_ZERO(&rfds);/* 把集合清空 */            
            FD_SET(0, &rfds);/* 把标准输入句柄0加入到集合中 */
            maxfd = 0;            
            FD_SET(new_fd, &rfds);/* 把当前连接句柄new_fd加入到集合中 */
            if (new_fd > maxfd)
                maxfd = new_fd;
            /* 设置最大等待时间 */
            tv.tv_sec = 1;
            tv.tv_usec = 0;
            /* 开始等待 */
            retval = select(maxfd + 1, &rfds, NULL, NULL, &tv);
            if (retval == -1) {
                printf("will quit ,select error! %s", strerror(errno));
                break;
            } 
else if (retval == 0)
{
                continue;
                } 
else 
{
                if (FD_ISSET(new_fd, &rfds)) { //检查集合中指定的文件描述符是否可以读写
                    /* 当前连接的socket上有消息到来则接收对方发过来的消息并显示 */
                    bzero(recvbuff, MAXBUF + 1);
                    /* 接收客户端的消息 */
                    len = recv(new_fd, recvbuff, MAXBUF, 0);
                    if (len > 0)
{
                            if (!strncasecmp(recvbuff, "quit", 4)) {
                                       printf("client quit !\n");
                                       break;
}else{
  printf("receiver succed:%s\n\n",
                                                                   recvbuff);
  //小车控制
  if (!strncasecmp(recvbuff, "1", 1))
  upRun(fd);
  else if(!strncasecmp(recvbuff, "2", 1))
  backRun(fd);
  else if(!strncasecmp(recvbuff, "3", 1))
  leftRunLow(fd);
  else if(!strncasecmp(recvbuff, "4", 1))
                                                                         stopRun(fd);
}
}
                    else {
                        if (len < 0)
                            printf("receiver fail!error code:%d,Error information :'%s'\n",
                                 errno,strerror(errno));
                        else
{
 printf("..........client quit...............\n");
 break;
}
                    }
                }
/*用户按键了,则读取用户输入的内容发送出去*/
if(FD_ISSET(0,&rfds))
{
bzero(recvbuff,MAXBUF+1);
fgets(recvbuff,MAXBUF,stdin);
len=send(new_fd,recvbuff,strlen(recvbuff)-1,0);
if(len>0)
printf("send message:%s\n",recvbuff);
else
{
printf("message:%s fail send ,error code %d,error message:%s\n",
recvbuff,errno,strerror(errno));
break;
}
}

            }
        }
close(new_fd);
printf(" shu ru quit jie shu or go\n");
fflush(stdout);
bzero(recvbuff,MAXBUF+1);
/*fgets(recvbuff,MAXBUF,stdin);
if(!strncasecmp(recvbuff,"quit",3))
{
printf("game over\n");
break;
}*/
}
close(sockfd);


}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值