Socket object in C++ -



Socket object in C++ -

i'm trying write basic socket programme layers reliable info transport on udp in c++. i've been reading beej.us , googling, i'm still confused socket object. come python/java background , have never programmed in c++, understand, programme our professor has given finish should using sort of socket object, correct?

so how come can see here, there not seem getter nor setter socket object? bind() using reference when called modify socket object? see there int called sockfd seems identifying each unique socket, don't see how calling number grab reference socket object particular sockfd.

also, seems beej.us , bunch of youtube tutorials utilize getaddrinfo() create socket object, function not exist in code provided professor, , instructions indicate not need write additional functions..

the format have utilize pasted below. there 2 files, 1 server , 1 client. header functions inside.

rdt.h:

#ifndef rdt1_h #define rdt1_h #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <string.h> #include <netdb.h> #define payload 1000 //size of info payload of rdt layer //----- type defines -------------------------------------------- typedef unsigned char u8b_t; // char typedef unsigned short u16b_t; // 16-bit word typedef unsigned int u32b_t; // 32-bit word int rdt_socket(); int rdt_bind(int fd, u16b_t port); int rdt_target(int fd, char * peer_name, u16b_t peer_port); int rdt_send(int fd, char * msg, int length); int rdt_recv(int fd, char * msg, int length); int rdt_close(int fd); /* application process calls function create rdt socket. homecoming -> socket descriptor on success, -1 on error */ int rdt_socket() { } /* application process calls function specify ip address , port number used , assigns them rdt socket. homecoming -> 0 on success, -1 on error */ int rdt_bind(int fd, u16b_t port){ } /* application process calls function specify ip address , port number used remote process , associates them rdt socket. homecoming -> 0 on success, -1 on error */ int rdt_target(int fd, char * peer_name, u16b_t peer_port){ } /* application process calls function transmit message target (rdt_target) remote process through rdt socket. msg -> pointer application's send buffer length -> length of application message homecoming -> size of info sent on success, -1 on error */ int rdt_send(int fd, char * msg, int length){ } /* application process calls function wait message remote process; caller blocked waiting arrival of message. msg -> pointer receiving buffer length -> length of receiving buffer homecoming -> size of info received on success, -1 on error */ int rdt_recv(int fd, char * msg, int length){ } /* application process calls function close rdt socket. */ int rdt_close(int fd){ } #endif

server.c

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <time.h> #define cport 59079 #define sport 59080 #define storage "store" static float loss_rate=0.0, err_rate=0.0; /* uncomment part part 1 */ #include "rdt-part1.h" #define msg_len payload /* uncomment part part 2 #include "rdt-part2.h" #define msg_len payload */ /* uncomment part part 3 #include "rdt-part3.h" #define msg_len payload*w */ int main(int argc, char *argv[]) { int sockfd; char filepath[200]; char * s; char msg[msg_len]; struct stat sbuf; file * testfile; int file_len, len; int received=0; if (argc != 2) { printf("usage: %s 'client hostname'\n", argv[0]); exit(0); } /* update random seed */ srand(time(null)); /* remove above line if want same random sequence each run - testing */ /* check whether folder exists */ if (stat(storage, &sbuf) != 0) { printf("directory ./%s not exist!!\n", storage); printf("please create directory %s before start server.\n", storage); exit(0); } /* read in packet loss rate , error rate */ s = getenv("packet_loss_rate"); if (s != null) loss_rate = strtof(s, null); s = getenv("packet_err_rate"); if (s != null) err_rate = strtof(s, null); printf("packet_loss_rate = %.2f, packet_err_rate = %.2f\n", loss_rate, err_rate); // create rdt socket sockfd = rdt_socket(); //specify own ip address & port number, because if not specify, others can not send things me. rdt_bind(sockfd, sport); //specify ip address & port number of partner rdt_target(sockfd, argv[1], cport); /* simple handshaking protocol */ // wait client request memset(msg, '\0', msg_len); len = rdt_recv(sockfd, msg, msg_len); file_len = atoi(msg); printf("received client request: file size = %d\n", file_len); memset(msg, '\0', msg_len); len = rdt_recv(sockfd, msg, msg_len); sprintf(filepath, "%s/%s", storage, msg); testfile = fopen(filepath, "w"); if (!testfile) { printf("cannot open target file: ./%s write\n", filepath); // send error response memset(msg, '\0', msg_len); sprintf(msg, "error"); rdt_send(sockfd, msg, strlen(msg)); goto end; } else { printf("open file %s writing successfully\n", filepath); // send error response memset(msg, '\0', msg_len); sprintf(msg, "okay"); rdt_send(sockfd, msg, strlen(msg)); } /* start file transfer */ printf("start receiving file . . .\n"); // receive file contents while (received < file_len) { memset(msg, 0, msg_len); len = rdt_recv(sockfd, msg, msg_len); fwrite(msg, sizeof(char), len, testfile); received += len; printf("received message of size %d bytes\n", len); } printf("complete file transfer.\n"); end: // close file fclose(testfile); // close rdt socket rdt_close(sockfd); printf("server programme terminated\n"); homecoming 0; }

client.c

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/time.h> #include <time.h> #define cport 59079 #define sport 59080 static float loss_rate=0.0, err_rate=0.0; /* uncomment part part 1 */ #include "rdt-part1.h" #define msg_len payload /* uncomment part part 2 #include "rdt-part2.h" #define msg_len payload */ /* uncomment part part 3 #include "rdt-part3.h" #define msg_len payload*w */ int main(int argc, char *argv[]){ int sockfd; file * testfile; int filelength, len; char * fname, * s; char msg[msg_len]; int sent = 0; struct timeval starttime, endtime; double lapsed; if (argc != 3) { printf("usage: %s 'server hostname' 'filename'\n", argv[0]); exit(0); } /* update random seed */ srand(time(null)); /* remove above line if want same random sequence each run - testing */ /* read in packet loss rate , error rate */ s = getenv("packet_loss_rate"); if (s != null) loss_rate = strtof(s, null); s = getenv("packet_err_rate"); if (s != null) err_rate = strtof(s, null); printf("packet_loss_rate = %.2f, packet_err_rate = %.2f\n", loss_rate, err_rate); fname=argv[2]; //open file if (!(testfile = fopen(fname, "r"))) { printf("open file failed.\nprogram terminated."); exit(0); } printf("open file \n"); //get file size fseek(testfile, 0l, seek_end); filelength = ftell(testfile); printf("file bytes %d \n",filelength); fseek(testfile, 0l, seek_set); // create rdt socket sockfd = rdt_socket(); //specify own ip address & port number, because if not specify, others can not send things me. rdt_bind(sockfd, cport); //specify ip address & port number of partner rdt_target(sockfd, argv[1], sport); /* simple handshaking protocol */ //send size of file memset(msg, '\0', msg_len); sprintf(msg, "%d", filelength); rdt_send(sockfd, msg, strlen(msg)); //send file name server rdt_send(sockfd, fname, strlen(fname)); //wait server response memset(msg, '\0', msg_len); len = rdt_recv(sockfd, msg, msg_len); if (strcmp(msg, "error") == 0) { printf("server experienced fatal error.\nprogram terminated.\n"); goto end; } else printf("receive server response\n"); /* start info transfer */ printf("start file transfer . . .\n"); gettimeofday(&starttime, null); // send file contents while (sent < filelength) { if ((filelength-sent) < msg_len) len = fread(msg, sizeof(char), filelength-sent, testfile); else len = fread(msg, sizeof(char), msg_len, testfile); rdt_send(sockfd, msg, len); sent += len; usleep(1000); } gettimeofday(&endtime, null); printf("complete file transfer.\n"); lapsed = (endtime.tv_sec - starttime.tv_sec)*1.0 + (endtime.tv_usec - starttime.tv_usec)/1000000.0; printf("total elapse time: %.3f s\tthroughtput: %.2f kb/s\n", lapsed, filelength/lapsed/1000.0); end: // close file fclose(testfile); // close rdt socket rdt_close(sockfd); printf("client programme terminated\n"); homecoming 0; }

c++ sockets

Comments

Popular posts from this blog

java - How to set log4j.defaultInitOverride property to false in jboss server 6 -

c - GStreamer 1.0 1.4.5 RTSP Example Server sends 503 Service unavailable -

Using ajax with sonata admin list view pagination -