- 论坛徽章:
- 0
|
本帖最后由 linsanko 于 2011-08-24 20:13 编辑
C++编写一个服务端程序。。。调用accept函数的出错,用c写的时候也是这样写的,但不知道为什么就错了。。。难道是用了类的原因?
很感谢drangon看了之后提的建议。
/***目的:生成服务端程序
***出错的位置目前显示出:调用accept函数的时候返回为-1,也就是client_sockfd的值没能够申请成功。
***本程序采用UDP协议。所以就没监听。(监听listen函数好像只面向有连接)
以下是代码:
#include <cstdio>
#include <cstdlib>
#include <string.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <pthread.h>
#include <unistd.h>
#define BUFSIZE (1024*16)
#define QUEUE_LEN 10
typedef int SOCKET;
typedef unsigned char BYTE;
typedef unsigned long DWORD;
typedef unsigned int WORD;
typedef int BOOL;
#define TRUE 1
#define FALSE 0
#define SOCKET_ERROR -1
#define INVALID_SOCKET -1
class CGzUdp
{
public:
CGzUdp();
~CGzUdp();
public:
unsigned char g_buffer[BUFSIZE];
protected:
SOCKET service_sockfd;
SOCKET client_sockfd;
WORD m_wLocalPort;
int m_iSocketId;
BOOL m_bIsReceiving;
pthread_t threadID; //这个是线程ID号
protected:
virtual void ReceivingLoop(void); //线程入口函数
static void *ReceivingThrd(void * pParam); //这个是接收循环,也是线程实际上去处理的函数
public:
BOOL Init(int socketId);
void SetLocalPort(WORD inPort);
BOOL CreateSender(void);
void DeleteSender(void);
BOOL CreateReceiver(void);
void DeleteReceiver(void);
BOOL StartReceiving(void);
void StopReceiving(void);
};
int main( void )
{
CGzUdp m_pCommandUdp;
m_pCommandUdp.Init(0);
WORD m_wOcuPort = 10012;
m_pCommandUdp.SetLocalPort(m_wOcuPort);
m_pCommandUdp.CreateReceiver();
m_pCommandUdp.StartReceiving();
sleep(5);
return 0;
}
CGzUdp::CGzUdp()
{
service_sockfd = INVALID_SOCKET;
client_sockfd = INVALID_SOCKET;
m_wLocalPort = 10090;
threadID = 0;
m_bIsReceiving = FALSE;
}
CGzUdp::~CGzUdp()
{
DeleteSender();
DeleteReceiver();
StopReceiving();
}
BOOL CGzUdp::Init(int socketID)
{
m_iSocketId = socketID;
return TRUE;
}
void CGzUdp::SetLocalPort(WORD inPort)
{
m_wLocalPort = inPort;
}
void CGzUdp: eleteSender(void)
{
if (client_sockfd != INVALID_SOCKET)
{
close(client_sockfd);
client_sockfd = INVALID_SOCKET;
}
}
BOOL CGzUdp::CreateReceiver(void)
{
DeleteReceiver();
service_sockfd = socket(AF_INET, SOCK_DGRAM, 0); //声明数据报流
if (service_sockfd != INVALID_SOCKET)
{
BOOL flag = TRUE;
int ret = setsockopt(service_sockfd, SOL_SOCKET, SO_REUSEADDR, (char *) &flag, sizeof(flag));
if (ret == SOCKET_ERROR)
{
DeleteReceiver();
return FALSE;
}
struct sockaddr_in serv_addr;
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;//htonl();
serv_addr.sin_port = htons(m_wLocalPort);
ret = bind(service_sockfd, (struct sockaddr*) &serv_addr, sizeof(sockaddr));
if (ret == SOCKET_ERROR)
{
cout<<"bind error!"<<endl;
DeleteReceiver();
return FALSE;
}
int nZero=0;
setsockopt(service_sockfd,SOL_SOCKET,SO_RCVBUF,(char *)&nZero,sizeof(int));
int nNetTimeout = 80;
setsockopt(service_sockfd,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));
return TRUE;
}
return FALSE;
}
void CGzUdp: eleteReceiver(void)
{
if (service_sockfd != INVALID_SOCKET)
{
close(service_sockfd);
service_sockfd = INVALID_SOCKET;
}
}
//开启接收线程
BOOL CGzUdp::StartReceiving(void)
{
if (service_sockfd == INVALID_SOCKET)
{
CreateReceiver();
}
if (service_sockfd != INVALID_SOCKET)
{
if (m_bIsReceiving)
{
return TRUE;
}
int m_hRcvThread;
m_hRcvThread = pthread_create(&threadID, NULL, ReceivingThrd, this); //创建线程
return (threadID != 0);
}
return FALSE;
}
void CGzUdp::StopReceiving(void)
{
if (threadID != 0)
{
pthread_join(threadID ,NULL);
}
close(service_sockfd);
}
void * CGzUdp::ReceivingThrd(void * pParam)
{
CGzUdp * pController = (CGzUdp*) pParam;
pController->ReceivingLoop();
return 0;
}
//接收循环
void CGzUdp::ReceivingLoop(void)
{
struct sockaddr_in addr_client;
long bytes = 0;
int addr_cli_len = sizeof(struct sockaddr_in);
//这个地方是目前出错的地方:不知道调用accept()为什么没能成功,参数应该都是对的吧?
client_sockfd = accept(service_sockfd, (struct sockaddr *)&addr_client, (socklen_t *)&addr_cli_len);
if(client_sockfd == -1)
{
cout<<"accept error!"<<endl;
exit(1);
}
m_bIsReceiving = TRUE;
while (m_bIsReceiving)
{
bytes = recvfrom(client_sockfd, g_buffer, BUFSIZE, 0, (struct sockaddr *)&addr_client, (socklen_t *)&addr_cli_len);
if (bytes == SOCKET_ERROR || bytes == 0)
cout<<"receiving error!"<<endl;
else
cout<<g_buffer<<endl;
}
close(client_sockfd);
pthread_exit(0);
} |
|