linux 使用sock编程实例

这里简单是编写个常用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;

}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值