本机的IP是192.168.0.2,端口是4444,现在需要监听本机的4444端口,只要来了数据(来的数据只会就是数字和字母组合),就写到一个.txt文档里面,请大家帮忙,谢谢大家了。
读出的和一个第三方软件一样的就OK了。完成了立即揭帖给分。
读出的和一个第三方软件一样的就OK了。完成了立即揭帖给分。
解决方案 »
- VC++日志
- VPN L2TP的"pre-shared key"如何设置??
- vc import a bitmap
- 小弟写的一个ATL,列集CoMarshalInterThreadInterfaceInStream出现0x80040155 Interface not registered错误,新学ATL,就遇上这个大难题
- 使用过MAPI的朋友,请问如何直接发送邮件?
- 放水求助:收集“体育运动会“ 宣传稿
- 问VC写SOCKET通讯程序!
- (100分)CListBox的问题,非常奇怪,请大家来看看,帮我解决!
- CCmdTarget类主要用来干什么的啊
- 请问我想,当鼠标放在某一button上时鼠标变化,我的程序如下
- 菜鸟对EnumServicesStatus的疑问
- 做MODEM的語音答錄,使用TAPI什么版本比較好呢?tapi2.x還是tapi3.0?
虽然我不是搞网络的,不过我觉得应该不是太难把。
到网上下个,里面有例子
呵呵,有意思,矛盾
...........
我的代码先设置IP,端口,在BIND,在LISTEN,最后RECV
只Listen,没Accept?
是创建监听端口的套接字的关键部分
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;
}
感觉语义不甚清晰,参考一下Ethereal.c
来的数据是数字和字母组合,再写到一个.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();
}
如果是,那就继续问题2;如果不是,那我也不知道答案了,后面写的可以不看。问题2:你说到你的IP是192.168.0.2,那你是不是内网的?
如果是,那就看看我的想法;如果不是,那我也不知道答案了,后面写的可以不看。我认为:问题在于你的连接没有成功地建立,数据可能发送了,但是根本就没有送到你的机器来。
首先得知道你连接网络的真实IP,可打开www.ip.cn查到,注意,如果你没有申请固定IP,那这个IP的数值会变化的
然后,将设置路由器端口映射到你机器
最后,发送方连接时要用你的真实IP,然后你才能收到数
到底数据有没有发送过来,可以通过一些第三方软件看到,例如科浪gprs测试软件
当确定收到数据后,再测试你编写的程序吧