MFC TCP服务端

 

代码比较粗超,希望各位大佬 轻喷~~

话不多说 看代码 。

公司需求是一个自己开发的APP 通过TCP传输数据到 PC端一个数据处理软件。 大部分代码也是参考前辈们的成果,在这里表示非常感谢。

#include "winsock2.h"
#pragma comment(lib, "WS2_32.lib") 

在对话框类中申明如下变量和一个用于连接的线程函数

UINT server_thd(LPVOID P);//声明线程函数
SOCKET listen_socket;//全局监听sock
SOCKET sock; //定义一个socket
UINT server_thd(LPVOID P) {

	//初始化WinSock 如果没有这段 socket将会一直无连接!!!!!!!!!
	WSADATA wsaData;
	if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) 
	{
		return 0;

	}

	sockaddr_in local_addr;
	sockaddr_in client_addr;
	int addrSize = sizeof(sockaddr_in);
	int res;
	char msg[1024];
	TcpReceiveDlg * dlg =(TcpReceiveDlg * ) AfxGetApp()->GetMainWnd();

	local_addr.sin_family = AF_INET; // 互联网地址簇	
	local_addr.sin_port = htons(8080);//端口		
	local_addr.sin_addr.S_un.S_addr= htonl(INADDR_ANY);//本机IP
	//	local_addr.sin_addr.S_un.S_addr=	inet_addr("192.169.13.183");  

	//创建socket套接字 
	//AF_INET 协议簇代表TCP/IP    SOCK_STREAM socket类型   IPPROTO_TCP协议类型
	listen_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (listen_socket == INVALID_SOCKET)
	{
		//线程中无法更新UI 所以不显示 需要的自己添加
		//AfxMessageBox("error");
		dlg->update(_T("创建监听失败"));
	}

	/*通常服务器在启动的时候都会绑定一个众所周知的协议地址,
	用于提供服务,客户就可以通过它来接连服务器;
	而客户端可以指定IP或端口也可以都不指定,
	未分配则系统自动分配。这就是为什么通常服务器端在listen之前会调用bind(),
	而客户端就不会调用,而是在connect()时由系统随机生成一个。
*/

	if (bind(listen_socket, (struct sockaddr*) &local_addr, sizeof(SOCKADDR_IN)))
	{
		dlg->update(_T("绑定错误"));
	}
	// 第二个参数为套接字最大连接数
	listen(listen_socket, 1);
	
	if ((sock = accept(listen_socket, (struct sockaddr *)&client_addr, &addrSize)) == INVALID_SOCKET)
	{
		dlg->update(_T("accept 失败"));
	}
	else
	{
		CString port;
		int  clientPort = client_addr.sin_port;
		port.Format(_T("%d"), clientPort);
		dlg->update(_T("已连接来自:" )+ CString(inet_ntoa(client_addr.sin_addr)) + _T("  端口:") + port);
	}

	//接收数据
	while (1)
	{
		//根据自己需求来
}

大致的代码就如上了注释也都有了  可以通过APP TCP 连接到PC

emmmmmmmmmmmmm

上面的代码  accept()这个应该写入while中,否则会过一段时间服务端就无法连接了 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值