代码比较粗超,希望各位大佬 轻喷~~
话不多说 看代码 。
公司需求是一个自己开发的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中,否则会过一段时间服务端就无法连接了