您的位置:首页 > 其它

到底哪里出了问题?

2012-05-09 18:33 155 查看
#include "Neptune.h"
#include "Platinum.h"
#include <sys/ioctl.h>
#include <sys/select.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <netinet/in.h> /* definations of sa_family structre,htons,INADDR_ANY,... */

#include <arpa/inet.h> /* name ip format */

#include <sys/types.h> /*give the defination of pid_t*/
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>

#include <stdlib.h>

#include <ctype.h> /* isspace()  */

//#define SOCKET_PATH "dlna"

#define BUFFER_MAX    1024  /* input buffer for commands */
#define TOKEN_MAX     8     /* max number of arguments in buffer */
#define REPLY_MAX     256   /* largest reply allowed */
#define MAX_QUE_CONN_NM    10
//#define INADDR_ANY ((unsigned long)0x00000000)

NPT_SET_LOCAL_LOGGER("platinum.media.server.file")

//example:NPT_Debug("ERROR: failed to load entity (%d)\n", result);

int sockfd;
static NPT_Flags deviceStartFlag = 0; //服务启动状态为1,服务停止则状态为0

//the following are commands.
static int HandleCmd_dmsStartStop(char **arg, char reply[REPLY_MAX])
{
if (!deviceStartFlag){
//start service
NPT_LOG_INFO("baojinyu------------socket cmd Start。");
//NPT_CHECK_SEVERE(upnp.Start());
NPT_LOG_INFO("baojinyu------------upnp Start success!");
deviceStartFlag = 1;
}
else{
//stop service
NPT_LOG_INFO("baojinyu------------socket cmd stop。");
//upnp.Stop();
NPT_LOG_INFO("baojinyu------------upnp stop success!");
deviceStartFlag = 0;
}
return deviceStartFlag;

}

struct cmdinfo {
const char *name;
unsigned numargs;
int (*func)(char **arg, char reply[REPLY_MAX]);
};

struct cmdinfo cmds[] = {
//{ "isMouse",                 1, isMouse },
//{ "mousePrecision",          1, mousePrecision },
{ "dmsStartStop",                 0, HandleCmd_dmsStartStop },
//{ "mediaManage",                 1, HandleCmd_mediaManage },
//{ "serverConfig",                 1, HandleCmd_serverConfig },

};

static int readx(int fd, void *_buf, int count)
{
char *buf =(char *) _buf;
int n = 0, r;
if (count < 0) return -1;
while (n < count) {
r = read(fd, buf + n, count - n);
if (r < 0) {
if (errno == EINTR) continue;
NPT_LOG_INFO("read error\n");
return -1;
}
if (r == 0) {
NPT_LOG_INFO("eof");
return -1; /* EOF */
}
n += r;
}
return 0;
}

static int writex(int fd, const void *_buf, int count)
{
const char *buf =(char *) _buf;
int n = 0, r;
if (count < 0) return -1;
while (n < count) {
r = write(fd, buf + n, count - n);
if (r < 0) {
if (errno == EINTR) continue;
NPT_LOG_INFO("write error");
return -1;
}
n += r;
}
return 0;
}

/* Tokenize the command buffer, locate a matching command,
* ensure that the required number of arguments are provided,
* call the function(), return the result.
*/
static int execute(int s, char cmd[BUFFER_MAX])
{
char reply[REPLY_MAX];
char *arg[TOKEN_MAX+1];
unsigned i;
unsigned n = 0;
unsigned short count, le_count;
int ret = -1;

/* default reply is "" */
reply[0] = 0;

/* n is number of args (not counting arg[0]) */
arg[0] = cmd;
while (*cmd) {
if (isspace(*cmd)) {
*cmd++ = 0;
n++;
arg
= cmd;
if (n == TOKEN_MAX) {
NPT_LOG_INFO("too many arguments");
goto done;
}
}
cmd++;
}

for (i = 0; i < sizeof(cmds) / sizeof(cmds[0]); i++) {
if (!strcmp(cmds[i].name,arg[0])) {
if (n != cmds[i].numargs) {
NPT_LOG_INFO("numargs doesnot equal requires arguments ");
} else {
ret = cmds[i].func(arg + 1, reply);
}
goto done;
}
}
NPT_LOG_INFO("unsupported command");

done:
if (reply[0]) {
n = snprintf(cmd, BUFFER_MAX, "%d %s", ret, reply);
} else {
n = snprintf(cmd, BUFFER_MAX, "%d", ret);
}
if (n > BUFFER_MAX) n = BUFFER_MAX;
count = n;

/* receiver expects count in little-endian order */
le_count = htole16(count);

//    LOGI("reply: '%s'\n", cmd);
if (writex(s, &le_count, sizeof(le_count))) return -1;
if (writex(s, cmd, count)) return -1;
return 0;
}

int
main(int argc, char** argv)
{
//setup Neptune logging
NPT_LogManager::GetDefault().Configure("plist:.level=INFO;.handlers=ConsoleHandler;.ConsoleHandler.colors=off;.ConsoleHandler.filter=42");
NPT_LOG_INFO("baojinyu---------------server begin\n ");

//===========原init()=============================
sockfd = socket(AF_INET,SOCK_STREAM,0);
if (sockfd == -1)
{
NPT_LOG_INFO("baojinyu---------------create socket error! \n");
exit(1);
}
NPT_LOG_INFO("baojinyu---------------create socket successfully .\n");
//=======================================

char buf[BUFFER_MAX+1];

int sin_size;

struct sockaddr_in  server_sockaddr, client_sockaddr;

/* socket配置 */
server_sockaddr.sin_family = AF_INET;    /* 地址族 */
server_sockaddr.sin_port = htons(7933);/* 端口号 */
//server_sockaddr.sin_addr.s_addr = inet_addr("127.0.0.1");/* 系统会自动填入本机的IP地址 */
server_sockaddr.sin_addr.s_addr = INADDR_ANY;
bzero(&(server_sockaddr.sin_zero),8);/*填充0和struct sockaddr 同样大小*/
//bzero(&server_sockaddr,sizeof(server_sockaddr));

//int i = 1;    /* 允许重复使用本地地址与套接字进行绑定 */
//setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR, (const char*)&i, sizeof(i));

//if(bind(sockfd,(struct sockaddr*)&server_sockaddr,len) < 0){
if(bind(sockfd,(struct sockaddr*)&server_sockaddr,sizeof(struct sockaddr)) == -1){
NPT_LOG_INFO("baojinyu---------------Bind failure.\n ");
exit(1);
}
NPT_LOG_INFO("baojinyu--------------- Bind successfully.\n ");

/* listen for connections on a socket */
if(listen(sockfd, MAX_QUE_CONN_NM) == -1){
NPT_LOG_INFO("baojinyu--------------- Listen failure.\n ");
exit(1);
}
NPT_LOG_INFO("baojinyu--------------- Listen successfully ");

int client_fd, fd;
int result;
int readflag;

int maxfd=-1;
fd_set tmp_read;
fd_set readfds;
FD_ZERO(&readfds);
FD_SET(sockfd, &readfds);

fd_set tmp_write;
fd_set writefds;
FD_ZERO(&writefds);
FD_SET(sockfd, &writefds);

struct timeval timeout;
fd_set fdset;

while(true)
{
tmp_read = readfds;
tmp_write = writefds;
NPT_LOG_INFO("baojinyu--------------- enter while loop ");
timeout={5,0};
result = select(maxfd+1, &tmp_read, NULL, NULL, &timeout);
if(result == 0)
{
NPT_LOG_INFO("baojinyu----------------------Select timeout!---no change happens.\n");
continue;
}else if(result == -1)
{
NPT_LOG_INFO("baojinyu----------------------Select failure!\n");
break;
}
NPT_LOG_INFO("baojinyu-----------------Select successfully\n");
sin_size = sizeof(struct sockaddr_in);
for(fd=0; fd < FD_SETSIZE; fd++)
{
if(FD_ISSET(fd,&tmp_read))
{
NPT_LOG_INFO("baojinyu-----------------FD_ISSET\n");
if(fd == sockfd)
{    //服务端接收客户端连接请求
NPT_LOG_INFO("baojinyu-----------------fd == sockfd\n");
if((client_fd = accept(sockfd,(struct sockaddr*)&client_sockaddr,&sin_size)) > 0)
{
if(client_fd > maxfd){
maxfd = client_fd;
}
FD_SET(client_fd,&readfds);
NPT_Debug("baojinyu--accept success--------Got connection from %s, port %d,socket %d\n",
inet_ntoa(client_sockaddr.sin_addr),ntohs(client_sockaddr.sin_port),client_fd);

}else {
NPT_LOG_INFO("baojinyu-----------------accept failure.\n");
break;
}
}
else{
ioctl(fd,FIONREAD,&readflag);
if(readflag == 0){
NPT_LOG_INFO("baojinyu----------------readflag == 0  \n");
close(fd);
FD_CLR(fd,&readfds);
}
else{
//处理客户端发来的消息-read size
unsigned short count;
if (readx(fd, &count, sizeof(count))){
NPT_LOG_INFO("baojinyu-------------------failed to read size\n");
break;
}

count = letoh16(count);
if ((count < 1) || (count >= BUFFER_MAX)) {
NPT_LOG_INFO("baojinyu-------------------count error!\n");
NPT_Debug("baojinyu--------count error!--count= %d\n",count);
break;
}
if (readx(fd, buf, count)) {
NPT_LOG_INFO("baojinyu----------------failed to read command\n");
break;
}

buf[count] = 0;
if (execute(fd, buf)) break;

}
}
}
}
}

for(fd = 0; fd < FD_SETSIZE; fd++)
{
close(fd);
FD_CLR(fd,&readfds);
}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: