这里简单是编写个常用sock编程实例,仅仅只写了客户端的
#include <iostream>
#include <unistd.h>
#include <string>
#include <sys/select.h>
#include <sys/socket.h>
#include <strings.h>
using namespace std;
//client
class Sock
{
private:
string m_srvIp;
unsigned int m_srvPort;
int m_sockfd;
struct sockaddr_in m_clientAddr;
struct sockaddr_in m_srvAddr;
bool m_isConnected;
public:
Sock(const string,unsigned );
virtual ~Sock();
bool init();
void connect();
int receive(char* ,int );
int send(const char* ,int );
int select();
bool isConnected();
};
Sock::Sock(const string srvIp,unsigned long srvPort)
{
m_srvIp = srvIp;
m_srvPort = srvPort;
m_isConnected = false;
}
Sock::~Sock()
{
close(m_sockfd);
}
bool Sock:: init()
{
if((m_sockfd=socket(AF_INET,SOCK_STREAM,0))<0)
{
//throw(string("init sock failed!");
return false;
}
int opt=1;
setsockopt(m_sockfd,SOL_SOCKET,SO_REUSEADDR,(char*)&opt,sizeof(opt));
struct sockaddr_in clientAddr;
bzero(&clientAddr,sizeof(clientAddr));
clientAddr.sin_family = AF_INET;
clientAddr.sin_port = htons(8888);
//INADDR_ANY实际上是inet_addr("0.0.0.0");
clientAddr.sin_addr.s_addr = INADDR_ANY;
if(bind(m_sockfd,(sockaddr*)&clientAddr,sizeof(clientAddr)<0)
{
//throw("bind ip and port failed!");
return false;
}
return true;
}
void Sock:: connect()
{
struct sockaddr_in serverAddr;
bzero(&serverAddr,sizeof(serverAddr));
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(m_srvPort);
serverAddr.sin_addr.s_addr = inet_addr(m_srvIp);
if(::connect(m_sockfd,(sockaddr*)&serverAddr,sizeof(serverAddr)))
{
throw("connect failed!");
}
m_isConnected = true;
}
int Sock::send(const char* buffer,int len)
{
return ::send(m_sockfd,buffer,len,0);
}
int Sock::receive(char* buffer,int len)
{
return recv(m_sockfd,buffer,len,0);
}
int Sock::select()
{
int result;
fd_set rdSet;
FD_ZERO(&rdSet);
FD_SET(m_sockfd,&rdSet);
struct timeval tv;
tv.tv_sec=10;
tv.tv_usec=100;
switch(result=::select(m_sockfd+1,&rdSet,NULL,NULL,&tv))
{
case 0:
{
//wait for timeout
continue;
}
break;
case -1:
{
//error
}
break;
default:
{
//文件描述符集合里有可读的文件描述符,if(FD_ISSET(m_sockfd,&fdSet));
}
break;
}
return result;
}
bool Sock::isConnected()
{
return m_isConnected;
}
int main()
{
Sock sc("192.168.130.111",8888);
sc.init();
sc.connect();
while(true)
{
sc.send();//
...
}
return 0;
}