linux socket编程调用accept9()函数出错//在C语言中,也是那样调用的accept函数,为什么这里就出错了?难道是写在线程函数里面出错了?
时间:2011-08-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);
}
#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);
}
作者: fsanko 发布时间: 2011-08-24

作者: feiyinzilgd 发布时间: 2011-08-24
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
{
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
作者: yby4769250 发布时间: 2011-08-26
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28