/* a client in the unix domain */ #include #include #include #include #include #include #include #include #include #include #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); }