自己对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,其他数字代表原始套接字。
文章有不妥之处,还望大家多多指正。