封装自己的socket类

       自己对windows下的socket做了下封装,主要是自己用着顺手罢,当然是在用mfc的csocket发现点问题,于是索性自己写一个了。写的不好,还请大家多多指教啊。

mysocket.h:

// mysocket.h: interface for the mysocket class.
//
//

#if !defined(AFX_MYSOCKET_H__C142FE73_FC40_4235_8C9D_5E7493376017__INCLUDED_)
#define AFX_MYSOCKET_H__C142FE73_FC40_4235_8C9D_5E7493376017__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#define WM_SOCKET (WM_USER+1)
class mysocket 
{
public:
 mysocket();
 virtual ~mysocket();
 void init(int type=0,int protocol=1);
 int send(char *buf,int len,int flags=0);
 int recv(char *buf,int len,int flags=0);
 int bind(int port);
 int listen(int max=5);
void accept(mysocket& s1);
int connect(char *addr1,int port);
void attach(SOCKET s1);
SOCKET getsocket();
void asyncselect(HWND d,int m=FD_ACCEPT|FD_READ|FD_WRITE|FD_CONNECT|FD_CLOSE);
int getport();
char *getaddr();
void close();
int sendto(char *buf,int len,char *addr,int port,int flags=0);
int recvfrom(char *buf,int len,int flags=0);
protected:
 sockaddr_in addr;
 SOCKET s;


};

#endif // !defined(AFX_MYSOCKET_H__C142FE73_FC40_4235_8C9D_5E7493376017__INCLUDED_)

mysocket.cpp:

// mysocket.cpp: implementation of the mysocket class.
//
//

#include "stdafx.h"
#include "client.h"
#include "clientDlg.h"
#include "mysocket.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//
// Construction/Destruction
//

mysocket::mysocket()
{

}

mysocket::~mysocket()
{

}
void mysocket::init(int type,int protocol){
 if(type==0){
s=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
 }else if(type==1){
s=::socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
 }else{
s=::socket(AF_INET,SOCK_RAW,protocol);
 }

}
int mysocket::send(char *buf,int len,int flags){
return ::send(s,buf,len,flags);


}
int mysocket::recv(char *buf,int len,int flags){
return ::recv(s,buf,len,flags);

}
int mysocket::bind(int port){
addr.sin_family=AF_INET;
 addr.sin_port=::htons(port);
 addr.sin_addr.S_un.S_addr=INADDR_ANY;

 return ::bind(s,(LPSOCKADDR)&addr,sizeof(addr));

}
int mysocket::listen(int max){
return ::listen(s,max);

}
void mysocket::accept(mysocket& s1){
int n=sizeof(s1.addr);
s1.s=::accept(s,(SOCKADDR*)&s1.addr,&n);

}
int mysocket::connect(char *addr1,int port){
 addr.sin_family=AF_INET;
 addr.sin_port=::htons(port);
 addr.sin_addr.S_un.S_addr=::inet_addr(addr1);
return ::connect(s,(sockaddr*)&addr,sizeof(addr));

}
void mysocket::attach(SOCKET s1){

s=s1;
}
SOCKET mysocket::getsocket(){
return s;
}
void mysocket::asyncselect(HWND d,int m){
 ::WSAAsyncSelect(s,d,WM_SOCKET,m);

}
int mysocket::getport(){

return ::ntohl(addr.sin_port);
}
char *mysocket::getaddr(){
return ::inet_ntoa(addr.sin_addr);
}
void mysocket::close(){
 ::closesocket(s);
}
int mysocket::sendto(char *buf,int len,char *addr1,int port,int flags){
  addr.sin_family=AF_INET;
 addr.sin_port=::htons(port);
 addr.sin_addr.S_un.S_addr=::inet_addr(addr1);
int l=::sendto(s,buf,len,flags,(sockaddr*)&addr,sizeof(addr));
return l;
}
int mysocket::recvfrom(char *buf,int len,int flags){
 sockaddr_in addr1;
int n=sizeof(addr1);
int l=::recvfrom(s,buf,len,flags,(sockaddr*)&addr,&n);
addr=addr1;
return l;
}

 

代码很简单,都是封装了些函数罢了,下面给出个简单示例:

mysocket s;

s.init(0);

s.bind(5000);

s.listen();

mysocket s1;

s.accept(s1);

s1.asyncselect(m_hWnd);

怎么样,很简单吧,init中0代表tcp,1代表udp,其他数字代表原始套接字。

       文章有不妥之处,还望大家多多指正。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值