应用程序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);
}