添加Socket服务器功能
1.编写socketControl.c
#include "inputCommand.h"
int socketGetCommand(struct InputCommander *socketMsg)
{
int c_fd;
int n_read = 0;
struct sockaddr_in c_addr;
memset(&c_addr,0,sizeof(struct sockaddr_in));
int clen = sizeof(struct sockaddr_in);
c_fd = accept(socketMsg->sfd,(struct sockaddr *)&c_addr,&clen);
n_read = read(c_fd,socketMsg->command,sizeof(socketMsg->command));
if(n_read == -1){
perror("read");
}else if(n_read > 0){
printf("\nget: %d\n",n_read);
}else{
printf("client quit\n");
}
return n_read;
}
int socketInit(struct InputCommander *socketMsg, char *ipAdress, char *port)
{
int s_fd;
struct sockaddr_in s_addr;
memset(&s_addr,0,sizeof(struct sockaddr_in));
//1. socket
s_fd = socket(AF_INET, SOCK_STREAM, 0);
if(s_fd == -1){
perror("socket");
exit(-1);
}
//2. bind
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(atoi(socketMsg->port));
inet_aton(socketMsg->ipAddress,&s_addr.sin_addr);
bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
//3. listen
listen(s_fd,10);
printf("socket server listening...\n");
socketMsg->sfd = s_fd;
return s_fd;
}
struct InputCommander socketControl = {
.commandName = "socketServer",
.command = {'\0'},
.port = "8898",
.ipAddress = "192.168.1.104",
.Init = socketInit,
.getCommand = socketGetCommand,
.log = {'\0'},
.next = NULL
};
struct InputCommander* addsocketControlToInputCommanderLink(struct InputCommander *phead)
{
if(phead == NULL){
return &socketControl;
}else{
socketControl.next = phead;
phead = &socketControl;
return phead;
}
}
这里的socketGetCommand只能接收一次,下一篇文章将进行优化
2.修改InputCommand.h文件,添加一些必要的头文件,以及定义一些变量
同时在最后一行定义socketControl插入链表的函数
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <string.h>
struct InputCommander
{
//指令名称、操纵的设备名称、指令
char commandName[128];
char deviceName[128];
char command[32];
//操作函数:语音等,要有打开函数
int (*Init)(struct InputCommander *voicer, char *ipAdress, char *port);
int (*getCommand)(struct InputCommander *voicer);
int fd;
//波特率
int baud;
//日志
char log[1024];
//socket
int sfd;
char port[12];
char ipAddress[32];
struct InputCommander *next;
};
struct InputCommander* addvoiceControlToInputCommanderLink(struct InputCommander *phead);
struct InputCommander* addsocketControlToInputCommanderLink(struct InputCommander *phead);
3.修改mainPro.c中的main函数,将socketControl插入链表
pCommandHead = addsocketControlToInputCommanderLink(pCommandHead);