可在windows和linux上运行
//TcpClient.h
#pragma once
#include <string>
class CTcpClient
{
public:
CTcpClient();
virtual ~CTcpClient();
void Close();
bool Connect(const char *ip, unsigned short port);
int Recv(char *buf, int bufsize);
int Send(const char *buf, int sendsize);
private:
int m_sockfd;
};
//TcpClient.cpp
#include "TcpClient.h"
#ifdef WIN32
#include <WinSock2.h>
#include <windows.h>
#define write(fd,buf,len) send((fd),(buf),(len),0)
#define read(fd,buf,len) recv((fd),(buf),(len),0)
#else
#include <sys/socket.h>
#include <sys/wait.h>
#include <signal.h>
#include <unistd.h>
#include <netdb.h>
#include <arpa/inet.h>
#define closesocket close
#endif
CTcpClient::CTcpClient()
{
#ifdef WIN32
WSADATA wsaData;
int err = WSAStartup(MAKEWORD(2, 2), &wsaData);
if (err != 0)
{
printf("WSAStartup error\n");
}
#endif
}
CTcpClient::~CTcpClient()
{
#ifdef WIN32
WSACleanup();
#endif
}
bool CTcpClient::Connect(const char *ip, unsigned short port)
{
struct sockaddr_in clientAddr;
int length = 0;
m_sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (m_sockfd == -1)
{
return false;
}
else
{
clientAddr.sin_family = AF_INET;
//服务器的地址
clientAddr.sin_addr.s_addr = inet_addr(ip);
clientAddr.sin_port = htons(port);
length = sizeof(clientAddr);
if (connect(m_sockfd, (struct sockaddr*)&clientAddr, length) == -1)
{
return false;
}
else
{
return true;
}
}
}
int CTcpClient::Recv(char* buf, int bufsize)
{
return recv(m_sockfd, buf, bufsize, 0);
}
int CTcpClient::Send(const char* buf, int size)
{
int s = 0;
while (s != size)
{
int len = send(m_sockfd, buf + s, size - s, 0);
if (len <= 0)
{
break;
}
s += len;
}
return s;
}
void CTcpClient::Close()
{
if (m_sockfd <= 0)
{
return;
}
closesocket(m_sockfd);
}
调用方法
CTcpClient tcpClient;
tcpClient.Connect("192.168.1.1", 12000);
tcpClient.Send("test", 5);
char receive[128] = {0};
tcpClient.Recv(receive,sizeof(receive));
printf("%s\n", receive);