如何读取本机端口的数据???

yy306520 2007-09-28 05:04:22
本机的IP是192.168.0.2,端口是4444,现在需要监听本机的4444端口,只要来了数据(来的数据只会就是数字和字母组合),就写到一个.txt文档里面,请大家帮忙,谢谢大家了。
读出的和一个第三方软件一样的就OK了。完成了立即揭帖给分。
...全文
351 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
candy_hxu 2008-09-27
  • 打赏
  • 举报
回复
问题1:你是不是要通过GPRS实现数据的传输啊?
如果是,那就继续问题2;如果不是,那我也不知道答案了,后面写的可以不看。

问题2:你说到你的IP是192.168.0.2,那你是不是内网的?
如果是,那就看看我的想法;如果不是,那我也不知道答案了,后面写的可以不看。

我认为:问题在于你的连接没有成功地建立,数据可能发送了,但是根本就没有送到你的机器来。
首先得知道你连接网络的真实IP,可打开www.ip.cn查到,注意,如果你没有申请固定IP,那这个IP的数值会变化的
然后,将设置路由器端口映射到你机器
最后,发送方连接时要用你的真实IP,然后你才能收到数
到底数据有没有发送过来,可以通过一些第三方软件看到,例如科浪gprs测试软件
当确定收到数据后,再测试你编写的程序吧
neversaydie518 2007-10-13
  • 打赏
  • 举报
回复
最简单的服务器端的程序,已经调试过了。你只要再判断
来的数据是数字和字母组合,再写到一个.txt文档里面就OK了

#pragma comment(lib,"WS2_32.lib")

#include <winsock2.h>
#include<iostream>
#include<string>
using namespace std;

void main(void)
{
WSADATA wsaData;
SOCKET ListeningSocket;
SOCKET NewConnection;
SOCKADDR_IN ServerAddr;
SOCKADDR_IN ClientAddr;
int ClientAddrLen;
int Port = 4444;
int Ret;
char DataBuffer[1024];


// Initialize Winsock version 2.2

if ((Ret = WSAStartup(MAKEWORD(2,2), &wsaData)) != 0)
{
cout<<"WSAStartup failed with error"<<Ret<<endl;
return;
}

// Create a new socket to listening for client connections.

if ((ListeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))
== INVALID_SOCKET)
{
cout<<"socket failed with error"<<WSAGetLastError()<<endl;
WSACleanup();
return;
}

ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(Port);
ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY);

// Associate the address information with the socket using bind.

if (bind(ListeningSocket, (SOCKADDR *)&ServerAddr, sizeof(ServerAddr))
== SOCKET_ERROR)
{
cout<<"bind failed with error"<<WSAGetLastError()<<endl;
closesocket(ListeningSocket);
WSACleanup();
return;
}

if (listen(ListeningSocket, 5) == SOCKET_ERROR)
{
cout<<"listen failed with error"<<WSAGetLastError()<<endl;
closesocket(ListeningSocket);
WSACleanup();
return;
}

//reuse
const char opt = 1;
setsockopt(ListeningSocket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

// Accept a new connection when one arrives.

if ((NewConnection = accept(ListeningSocket, (SOCKADDR *) &ClientAddr,
&ClientAddrLen)) == INVALID_SOCKET)
{
cout<<"accept failed with error"<<WSAGetLastError()<<endl;
closesocket(ListeningSocket);
WSACleanup();
return;
}

closesocket(ListeningSocket);

// receive data
if ((Ret = recv(NewConnection, DataBuffer, sizeof(DataBuffer), 0))
== SOCKET_ERROR)
{

cout<<"recv failed with error"<<WSAGetLastError()<<endl;
closesocket(NewConnection);
WSACleanup();
return;
}


closesocket(NewConnection);

WSACleanup();
}
yy306520 2007-10-04
  • 打赏
  • 举报
回复
错了,是只要接收数据,不要发送数据,我的功能很简单,就是只要接收4444发来的数据就可以了,这个简单的服务器端的功能不是很复杂,就是总是不成功,有没有人可以帮忙写出这段呢。
awperpvip 2007-09-30
  • 打赏
  • 举报
回复
回去想了一下,原来LZ的只要收,不接是这个意思啊,
感觉语义不甚清晰,参考一下Ethereal.c

mayudong1 2007-09-29
  • 打赏
  • 举报
回复
新开个线程放RECV,做成无限循环
kikistorm 2007-09-29
  • 打赏
  • 举报
回复
试试winpcap
到网上下个,里面有例子
yy306520 2007-09-29
  • 打赏
  • 举报
回复
也就是实现一个最简单的服务器端,只要收,不接,不管杜塞,不管异步,甚么之类的,我的代码先设置IP,端口,在BIND,在LISTEN,最后RECV。一直取不到数据(但是数据一定是发过来的了的,有第三方软件可以看到),高手现身啊!!!!
虽然我不是搞网络的,不过我觉得应该不是太难把。
Avoid 2007-09-29
  • 打赏
  • 举报
回复
http://www.cppblog.com/niewenlong/archive/2007/07/22/28537.html

端口复用技术与实现代码
Avoid 2007-09-29
  • 打赏
  • 举报
回复
端口复用就行了
Torch009 2007-09-29
  • 打赏
  • 举报
回复
这方面的网上多的是
alfwolf 2007-09-29
  • 打赏
  • 举报
回复
别人的代码
是创建监听端口的套接字的关键部分
m_RawSock是一个原始套接字
你自己看看吧,或许可以帮到你

int CListenDlg::CreateSock()
{
int err;
char name[128];
hostent *pHostent;
int port=8310;
SOCKADDR_IN sockaddr;
m_RawSock=socket(AF_INET,SOCK_RAW,IPPROTO_IP);
if(m_RawSock==INVALID_SOCKET)
{
return WSAGetLastError(); //socket创建失败
}

err=gethostname(name,128);
if(err==SOCKET_ERROR)
{
return WSAGetLastError(); //取本机用户名失败
}

pHostent=gethostbyname (name);

sockaddr.sin_family=AF_INET;
sockaddr.sin_port=htons(port);
memcpy(&sockaddr.sin_addr.s_addr,pHostent->h_addr_list[0],
pHostent->h_length);

//free(pHostent);

err=bind(m_RawSock,(SOCKADDR *)&sockaddr,sizeof(sockaddr));//绑定
if(err==SOCKET_ERROR)
{
return WSAGetLastError(); //取本机用户名失败
}
BOOL bOptval=TRUE;

//设置套节字选项
setsockopt(m_RawSock,SOL_SOCKET,SO_REUSEADDR,(char*)&bOptval,sizeof(bOptval));
err=setsockopt(m_RawSock,IPPROTO_IP,IP_HDRINCL,(char*)&bOptval, //IP_HDRINCL该选项使之能操作IP头
sizeof(bOptval));
if(err==SOCKET_ERROR)
{
return WSAGetLastError(); //设置套节字选项失败
}

//把网卡置于混杂模式。获取IO操作的相关信息
DWORD dwBufferLen[10] ;
DWORD dwBufferInLen = 1 ;
DWORD dwBytesReturned = 0 ;
err=WSAIoctl (
m_RawSock,
SIO_RCVALL, //设置SOCK_RAW为SIO_RCVALL,以便接收所有的IP包
&dwBufferInLen,
sizeof(dwBufferInLen),
&dwBufferLen,
sizeof(dwBufferLen),
&dwBytesReturned,
NULL,
NULL
);//最后两参数设置非阻塞


if(err==SOCKET_ERROR)
{
return WSAGetLastError(); //设置套节字选项失败
}
return 0;
}
zzh2106 2007-09-29
  • 打赏
  • 举报
回复
接分
jeffdu 2007-09-29
  • 打赏
  • 举报
回复
可以类似sniff,用原始套接字监听
awperpvip 2007-09-29
  • 打赏
  • 举报
回复
只要收,不接
呵呵,有意思,矛盾
...........
我的代码先设置IP,端口,在BIND,在LISTEN,最后RECV
只Listen,没Accept?
neosu 2007-09-28
  • 打赏
  • 举报
回复
抓包? 装个winpcap,有例子。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧