Ⅰ MFC SOCKET编程 10048错误!!!
……你要不要试试看以管理员身份运行?
10048是端口被占用,但是换了好几个也不行就怀疑是不是没权限了
另:试试看把所谓的系统安全软件关掉?猜测,只是猜测,这类软件有的有可能会做出阻止端口监听的事情来
Ⅱ mfc中套接字socket的用法
学习这个类,首先需要了解基本的TCP/IP 和UDP 协议,对端口…………都有一定的理解……以下是我总结的重要的几点,希望对你有用……有不懂得可以到我空间提问……
1.利用Tcp协议编程
1)服务器端:
a)建立TCP监听器TcpListener对象。
TcpListener tl=new TcpListener(端口号);
b)启动监听器
tl.Start();
c)用监听器获取连接进来的套接字(Socket)
Socket s=myList.AcceptSocket();
d)通过Socket的Receive方法获取客户端发送的数据
byte [] result=new byte[1024];
int k=s.Receive(result);
e)通过Socket的Send方法向客户端发送数据
byte[] st=System.Text.Encoding.Default.GetBytes(“text”);
s.Send(st);
f)在通讯结束后,需要释放资源结束监听
s.Close();
tl.Stop();
2)客户端:
a)建立TCP客户端TcpClient对象。
TcpClient tcpclnt = new TcpClient();
b)连接服务器
tcpclnt.Connect(IP地址字符串,端口号);
c)获得客户端网络传输 流
Stream stm =tcpclnt.GetStream();
d)通过Stream的Write方法向服务器端发送的数据
e)通过Stream的Read方法读取服务器段发来的数据
f)在通讯结束后,需要释放资源,结束和服务器的连接
tcpclnt.Close();
2.利用UDP协议编程
a)建立UDP客户端UdpClient对象。
UdpClient uc=new UdpClient(端口号);
b)连接对方远程主机
uc.Connect(IP地址,对方远程主机的端口号);
c)通过uc的Receive方法获取远程主机发送来的数据
IPEndPoint ip=new IPEndPoint(IPAddress.Parse(IP字符串),端口号);
byte[] b=uc.Receive(ref ip);
e)通过uc的Send方法向远程主机发送数据
byte[] st=System.Text.Encoding.Default.GetBytes(“text”);
uc.Send(st);
f)在通讯结束后,需要释放资源
uc.Close();
Ⅲ vc++6.0编的基于MFC的简单的tcp聊天程序
4.1服务器端代码
开启服务器功能:
void OnServerOpen() //开启服务器功能
{
WSADATA wsaData;
int iErrorCode;
char chInfo[64];
if (WSAStartup(WINSOCK_VERSION, &wsaData)) //调用Windows Sockets DLL
{ MessageBeep(MB_ICONSTOP);
MessageBox("Winsock无法初始化!", AfxGetAppName(), MB_OK|MB_ICONSTOP);
WSACleanup();
return; }
else
WSACleanup();
if (gethostname(chInfo, sizeof(chInfo)))
{ ReportWinsockErr("\n无法获取主机!\n ");
return; }
CString csWinsockID = "\n==>>服务器功能开启在端口:No. ";
csWinsockID += itoa(m_pDoc->m_nServerPort, chInfo, 10);
csWinsockID += "\n";
PrintString(csWinsockID); //在程序视图显示提示信息的函数,读者可自行创建
m_pDoc->m_hServerSocket=socket(PF_INET, SOCK_STREAM, DEFAULT_PROTOCOL);
//创建服务器端Socket,类型为SOCK_STREAM,面向连接的通信
if (m_pDoc->m_hServerSocket == INVALID_SOCKET)
{ ReportWinsockErr("无法创建服务器socket!");
return;}
m_pDoc->m_sockServerAddr.sin_family = AF_INET;
m_pDoc->m_sockServerAddr.sin_addr.s_addr = INADDR_ANY;
m_pDoc->m_sockServerAddr.sin_port = htons(m_pDoc->m_nServerPort);
if (bind(m_pDoc->m_hServerSocket, (LPSOCKADDR)&m_pDoc->m_sockServerAddr,
sizeof(m_pDoc->m_sockServerAddr)) == SOCKET_ERROR) //与选定的端口绑定
{ReportWinsockErr("无法绑定服务器socket!");
return;}
iErrorCode=WSAAsyncSelect(m_pDoc->m_hServerSocket,m_hWnd,
WM_SERVER_ACCEPT, FD_ACCEPT);
//设定服务器相应的网络事件为FD_ACCEPT,即连接请求,
// 产生相应传递给窗口的消息为WM_SERVER_ACCEPT
if (iErrorCode == SOCKET_ERROR)
{ ReportWinsockErr("WSAAsyncSelect设定失败!");
return;}
if (listen(m_pDoc->m_hServerSocket, QUEUE_SIZE) == SOCKET_ERROR) //开始监听客户连接请求
{ReportWinsockErr("服务器socket监听失败!");
m_pParentMenu->EnableMenuItem(ID_SERVER_OPEN, MF_ENABLED);
return;}
m_bServerIsOpen = TRUE; //监视服务器是否打开的变量
return;
}
响应客户发送聊天文字到服务器:ON_MESSAGE(WM_CLIENT_READ, OnClientRead)
LRESULT OnClientRead(WPARAM wParam, LPARAM lParam)
{
int iRead;
int iBufferLength;
int iEnd;
int iRemainSpace;
char chInBuffer[1024];
int i;
for(i=0;(i
//MAXClient是服务器可响应连接的最大数目
{}
if(i==MAXClient) return 0L;
iBufferLength = iRemainSpace = sizeof(chInBuffer);
iEnd = 0;
iRemainSpace -= iEnd;
iBytesRead = recv(m_aClientSocket[i], (LPSTR)(chInBuffer+iEnd), iSpaceRemaining, NO_FLAGS);
//用可控缓冲接收函数recv()来接收字符
iEnd+=iRead;
if (iBytesRead == SOCKET_ERROR)
ReportWinsockErr("recv出错!");
chInBuffer[iEnd] = '\0';
if (lstrlen(chInBuffer) != 0)
{PrintString(chInBuffer); //服务器端文字显示
OnServerBroadcast(chInBuffer); //自己编写的函数,向所有连接的客户广播这个客户的聊天文字
}
return(0L);
}
对于客户断开连接,会产生一个FD_CLOSE消息,只须相应地用closesocket()关闭相应的Socket即可,这个处理比较简单。
4.2客户端代码
连接到服务器:
void OnSocketConnect()
{ WSADATA wsaData;
DWORD dwIPAddr;
SOCKADDR_IN sockAddr;
if(WSAStartup(WINSOCK_VERSION,&wsaData)) //调用Windows Sockets DLL
{MessageBox("Winsock无法初始化!",NULL,MB_OK);
return;
}
m_hSocket=socket(PF_INET,SOCK_STREAM,0); //创建面向连接的socket
sockAddr.sin_family=AF_INET; //使用TCP/IP协议
sockAddr.sin_port=m_iPort; //客户端指定的IP地址
sockAddr.sin_addr.S_un.S_addr=dwIPAddr;
int nConnect=connect(m_hSocket,(LPSOCKADDR)&sockAddr,sizeof(sockAddr)); //请求连接
if(nConnect)
ReportWinsockErr("连接失败!");
else
MessageBox("连接成功!",NULL,MB_OK);
int iErrorCode=WSAAsyncSelect(m_hSocket,m_hWnd,WM_SOCKET_READ,FD_READ);
//指定响应的事件,为服务器发送来字符
if(iErrorCode==SOCKET_ERROR)
MessageBox("WSAAsyncSelect设定失败!");
}
接收服务器端发送的字符也使用可控缓冲接收函数recv(),客户端聊天的字符发送使用数据可控缓冲发送函数send(),这两个过程比较简单,在此就不加赘述了。
Ⅳ mfc socket 编程的流程是怎么样的
初始化socket
首先需要调用AfxSocketInit()函数来初始化我们的socket环境。
为了初始化sockets,我们需要调用AfxSocketInit()函数。它通常是在MFC中的InitInstance()函数中被调用的。如果我们用程序向导来创建socket程序的话,查看“use Windows Sockets”这个选项,然后选中它。它将会自动的为我们创建这个步骤了。(如果我们没有选中这个选项的话,我们也可以手动添加这些代码的。)这个函数的返回值显示这个函数的调用成功或失败。
BOOL CServerApp::InitInstance()
{....
if( AfxSocketInit() == FALSE)
{
AfxMessageBox("Sockets Could Not Be Initialized");
return FALSE;
}
...
}
创建Server Sockets
为了创建一个Server Socket,我们需要声明一个CAyncSocket的变量或者我们自己定制的一个从AyncSocket或是Cscket继承来的类的类型的变量。然后调用Create()函数,同时指定监听的端口。这个函数的返回值显示这个函数的调用成功或失败。
UpdateData(TRUE);
m_sListener.Create(m_port);
if(m_sListener.Listen()==FALSE)
{
AfxMessageBox("Unable to Listen on that port,please try another port");
m_sListener.Close();
return;
}
创建Client Sockets
为了创建Client socket类,我们需要声明一个CAyncSocket的变量或者我们自己定制的一个从AyncSocket或是Cscket继承来的类的类型的变量。然后调用Create()函数,同时指定监听的端口。这个函数的返回值显示这个函数的调用成功或失败。
m_sConnected.Create();
m_sConnected.Connect("server ip",port);
监听客户端的连接
创建了server socket以后,我们要进行监听。调用Listen()函数。这个函数的返回值显示这个函数的调用成功或失败。
if( m_sListener.Listen()== FALSE)
{
AfxMessageBox("Unable to Listen on that port,please try another port");
m_sListener.Close();
return;
}
接受连接
连接请求要被接受accept,是用另外的socket,不是正在监听的socket。请参看代码。
void CXXXDlg::OnAccept()
{
CString strIP;
UINT port;
if(m_sListener.Accept(m_sConnected))
{
m_sConnected.GetSockName(strIP,port); //应该是GetPeerName,获取对方的IP和port
m_status="Client Connected,IP :"+ strIP;
m_sConnected.Send("Connected To Server",strlen("Connected To Server"));
UpdateData(FALSE);
}
else
{
AfxMessageBox("Cannoot Accept Connection");
}
}
发送数据
数据放在一个buffer中或是结构体中,调用send()函数发送。
m_sConnected.Send(pBuf,iLen);
接受数据
调用receive()接受数据。
void CXXXrDlg::OnReceive()
{
char *pBuf =new char [1025];
CString strData;
int iLen;
iLen=m_sConnected.Receive(pBuf,1024);
if(iLen == SOCKET_ERROR)
{
AfxMessageBox("Could not Recieve");
}
else
{
pBuf[iLen]=NULL;
strData=pBuf;
m_recieveddata.Insert(m_recieveddata.GetLength(),strData);
//display in server
UpdateData(FALSE);
m_sConnected.Send(pBuf,iLen); //send the data back to the Client
delete pBuf;
}
}
关闭连接
m_sConnected.ShutDown(0); 停止发送数据
m_sConnected.ShutDown(1); 停止接受数据
m_sConnected.ShutDown(2); 停止发送接受数据
m_sConnected.Close();
编写自己的socket类
在class view中选择添加一个新类,设置它的基类为CAsyncSocket,在类向导的帮助下添加如下的一些函数。
class MySocket : public CAsyncSocket
{ // Attributes
public:
// Operations
public:
MySocket();
virtual ~MySocket();
// Overrides
public:
void SetParentDlg(CDialog *pDlg);// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(MySocket)
public:
virtual void OnAccept(int nErrorCode);
virtual void OnClose(int nErrorCode);
virtual void OnConnect(int nErrorCode);
virtual void OnOutOfBandData(int nErrorCode);
virtual void OnReceive(int nErrorCode);
virtual void OnSend(int nErrorCode);
//}}AFX_VIRTUAL // Generated message map functions
//{{AFX_MSG(MySocket)
// NOTE - the ClassWizard will add and remove member functions here. //}}AFX_MSG
protected:
private:
CDialog * m_pDlg;
};
设置“Parent Dialog”
调用这个socket类的SetParentDlg函数,保证当socket事件发生的时候这个窗体能接收到。
m_sListener.SetParentDlg(this);
m_sConnected.SetParentDlg(this);
建立Socket 事件和窗体成员函数之间的联系
在这个窗体类中添加一些函数,比如void OnReceive(); void OnClose(); void OnAccept(); void OnConnect()等,它们会在我们编写的的socket类中调用到。
void MySocket::OnAccept(int nErrorCode)
{
// TODO: Add your specialized code here and/or call the base class
if(nErrorCode==0)
{
((CServerDlg*)m_pDlg)->OnAccept();
}
CAsyncSocket::OnAccept(nErrorCode);
}
Ⅳ MFC中提供socket通信功能的类有几个类名是什么用示意图简述socket的TCP(有连接的)
MFC 最常用的socket类就是CSocket类了,AfxSocketInit()封装了套接字的版本的请求和套接字的释放等。具体实现函数参考MSDN.
TCP 连接示意图我就懒的找了,网上随便找下都是。我按照我的理解给你写个吧。
TCP(面向连接)Socket 编程
服务端
1. 创建套接字(Socket)
2.将套接字绑定到一个本地地址和端口上(bind)
3.将套接字设为监听模式,等待客户端连接(listen)
4.当请求到来时,接收该请求,并返回一个新的对应于此次连接的套接字(accept)
5.用返回的套接字和客户端进行数据局传输(send /recv)
6.返回等待另一个客户请求
7.关闭套接字
客户端
1.创建套接字,(socket)
2.向服务器发出连接请求,(connect)
3.和服务端进行通信(send/recv)
4. 关闭套接字。
基本流程就是这样子,具体还要你自己亲自上机编写。感受这样的流程。还有什么不懂的,可以问我,共同进步。。。
Ⅵ C++ socket编程 和 MFC socket编程 有什么区别
其实,不用说的太多。C++就是纯的利用socket进行网络通信编程。MFC就是基于图形界面进行网络通信编程。它们所调用的类库不一样。
补充一下答案:
C++ socket典型的调用方式是利用:异步套接字 WSASocket TCP
MFC socket典型的调用方式是利用:CSocket
这两者有本质区别。
Ⅶ mfc中用TCP/IP socket编程来写了一个简单的收发端,可客户端的accept()老连接不上
你的意思是不是服务端卡在accept()那,然后客户端弹出“连接失败!”窗口?
如果是这样的话先检查网络连接是否正常,然后IP是不是对的
如果以上都没问题,用WSAGetLastError()得到错误代码并在MessageBox()中显示。
另外发现你用阻塞方式收发数据,最好将这两段代码放入新线程,否则容易卡死
附上WSAGetLastError()错误代码:
WSAENOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。
WSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。
WSAEADDRINUSE:所指的地址已在使用中。
WSAEINTR:通过一个WSACancelBlockingCall()来取消一个(阻塞的)调用。
WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。
WSAEADDRNOTAVAIL:在本地机器上找不到所指的地址。
WSAENOTSUPPORT:所指族中地址无法与本套接口一起使用。
WSAECONNREFUSED:连接尝试被强制拒绝。
WSAEDESTADDREQ:需要目的地址。
WSAEFAULT:namelen参数不正确。
WSAEINVAL:套接口没有准备好与一地址捆绑。
WSAEISCONN:套接口早已连接。
WSAEMFILE:无多余文件描述字。
WSAENETUNREACH:当前无法从本主机访问网络。
WSAENOBUFS:无可用缓冲区。套接口未被连接。
WSAENOTSOCK:描述字不是一个套接口。
WSAETIMEOUT:超时时间到。
WSAEWOULDBLOCK:套接口设置为非阻塞方式且连接不能立即建立。可用select()调用对套接口写,因为select()时会进行连接。
希望对你有帮肋..