您的位置:首页 > 运维架构 > Linux

linux 使用sock编程实例

2018-01-30 14:47 183 查看
这里简单是编写个常用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(
a0f9
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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: