常用的socket例子
来源:互联网 发布:dirt rally mac 编辑:程序博客网 时间:2024/06/10 20:29
常用的socket例子
关闭连接
shutdown(m_sock,SHUT_RDWR) //成功返回0,错误-1
设置超时
struct timeval tv;
tv.tv_sec=ms/1000;
tv.tv_usec=(ms%1000)*1000;
setsockopt(s,1,SO_SNDTIMEO,&tv,sizeof(tv));
//int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen);
读数据
int Read(char* szBuf,int nLen,int ms/* =-1 */)
{
int lenRecv=0,len,flags=0;
//check socket valid?
//SetTimeOut(ms,1);
for(;nLen>0;nLen-=len) {
len=nLen>1024?1024:nLen;
len=recv(m_sock,szBuf,len,0);
if(len==0) {
// remote closed the socket
//SetTimeOut(0,1);
return 0;
}
if(len<0) return -1;
szBuf+=len;
lenRecv+=len;
}
//SetTimeOut(0,1);
return lenRecv;
发送send
int sndbuf=1024;
int flags=0;
int len;
for(;nLen>0;nLen-=sndbuf) {
nNeedSnd=nLen>sndbuf?sndbuf:nLen;
len=send(m_sock,buf,nNeedSnd,flags);
if(len==-1) return -1;
buf+=nLen>sndbuf?sndbuf:nLen;
lenSent+=len;
}
连接
int Connect(DWORD ip,int nPort)
{
//判断m_sock是否已经打开.如果是,关闭
m_sock=socket(AF_INET,SOCK_STREAM,0);
if(m_sock==-1) { //返回值应该不是0,1,2. 除非是deamon
return ERR_SOCKET;
}
struct sockaddr_in sa;
memset(&sa,0,sizeof(sa));
sa.sin_family=AF_INET;
sa.sin_addr.s_addr=ip;
sa.sin_port=htons(nPort);
//connect成功返回0,其余-1
if(0!=connect(m_sock,(struct sockaddr*)&sa,sizeof(sa))) {
closesocket(m_sock);
m_sock=-1;
return ERR_CONNECT;
}
return 0;
}
listen和bind
//使得退出后端口马上可用
int boptval = 1;
setsockopt(m_sock, 1, SO_REUSEADDR, (const char*)&boptval, sizeof(boptval));
struct sockaddr_in sa;
memset(&sa,0,sizeof(sa));
sa.sin_family=AF_INET;
//0x01000007f表示localhost
*(u_long*)&sa.sin_addr=bLocal?0x0100007f:(ip?inet_addr(ip):INADDR_ANY);
if(nPort) sa.sin_port=htons(nPort);
if(bind(m_sock,(struct sockaddr*)&sa,sizeof(sa))) {
closesocket(m_sock);
m_sock=INVALID_SOCKET;
return ERR_SOCKET;
}
struct sockaddr_in name;
socklen_t len=sizeof(name);
getsockname(m_sock,(struct sockaddr*)&name,&len);//取回socket的port ,以确定是否绑定了需要的端口
if(listen(m_sock,SOMAXCONN)) {
closesocket(m_sock);
m_sock=INVALID_SOCKET;
return ERR_LISTEN;
}
return ntohs(name.sin_port);
socket是否可读写
int IsReadyRead(SOCKET s,int ms/* =0 */)
{
if(s==-1)
return 0;
struct timeval tv;
fd_set fs;
tv.tv_sec=ms/1000;
tv.tv_usec=(ms%1000)*1000;
FD_ZERO(&fs);
FD_SET(s,&fs);
if(select(s+1,&fs,0,0,&tv)<=0) {
return 0;
}
return 1;
}
设置nonblock
int flags = fcntl(s, F_GETFL, 0);
fcntl(s, F_SETFL, flags|O_NONBLOCK); //设置
fcntl(s, F_SETFL, flags & ~O_NONBLOCK);//重置
判断ip还是域名并返回s_addr
DWORD InetAddr(const char* host)
{
struct hostent* h=gethostbyname(host);
unsigned long ip=INADDR_NONE;
//如果是域名
if(h) {
ip=*(unsigned long*)(h->h_addr_list[0]);
}
//如果是ip地址
else if((ip=inet_addr(host))==INADDR_NONE) {
return ip;
}
return ip;
}
poll用法
struct pollfd pfd[1];
pfd[0].fd=sockfd;
pfd[0].events=POLLRDNORM;
while(1)
{
switch(poll(pfd,0+1,timeout_second))
{
case -1:
perror("error");
continue;
case 0:
//timeout
continue;
default:
{
if(pfd[0].revents&POLLRDNORM)
//accept() and add
}
}
}
shutdown(m_sock,SHUT_RDWR) //成功返回0,错误-1
设置超时
struct timeval tv;
tv.tv_sec=ms/1000;
tv.tv_usec=(ms%1000)*1000;
setsockopt(s,1,SO_SNDTIMEO,&tv,sizeof(tv));
//int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen);
读数据
int Read(char* szBuf,int nLen,int ms/* =-1 */)
{
int lenRecv=0,len,flags=0;
//check socket valid?
//SetTimeOut(ms,1);
for(;nLen>0;nLen-=len) {
len=nLen>1024?1024:nLen;
len=recv(m_sock,szBuf,len,0);
if(len==0) {
// remote closed the socket
//SetTimeOut(0,1);
return 0;
}
if(len<0) return -1;
szBuf+=len;
lenRecv+=len;
}
//SetTimeOut(0,1);
return lenRecv;
发送send
int sndbuf=1024;
int flags=0;
int len;
for(;nLen>0;nLen-=sndbuf) {
nNeedSnd=nLen>sndbuf?sndbuf:nLen;
len=send(m_sock,buf,nNeedSnd,flags);
if(len==-1) return -1;
buf+=nLen>sndbuf?sndbuf:nLen;
lenSent+=len;
}
连接
int Connect(DWORD ip,int nPort)
{
//判断m_sock是否已经打开.如果是,关闭
m_sock=socket(AF_INET,SOCK_STREAM,0);
if(m_sock==-1) { //返回值应该不是0,1,2. 除非是deamon
return ERR_SOCKET;
}
struct sockaddr_in sa;
memset(&sa,0,sizeof(sa));
sa.sin_family=AF_INET;
sa.sin_addr.s_addr=ip;
sa.sin_port=htons(nPort);
//connect成功返回0,其余-1
if(0!=connect(m_sock,(struct sockaddr*)&sa,sizeof(sa))) {
closesocket(m_sock);
m_sock=-1;
return ERR_CONNECT;
}
return 0;
}
listen和bind
//使得退出后端口马上可用
int boptval = 1;
setsockopt(m_sock, 1, SO_REUSEADDR, (const char*)&boptval, sizeof(boptval));
struct sockaddr_in sa;
memset(&sa,0,sizeof(sa));
sa.sin_family=AF_INET;
//0x01000007f表示localhost
*(u_long*)&sa.sin_addr=bLocal?0x0100007f:(ip?inet_addr(ip):INADDR_ANY);
if(nPort) sa.sin_port=htons(nPort);
if(bind(m_sock,(struct sockaddr*)&sa,sizeof(sa))) {
closesocket(m_sock);
m_sock=INVALID_SOCKET;
return ERR_SOCKET;
}
struct sockaddr_in name;
socklen_t len=sizeof(name);
getsockname(m_sock,(struct sockaddr*)&name,&len);//取回socket的port ,以确定是否绑定了需要的端口
if(listen(m_sock,SOMAXCONN)) {
closesocket(m_sock);
m_sock=INVALID_SOCKET;
return ERR_LISTEN;
}
return ntohs(name.sin_port);
socket是否可读写
int IsReadyRead(SOCKET s,int ms/* =0 */)
{
if(s==-1)
return 0;
struct timeval tv;
fd_set fs;
tv.tv_sec=ms/1000;
tv.tv_usec=(ms%1000)*1000;
FD_ZERO(&fs);
FD_SET(s,&fs);
if(select(s+1,&fs,0,0,&tv)<=0) {
return 0;
}
return 1;
}
设置nonblock
int flags = fcntl(s, F_GETFL, 0);
fcntl(s, F_SETFL, flags|O_NONBLOCK); //设置
fcntl(s, F_SETFL, flags & ~O_NONBLOCK);//重置
判断ip还是域名并返回s_addr
DWORD InetAddr(const char* host)
{
struct hostent* h=gethostbyname(host);
unsigned long ip=INADDR_NONE;
//如果是域名
if(h) {
ip=*(unsigned long*)(h->h_addr_list[0]);
}
//如果是ip地址
else if((ip=inet_addr(host))==INADDR_NONE) {
return ip;
}
return ip;
}
poll用法
struct pollfd pfd[1];
pfd[0].fd=sockfd;
pfd[0].events=POLLRDNORM;
while(1)
{
switch(poll(pfd,0+1,timeout_second))
{
case -1:
perror("error");
continue;
case 0:
//timeout
continue;
default:
{
if(pfd[0].revents&POLLRDNORM)
//accept() and add
}
}
}
- 顶
- 0
- 踩
- 0
- 猜你在找
阅读全文
0 0
- 常用的socket例子
- 常用的socket例子
- Socket + ThreadPool的例子
- raw socket 的例子
- 一道Socket的例子
- Socket的例子
- raw socket的例子
- linux 的 socket例子
- 非常简单的socket例子
- 一个简单的socket例子
- Unix Domain Socket的例子
- 一个简单socket的例子
- window socket的简单例子
- 一个socket的基础例子
- 一个简单的socket例子
- udp socket的简单例子
- 一个Android Socket的例子
- 一个完整的Socket例子
- android--流式布局(onLayout()方法)
- Ubuntu16.04+CUDA8.0+caffe配置
- bzoj3481 DZY Loves Math III
- 深入理解java垃圾回收机制
- 康纳的表情包
- 常用的socket例子
- wow.js动画插件
- hdu 2044 一只小蜜蜂... dp
- MySql
- 主成分分析指南
- Python 打印和输出
- opencv2.4.13+ros kinetic +ubuntu16.04+iai_kinect2
- 算法导论--快速排序
- python+matplot+pyplot画图