23,125
社区成员
发帖
与我相关
我的任务
分享
#include "igrs.h"
//Singlecast Message Server.
void CDevice::SingleMsgServer(string strHost, unsigned uPort)
{
struct sockaddr_in addr;
memset(&addr, 0, sizeof(addr));
addr.sin_family = AF_INET;
inet_aton(strHost.c_str(), &addr.sin_addr);
addr.sin_port = htons(uPort);
int s = socket(AF_INET, SOCK_STREAM, 0);
if (s < 0)
{
perror("socket error in SingleMsgServer\n");
return ;
}
if (bind(s, (struct sockaddr *)&addr, sizeof(addr)) < 0)
{
perror("bind error in SingleMsgServer\n");
return ;
}
if (listen(s, LISTEN_MAX_NUM) < 0)
{
perror("listen error in SingleMsgServer\n");
return ;
}
struct sockaddr_in clientAddr;
socklen_t len;
pthread_t th;
for (;;)
{
int newS = accept(s, (struct sockaddr *)&clientAddr, &len);
if (newS < 0)
{
perror("accept error in SingleMsgServer.\n");
}
//create a thread which runs handleSingleMsg to handle the new connect.
//错误在这一行
if (pthread_create(&th, NULL, (void *(*)(void *))HandleSingleMsg, (void *)&newS) < 0)
{
perror("pthread_create error in SingleMsgServer.\n");
}
}
}
//When SingleMsgServer accepts a connect request,
//HandleSingleMsg handles the connect as a thread.
void CDevice::HandleSingleMsg(int fd)
{
int n;
char tmp[BUF_MAX_SIZE];
for (;;)
{
if ((n = recv(fd, tmp, BUF_MAX_SIZE, 0)) < 0)
{
perror("recv error in SingleMsgServer.\n");
}
else
{
tmp[n] = '\0';
string ackMsg = MsgResolver(tmp);
//if gotten message is request message, then send response message.
if (!ackMsg.empty())
{
if (send(fd, ackMsg.c_str(), ackMsg.size(), 0) < 0)
{
perror("send error in SingleMsgServer.\n");
}
}
}
}
}