自己对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" #ifdef _DEBUG ////////////////////////////////////////////////////////////////////// mysocket::mysocket() } mysocket::~mysocket() } } } return ::bind(s,(LPSOCKADDR)&addr,sizeof(addr)); } } } } s=s1; } return ::ntohl(addr.sin_port); 代码很简单,都是封装了些函数罢了,下面给出个简单示例: mysocket s; s.init(0); s.bind(5000); s.listen(); mysocket s1; s.accept(s1); s1.asyncselect(m_hWnd); 怎么样,很简单吧,init中0代表tcp,1代表udp,其他数字代表原始套接字。 文章有不妥之处,还望大家多多指正。
};
//
//////////////////////////////////////////////////////////////////////
#include "client.h"
#include "clientDlg.h"
#include "mysocket.h"
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
{
{
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;
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){
}
SOCKET mysocket::getsocket(){
return s;
}
void mysocket::asyncselect(HWND d,int m){
::WSAAsyncSelect(s,d,WM_SOCKET,m);
int mysocket::getport(){
}
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;
}