📄 tcpclient.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 + -