求一份IPX局域网的收发程序!(400分,另有一200分贴)

fz_zhou 2002-08-27 05:47:09
加上下面的200分贴:
http://www.csdn.net/Expert/TopicView1.asp?id=972655

1.求一份IPX局域网的收发程序,最好能说明具体要怎么操作;

2.如果知道对方服务器的地址,怎么收它的广播数据(也是用IPX协议)!

收到例子,运行成功,马上结贴!
第二个问题再解决,我再送200分!
谢谢大家!
...全文
296 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
everandforever 2002-09-10
  • 打赏
  • 举报
回复
2.如果知道对方服务器的地址,怎么收它的广播数据(也是用IPX协议)!

对方的地址无所谓,你一定要知道他的广播数据是发给谁的.网络号,节点地址,端口,三样一样也不能少.
Cpp_fan 2002-09-10
  • 打赏
  • 举报
回复
WSAData data;
WORD wVersion = MAKEWORD(2,0);
int retcode = ::WSAStartup(wVersion,&data);
if (retcode != 0)
{
TRACE0("Winsock 2 not supported on this machine\n");
AfxMessageBox("Winsock 2 not supported on this PC\n");
return -1;
}
CreateAddress(&m_Address, "00000000","F2ED20524153","3462");

recive:
while( TRUE )
{
if( PeekMessage( &msg , 0 , WM_CLOSE,WM_CLOSE,PM_NOREMOVE ) )
{

pDlg->m_dwThreadID = 0 ;
break ;
}
memset( buf , 0 , sizeof(buf) ) ;
nRet = ::recvfrom(pDlg->m_hSocket, buf, sizeof(buf),0, &addrfrom, &addrfromlen);
pDlg->m_RecData.m_nLen = nRet;
pDlg->m_RecData.m_pAddr = &addrfrom;
pDlg->m_RecData.m_pBuf = buf;
if( nRet == SOCKET_ERROR )
{
dwErr = WSAGetLastError() ;
RACE("Error recv() = %ld !\n" , dwErr ) ;
continue;
}
else
{
pDlg->UpdateList(pDlg->m_RecData);
}
Sleep(2);
}

www.codeproject.com 有IPXREC的程序!
alanwang_ 2002-08-27
  • 打赏
  • 举报
回复
IPX的网卡地址的定义,看上面类IPXBroadCast中的
GetLocalAddressString
AtoH
HtoA

msdn上有一个例子---ipxchat,你可以看看
alanwang_ 2002-08-27
  • 打赏
  • 举报
回复
使用例子
#include <conio.h>
#include "ipx.h"

void main()
{
//#define SERVER

WSADATA WSAData;

WSAStartup (0x0101,&WSAData);

IPXBroadCast s;
char buf[1024];
int len = sizeof(buf);
memset(buf, 0, sizeof(buf));
#ifndef SERVER
strcpy(buf,"aaaaaaaa");
#endif

s.Create();
#ifdef SERVER
s.Bind(1000);
s.RecvFrom(buf,&len);
printf("%s\n",buf);
#else if
s.Bind(0);
s.SendTo(1000,buf,strlen(buf));
#endif

s.Close();
WSACleanup();
_getch();
}
alanwang_ 2002-08-27
  • 打赏
  • 举报
回复
写了个简陋的ipx广播类,你看看吧!顺便帮我测试:)

//头文件ipx.h
#include <winsock2.h>
#include <wsipx.h>

class IPXBroadCast
{
private:
SOCKET m_socket;
public:
char NetWork[9];
char NetNode[13];

operator SOCKET() const {return m_socket;}

BOOL Create();
BOOL Bind(short port);
BOOL RecvFrom(char* buffer,int* datasize);
BOOL SendTo(short port,char* data,int datasize);
void Close();

void GetLocalAddressString(char* network, char* node);

//下面的函数就是用来解析地址的,具体功能你一看就明白了
UCHAR BtoH(CHAR ch);
void AtoH(CHAR *szDest, CHAR *szSource, int iCount);
void HtoA(char *source, char *dest, int len);
};

===================================================================
//cpp文件ipx.cpp
#include "ipx.h"

#define MAX_MSGLEN 512 //这是发送数据的最大长度,不能超过

BOOL IPXBroadCast::Create()
{
m_socket = socket(AF_IPX, SOCK_DGRAM, NSPROTO_IPX);
return m_socket != INVALID_SOCKET;
}

BOOL IPXBroadCast::Bind(short port)
{
SOCKADDR_IPX saIpxCli;
INT err;
BOOL fBroadcast = TRUE;

err = setsockopt ( m_socket,SOL_SOCKET,SO_BROADCAST,(CHAR *) &fBroadcast,sizeof ( BOOL ));

if ( SOCKET_ERROR == err )
{
printf( "IpxBroadCast setsockopt %d\n", WSAGetLastError ( ) );
return FALSE;
}

saIpxCli.sa_family = AF_IPX;
saIpxCli.sa_socket = (USHORT) port;
memset ( saIpxCli.sa_netnum, 0, sizeof ( saIpxCli.sa_netnum ) );
memset ( saIpxCli.sa_nodenum, 0, sizeof ( saIpxCli.sa_nodenum ) );
err = bind ( m_socket, (SOCKADDR *) &saIpxCli, sizeof ( SOCKADDR_IPX ) );
if ( SOCKET_ERROR == err )
{
printf("IpxBroadCast bind %d\n", WSAGetLastError());
return FALSE;
}
return TRUE;
}

BOOL IPXBroadCast::RecvFrom(char* buffer,int* datalen)
{
SOCKADDR_IPX saIpxCli;
int err, nSize;

nSize = sizeof ( SOCKADDR_IPX );
err = recvfrom ( m_socket,buffer,MAX_MSGLEN,0,(SOCKADDR *) &saIpxCli,&nSize);

if ( SOCKET_ERROR == err )
{
printf("IpxBroadCast recvfrom %d\n", WSAGetLastError ( ) );
return FALSE;
}

buffer[err] = '\0';
wsprintf(NetWork, "%02X%02X%02X%02X",
(BYTE)saIpxCli.sa_netnum[0],
(BYTE)saIpxCli.sa_netnum[1],
(BYTE)saIpxCli.sa_netnum[2],
(BYTE)saIpxCli.sa_netnum[3]);

wsprintf(NetNode, "%02X%02X%02X%02X%02X%02X",
(BYTE)saIpxCli.sa_nodenum[0],
(BYTE)saIpxCli.sa_nodenum[1],
(BYTE)saIpxCli.sa_nodenum[2],
(BYTE)saIpxCli.sa_nodenum[3],
(BYTE)saIpxCli.sa_nodenum[4],
(BYTE)saIpxCli.sa_nodenum[5]);

return TRUE;
}

BOOL IPXBroadCast::SendTo(short port,char *data, int datalen)
{
SOCKADDR_IPX saIpxServ;
INT err;

saIpxServ.sa_family = AF_IPX;
saIpxServ.sa_socket = port;
memset ( saIpxServ.sa_netnum, 0, sizeof ( saIpxServ.sa_netnum ) );
memset ( saIpxServ.sa_nodenum, 0xFF, sizeof ( saIpxServ.sa_nodenum ) );
err = sendto ( m_socket,data,datalen,0,(SOCKADDR *) &saIpxServ,sizeof ( SOCKADDR_IPX ) );
if ( SOCKET_ERROR == err )
{
printf( "IpxBroadCast sendto %d\n", WSAGetLastError ( ) );
return FALSE;
}

return TRUE;
}


void IPXBroadCast::Close()
{
if(m_socket != INVALID_SOCKET)
{
closesocket(m_socket);
}
m_socket = INVALID_SOCKET;
}

void IPXBroadCast::GetLocalAddressString(char* network, char* node)
{
static sockaddr_ipx local_addr;
int bufsize = sizeof(local_addr);

getsockname(m_socket, (PSOCKADDR)&local_addr, &bufsize);

wsprintf(network, "%02X%02X%02X%02X",
(BYTE)local_addr.sa_netnum[0],
(BYTE)local_addr.sa_netnum[1],
(BYTE)local_addr.sa_netnum[2],
(BYTE)local_addr.sa_netnum[3]);

wsprintf(node, "%02X%02X%02X%02X%02X%02X",
(BYTE)local_addr.sa_nodenum[0],
(BYTE)local_addr.sa_nodenum[1],
(BYTE)local_addr.sa_nodenum[2],
(BYTE)local_addr.sa_nodenum[3],
(BYTE)local_addr.sa_nodenum[4],
(BYTE)local_addr.sa_nodenum[5]);
}

UCHAR IPXBroadCast::BtoH(CHAR ch)
{
if ( ch >= '0' && ch <= '9' )
{
return ( ch - '0' );
}

if ( ch >= 'A' && ch <= 'F' )
{
return ( ch - 'A' + 0xA );
}

if (ch >= 'a' && ch <= 'f' )
{
return ( ch - 'a' + 0xA );
}
return ch;
}

void IPXBroadCast::AtoH(CHAR *szDest, CHAR *szSource, int iCount)
{
while (iCount--)
{
*szDest++ = ( BtoH ( *szSource++ ) << 4 ) + BtoH ( *szSource++ );
}
return;
}

void IPXBroadCast::HtoA(char *source, char *dest, int len)
{
int i;
unsigned char c;

for (i=0; i<len; i++)
{
c = source[i];
c = c >> 4;
if (c < 10)
dest[i*2] = c + '0';
else
dest[i*2] = c - 10 + 'A';
c = source[i] & 0x0F;
if (c < 10)
dest[i*2+1] = c + '0';
else
dest[i*2+1] = c - 10 + 'A';
}
}
我不是大明 2002-08-27
  • 打赏
  • 举报
回复
我不知道IPX的网卡地址怎么定义!
要怎么写才能让我收到广播数据!
nbgyf 2002-08-27
  • 打赏
  • 举报
回复
您会写基于IP的局域网收发程序吗?
您会写基于IP的广播数据程序吗?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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