BSD Sockets (ipx socket example)
Ключевые слова: ipx, socket, example, (найти похожие документы)
_ RU.UNIX (2:5077/15.22) _____________________________________________ RU.UNIX _
From : Vitaly E.Lavrov 2:5030/580 16 Oct 98 10:44:50
Subj : Re: BSD Sockets
________________________________________________________________________________
From: "Vitaly E.Lavrov" <lve@cit.aanet.ru>
Alex Stepanenko <Alex.Stepanenko@p7.f67.n461.z2.fidonet.org> wrote:
> Приветствую, All!
> Хто нить швыpялся IPX пакетами ETHERNET 802.3 из под LINUX или BSD ???
> Есть некое устpойство котоpое швыpяет те самые в сетку на мою каpточку
> ETHERNET мне надо поймать и швыpнуть кой-че обpатно. Так ить под вындами
> 95 и NT4 все pаботат как с pужжя. Сокеты откpываются, битндятся и т.д.
> LINUX сокет откpывает но на bind отвечает что "Can not access request
> address". Пpобовал заполнять стpуктуpу как в вындах, чеpез htons, чеpез
> конвеpтилку со своей таблицей. е помогат. А BSD воаще пишет мол "Sockets
> this type not support". е могу понять в где собака заpылась Ж(((. Пpежде
> чем лезть в сыpцы pешил спpосить мож хто наезжал на ентот факт. Заpанее
> благодаpен за любые мысли на енту тему.
Я помню баловался с ipx под линухом.
Вот сервер
Правда с адресами машин разберайтесь сами.
---------------------------------------
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <linux/ipx.h>
#include <netdb.h>
#include <stdio.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/termios.h>
#include <sys/ioctl.h>
#include <errno.h>
int fd = -1,fd1 = -1;
char buf[1024];
main(int argn,char **argv)
{
int c,rhlen;
struct sockaddr_ipx lh,rh;
struct hostent *he;
struct timeval tv;
struct fd_set rfds,efds;
fd1 = socket(AF_IPX,SOCK_DGRAM,AF_IPX);
if (fd1 < 0) {
perror("socket()");
exit(-1);
}
bzero ((char *) &lh, sizeof(lh));
lh.sipx_family = AF_IPX;
lh.sipx_network = 0L;
memset(lh.sipx_node,0,IPX_NODE_LEN);
lh.sipx_port = 0xf034;
/*00000F33:00A024EA2633*/
/* memcpy(&lh.sin_addr.s_addr,he->h_addr,he->h_length);
lh.sin_port = htons(49); */
if(bind(fd1,(struct sockaddr *)&lh,sizeof(lh)) < 0) {
perror("bind()");
return 0;
}
while(1) {
rhlen = sizeof(rh);
c = recvfrom(fd1,buf,sizeof(buf),0,(struct sockaddr *)&rh,&rhlen);
if(c <= 0) { perror("recvfrom"); break; }
/* printf("recv %d from %08x:%04x\n",c,rh.sipx_network,rh.sipx_port); */
sendto(fd1,buf,c,0,(struct sockaddr *)&rh,rhlen);
}
close(fd1);
}
--------------------------------------------
а вот клиент
--------------------------------------------
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <linux/ipx.h>
#include <netdb.h>
#include <stdio.h>
#include <errno.h>
#include <sys/times.h>
#include <signal.h>
#define UPS_TCP_PORT 49
#ifndef uchar
typedef unsigned char uchar;
#endif
/*
#ifndef ushort
typedef unsigned short ushort;
#endif
#ifndef uint
typedef unsigned int uint;
#endif
*/
char buf[4098]="aaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
char *printip(void *a)
{
static char buff[32];
unsigned char *p = a;
sprintf(buff,"%d.%d.%d.%d",p[0],p[1],p[2],p[3]);
return buff;
}
void alarmset(int s)
{
}
int main(int argn,char **argv)
{
static struct hostent *hst;
static int sk,rhlen;
static struct sockaddr_ipx my_adr,rh;
static int mal;
static struct sockaddr_ipx ma;
static struct sockaddr in_addr;
struct hostent *mastent;
static int c,i,ns;
struct tms tm1,tm2;
time_t t1,t2;
/*
if(gethostname(hstn,sizeof(hstn)) < 0) return 0;
if(getdomainname(dmn,sizeof(dmn)) < 0) return 0;
strcat(hstn,".");
strcat(hstn,dmn);
printf("hostname()=%s\n",hstn);
*/
sk = socket(AF_IPX,SOCK_DGRAM,AF_IPX);
if(sk < 0) { perror("open socket"); return 0;};
i = 1;
rh.sipx_family = AF_IPX;
rh.sipx_network = 0L;
memset(rh.sipx_node,0,IPX_NODE_LEN);
rh.sipx_port = 0xf036;
rh.sipx_type = 4;
if(bind(sk,(struct sockaddr *)&rh,sizeof(rh)) < 0) {
perror("bind()");
return 0;
}
rh.sipx_family = AF_IPX;
rh.sipx_network = 0x330F0000L;
memset(rh.sipx_node,0xff,IPX_NODE_LEN);
/*
rh.sipx_node[0] = 0x33;
rh.sipx_node[1] = 0x26;
rh.sipx_node[2] = 0xEA;
rh.sipx_node[3] = 0x24;
rh.sipx_node[4] = 0xA0;
rh.sipx_node[5] = 0x00;
*/
rh.sipx_port = 0xf034;
rh.sipx_type = 4;
time(&t1);
ns = 0;
for(i = 0; i < 1024*2; i++) {
rhlen = sizeof(rh);
c=sendto(sk,buf,1400,0,(struct sockaddr *)&rh,rhlen);
if(c <= 0) perror("sendto");
signal(SIGALRM,alarmset);
alarm(1);
c = recvfrom(sk,buf,sizeof(buf),0,(struct sockaddr *)&rh,&rhlen);
if(c <= 0) perror("recvfrom");
else ns++; /* printf("recv %d\n",c); */
}
time(&t2);
printf("time %d recv %d\n",(t2-t1),ns);
close(sk);
}
----------------------------------------------
PS: Да простит меня модератор. ююкнуть и гзипнуть очень лень.
Виталий
.
--- ifmail v.2.13
* Origin: SPb State University of Aerospace Instrumentati (2:5030/580@fidonet)