当前位置:首页 > 代码 > 正文

mfc写tcp源代码(mfc编写)

admin 发布:2022-12-19 22:49 151


本篇文章给大家谈谈mfc写tcp源代码,以及mfc编写对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

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()时会进行连接。

希望对你有帮肋..

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界面中实现tcp功能

其实,不用说的太多。C++就是纯的利用socket进行网络通信编程。MFC就是基于图形界面进行网络通信编程。它们所调用的类库不一样。

补充一下答案:

C++ socket典型的调用方式是利用:异步套接字 WSASocket TCP

MFC socket典型的调用方式是利用:CSocket

这两者有本质区别。

mfc写tcp源代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于mfc编写、mfc写tcp源代码的信息别忘了在本站进行查找喔。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/28496.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载