linux socket编程调用accept9()函数出错//在C语言中,也是那样调用的accept函数,为什么这里就出错了?难道是写在线程函数里面出错了?

fsanko 2011-08-24 06:16:24
#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>

typedef int SOCKET;
typedef unsigned char BYTE;
typedef unsigned long DWORD;
typedef unsigned int WORD;
typedef int BOOL;

#define BUFSIZE (1024*16)
#define QUEUE_LEN 10
#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;

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()
{
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::DeleteSender(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();
exit(1);
}

/* if ((listen(service_sockfd, QUEUE_LEN)) == -1)
{
cout<<"listen error!"<<endl;
exit(1);
}
cout<<"listening...."<<endl;
*/ 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::DeleteReceiver(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); //创建了一个线程ReceivingThrd为线程函数
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);
client_sockfd = accept(service_sockfd, (struct sockaddr *)&addr_client, (socklen_t *)&addr_cli_len);
//在C语言中,也是这样调用的accept函数,为什么这里就出错了?难道是写在线程函数里面出错了?
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);
}
...全文
106 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
yby4769250 2011-08-26
  • 打赏
  • 举报
回复
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;
}

的这里service_sockfd = socket(AF_INET, SOCK_DGRAM, 0);错了,这个是创建udp套接字你应该service_sockfd = socket(AF_INET, SOCK_STREAM, 0);创建tcp类型的套接字才能调用accept
谭海燕 2011-08-24
  • 打赏
  • 举报
回复

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧