230 lines
7.1 KiB
C
230 lines
7.1 KiB
C
/* a client in the unix domain */
|
|
#include <stdint.h>
|
|
#include <sys/types.h>
|
|
#include <unistd.h>
|
|
#include <stdlib.h>
|
|
#include <sys/socket.h>
|
|
#include <sys/un.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <strings.h>
|
|
#include <arpa/inet.h>
|
|
#include "ipx.h"
|
|
#include "ipxstack.h"
|
|
|
|
void *mmData = "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\
|
|
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$";
|
|
|
|
ipx_response_t *conn;
|
|
|
|
void error(const char *);
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
int sockfd, servlen,n;
|
|
int sockfd2, servlen2;
|
|
int sockfd3, servlen3;
|
|
struct sockaddr_un serv_addr;
|
|
struct sockaddr_un serv_addr2;
|
|
struct sockaddr_un serv_addr3;
|
|
spx_frame_t *ipx_packet;
|
|
char buffer[2048];
|
|
|
|
// uint32_t conn_pid;
|
|
|
|
ipx_request_t *init_connection;
|
|
ipx_request_t *close_connection;
|
|
|
|
init_connection = malloc(sizeof(ipx_request_t));
|
|
if(!init_connection)
|
|
error("Out of memory: init_connection");
|
|
close_connection = malloc(sizeof(ipx_request_t));
|
|
if(!close_connection)
|
|
error("Out of memory: close_connection");
|
|
|
|
size_t data_size = 128;
|
|
size_t packet_size = sizeof(spx_frame_t) + data_size;
|
|
ipx_packet = malloc(packet_size);
|
|
if(!ipx_packet) {
|
|
|
|
error("Out of memory");
|
|
exit(2);
|
|
}
|
|
|
|
ipx_packet->checksum = 0xffff;
|
|
ipx_packet->length = htons(packet_size);
|
|
ipx_packet->hops = 0;
|
|
ipx_packet->type = 0x05;
|
|
ipx_packet->dest_net = 0;
|
|
ipx_packet->dest_node[0] = htons(0x0800);
|
|
ipx_packet->dest_node[1] = htons(0x2750);
|
|
ipx_packet->dest_node[2] = htons(0xb177);
|
|
ipx_packet->dest_socket = htons(0x869b);
|
|
ipx_packet->src_net = 0;
|
|
ipx_packet->src_node[0] = htons(0xb827);
|
|
ipx_packet->src_node[1] = htons(0xeb02);
|
|
ipx_packet->src_node[2] = htons(0xd221);
|
|
ipx_packet->src_socket = htons(0x869b);
|
|
|
|
ipx_packet->conn_control = 0xc0;
|
|
ipx_packet->datastream_type = 0;
|
|
ipx_packet->src_conn_id = htons(0x1234);
|
|
ipx_packet->dest_conn_id = htons(0xffff);
|
|
ipx_packet->seq_no = 0;
|
|
ipx_packet->ack_no = 0;
|
|
ipx_packet->alloc_no = htons(3);
|
|
|
|
|
|
|
|
bzero((char *)&serv_addr,sizeof(serv_addr));
|
|
serv_addr.sun_family = AF_UNIX;
|
|
strcpy(serv_addr.sun_path, argv[1]);
|
|
servlen = strlen(serv_addr.sun_path) + sizeof(serv_addr.sun_family);
|
|
if ((sockfd = socket(AF_UNIX, SOCK_STREAM,0)) < 0)
|
|
error("Creating socket");
|
|
|
|
if (connect(sockfd, (struct sockaddr *) &serv_addr, servlen) < 0)
|
|
error("Connecting");
|
|
|
|
// printf("Please enter your message: ");
|
|
bzero(buffer,2048);
|
|
init_connection->request_type = OPEN_SPX_SOCKET;
|
|
init_connection->src_socket = 0x1234;
|
|
init_connection->dest_net = 0x00000000;
|
|
init_connection->dest_node[0] = htons(0x0800);
|
|
init_connection->dest_node[1] = htons(0x2750);
|
|
init_connection->dest_node[2] = htons(0xb177);
|
|
init_connection->dest_socket = htons(0x7171);
|
|
|
|
// init_connection->pid = 1234;
|
|
// printf("Init connection: request_type=%i; src_socket=%0x; pid=%i\n", init_connection->request_type, init_connection->src_socket, init_connection->pid);
|
|
memcpy(buffer, init_connection, sizeof(ipx_request_t));
|
|
/* memcpy(buffer, frame, 1000);*/
|
|
//fgets(buffer,80,stdin);
|
|
/*
|
|
ethernet = (ethernet_frame_t *) &buffer;
|
|
ipx = (ipx_frame_t *) ðernet->ipxpacket;
|
|
ipx_data = (void *)ipx->data;
|
|
printf("data: %s", ipx_data);
|
|
*/
|
|
// write(sockfd,buffer,1000);
|
|
printf("Setting up the Connection\n");
|
|
write(sockfd, init_connection, sizeof(ipx_request_t));
|
|
printf("Waiting for ansver\n");
|
|
n=read(sockfd,buffer,280);
|
|
printf("The return message was\n");
|
|
|
|
conn = (ipx_response_t *)buffer;
|
|
if(conn->error != NO_ERROR) {
|
|
printf("Error: socket is already opened\n");
|
|
exit(2);
|
|
}
|
|
// printf("My connection: socket=%0x; socket name=%s; pid=%i\n", conn->src_socket, conn->socket_name, conn->pid);
|
|
// conn_pid = conn->pid;
|
|
write(1,buffer,n);
|
|
|
|
close(sockfd);
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
sleep(1);
|
|
|
|
spx_frame_t *spx_packet;
|
|
int loop = 1;
|
|
|
|
printf("Waiting for data\n");
|
|
bzero(buffer, 2048);
|
|
bzero((char *)&serv_addr3, sizeof(serv_addr3));
|
|
serv_addr3.sun_family = AF_UNIX;
|
|
strcpy(serv_addr3.sun_path, "./socket.1234");
|
|
servlen3 = strlen(serv_addr3.sun_path) + sizeof(serv_addr3.sun_family);
|
|
if((sockfd3 = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
|
|
error("Creating data socket");
|
|
|
|
if(connect(sockfd3, (struct sockaddr *) &serv_addr3, servlen3) < 0)
|
|
error("Connecting data socket");
|
|
|
|
int seq_no;
|
|
|
|
seq_no = 0;
|
|
|
|
while(loop) {
|
|
printf("Read %i bytes.\n", read(sockfd3, buffer, 2048));
|
|
spx_packet = (spx_frame_t *)&buffer;
|
|
printf((const char *)&spx_packet->data);
|
|
ipx_packet->checksum = 0xffff;
|
|
ipx_packet->length = htons(packet_size);
|
|
ipx_packet->hops = 0;
|
|
ipx_packet->type = 5;
|
|
ipx_packet->dest_net = spx_packet->src_net;
|
|
ipx_packet->dest_node[0] = spx_packet->src_node[0];
|
|
ipx_packet->dest_node[1] = spx_packet->src_node[1];
|
|
ipx_packet->dest_node[2] = spx_packet->src_node[2];
|
|
ipx_packet->src_net = spx_packet->dest_net;
|
|
ipx_packet->src_node[0] = spx_packet->dest_node[0];
|
|
ipx_packet->src_node[1] = spx_packet->dest_node[1];
|
|
ipx_packet->src_node[2] = spx_packet->dest_node[2];
|
|
ipx_packet->conn_control = 0b01010000;
|
|
ipx_packet->datastream_type = 0;
|
|
ipx_packet->src_conn_id = htons(conn->pid);
|
|
ipx_packet->dest_conn_id = spx_packet->src_conn_id;
|
|
ipx_packet->seq_no = htons(seq_no);
|
|
ipx_packet->ack_no = htons(ntohs(spx_packet->seq_no) + 1);
|
|
ipx_packet->alloc_no = htons(3);
|
|
memcpy(ipx_packet->data, mmData, 128);
|
|
bzero(buffer, 2048);
|
|
memcpy(buffer, ipx_packet, packet_size);
|
|
write(sockfd3, buffer, packet_size);
|
|
printf("Packet size: %ib\n", packet_size);
|
|
bzero(buffer, 2048);
|
|
loop = 0;
|
|
}
|
|
sleep(5);
|
|
close(sockfd3);
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
sleep(2);
|
|
printf("Closing connection.\n");
|
|
bzero(buffer, 1002);
|
|
close_connection->request_type = CLOSE_SOCKET;
|
|
close_connection->src_socket = 0x1234;
|
|
// close_connection->pid = conn_pid;
|
|
// printf("Closing connection: request_type=%i; src_socket=%0x; pid=%i\n", close_connection->request_type, close_connection->src_socket, close_connection->pid);
|
|
|
|
bzero((char *)&serv_addr2,sizeof(serv_addr2));
|
|
serv_addr2.sun_family = AF_UNIX;
|
|
strcpy(serv_addr2.sun_path, argv[1]);
|
|
servlen2 = strlen(serv_addr2.sun_path) + sizeof(serv_addr2.sun_family);
|
|
if ((sockfd2 = socket(AF_UNIX, SOCK_STREAM,0)) < 0)
|
|
error("Creating socket");
|
|
|
|
if (connect(sockfd2, (struct sockaddr *) &serv_addr2, servlen2) < 0)
|
|
error("Connecting");
|
|
|
|
bzero(buffer,1002);
|
|
memcpy(buffer, close_connection, sizeof(ipx_request_t));
|
|
printf("Closing connection.....\n");
|
|
|
|
|
|
write(sockfd2,buffer,1000);
|
|
printf("Closing connection......\n");
|
|
|
|
// sleep(2);
|
|
|
|
close(sockfd2);
|
|
free(init_connection);
|
|
free(close_connection);
|
|
return 0;
|
|
}
|
|
|
|
void error(const char *msg)
|
|
{
|
|
perror(msg);
|
|
exit(0);
|
|
}
|
|
|