⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tcpclient.cpp

📁 蓝牙
💻 CPP
字号:
#include <stdio.h>#include <errno.h>#include <memory.h>#include <netdb.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/ioctl.h>#include <sys/socket.h>#include <unistd.h>#include "tcpclient.h"TcpClient::TcpClient(){	m_bQuit = false;	m_sock = -1;	m_pId = 0;}bool TcpClient::Create(int port){	m_sock = socket(PF_INET, SOCK_STREAM, 0);	return m_sock > 0;}void TcpClient::Close(){	if (m_sock > 0)	{		close(m_sock);		m_sock = -1;	}}TcpClient::~TcpClient(){	Close();	if (m_pId > 0)	{		m_bQuit = true;		pthread_join(m_pId, NULL);		m_pId = 0;	}}void* TcpClient::SocketThread(void* param){	TcpClient* p = (TcpClient*)param;	p->Process();	return 0;}bool TcpClient::Process(){	printf("TcpClient::Process start\n");	struct timeval timeout;	fd_set r_fds;	int ret = 0;	while (!m_bQuit)	{		if (m_bQuit)			break;		if (m_sock < 0)		{			usleep(100 * 1000);			continue;		}		timeout.tv_sec = 1;		timeout.tv_usec = 0;		FD_ZERO(&r_fds);		FD_SET(m_sock, &r_fds);		ret = select(m_sock + 1, &r_fds, NULL, NULL, &timeout);		// printf("the ret is %d \n", ret);		if (ret == -1 && errno == EINTR)		{			usleep(100 * 1000);			continue;		}		else if (ret < 0)		{			perror("select()");			printf("m_sock = %d\n", m_sock);			usleep(100 * 1000);			continue;			// break;		}		else if (ret > 0)		{			if(FD_ISSET(m_sock, &r_fds))			{				if (!m_bQuit)					OnReceive();			}		}		else		{			// ret == 0			// printf("time out %d\n", ret);		}	}	printf("TcpClient::Process exit\n");	return true;}bool TcpClient::Connect(const char* serverip, int serverport){	int ret = -1;	struct sockaddr_in addr_in;	struct hostent *he;    	printf("uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu\n");	printf("%s\n",serverip);	printf("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv\n");	if ((he = gethostbyname(serverip))== 0)	{		printf("gethostbyname error\n");		return false;	}	memset((char*)&addr_in, 0, sizeof(struct sockaddr_in));	addr_in.sin_family = PF_INET;	addr_in.sin_port = htons(serverport);	addr_in.sin_addr = *((struct in_addr *)he->h_addr);	ret = connect(m_sock, (struct sockaddr *)&addr_in, sizeof(addr_in));	if (ret == -1)		return false;	int blockORnot = 0;	ioctl(m_sock, FIONBIO, &blockORnot);	if (ret == -1)	{		printf("ioctl error\n");		close(m_sock);		m_sock = -1;		return false;	}	if (m_pId <= 0)	{		pthread_create(&m_pId, NULL, SocketThread, this);		// pthread_join(m_pId, NULL);		// m_pId = 0;	}	return m_pId > 0 && m_sock > 0;}int TcpClient::Receive(char* buf, int size){	return recv(m_sock, buf, size, 0);}int TcpClient::Send(const char* buf, int size){	int nLeft = size;	int nWritten = -1;	const char* p = buf;	while (nLeft > 0)	{		nWritten = send(m_sock, p, nLeft > 128 ? 128 : nLeft, 0);		if (nWritten < 0)			return -1;		if (nWritten == 0)			return -2;		nLeft -= nWritten;		p += nWritten;	}	return size - nLeft;/*	int i = 0, ret = 0, intretry = 0;	struct timeval tival;	fd_set writefds;	tival.tv_sec = 0;	tival.tv_usec = 50 * 1000;	FD_ZERO(&writefds);	if (m_sock > 0)	{		FD_SET(m_sock, &writefds);	}	else	{		return -2;	}	ret = select(m_sock + 1, NULL, &writefds, NULL, &tival);	if (ret <= 0)	{		if (ret == -1 && errno == EINTR)			return -3;	}	if (!(FD_ISSET(m_sock, &writefds)))	{		return -4;	}	while (i < size)	{		ret = send(m_sock, buf + i, size - i, 0);		if(ret <= 0)		{			if (EINTR == errno)			{				if(intretry < 2)				{					intretry++;					continue;				}			}			return -1;		}		else			i += ret;	}	return i;*/}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -