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;
}
#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;
}
相关文章推荐
- linux 使用sock编程实例
- LinuxC/C++编程基础(32) 使用thrift/rpc开发简单实例(续4)
- linux 2.6内核编程-ioctl使用实例
- LinuxC/C++编程基础(23) 使用thrift/rpc开发简单实例(续1)
- LinuxC/C++编程基础(35) std::istream使用实例
- Linux C语言编程-Linux网络通信--Linux上使用套接字(socket)来发送信息---知识点总结+实例
- LinuxC/C++编程基础(20) 使用boost::asio搭建服务器简单实例
- Linux C语言编程-Linux网络通信--Linux上使用curl来发送Http协议的报文---知识点总结+实例d
- 【Linux基础】网络基础编程之使用实例
- 串口设置,select和 signal 在linux编程中的使用实例
- LinuxC/C++编程基础(21) 使用boost::asio搭建服务器简单实例(续)
- LinuxC/C++编程基础(24) 使用thrift/rpc开发简单实例(续2)
- LinuxC/C++编程基础(31) 使用thrift/rpc开发简单实例(续3)
- Linux下多进程编程之exec函数语法及使用实例
- LinuxC/C++编程基础(22) 使用thrift/rpc开发简单实例
- Linux系统进程控制编程(三)——exec函数族的使用
- 实例解说Linux中fdisk分区使用方法
- Linux Socket编程实例(一个Hello World程序)
- [今天的编程日记, 在vb中使用vc编译的dll实例]
- 编程实例 使用C#的BitmapData