//version 1.0, base development, Ian 19/01/09 #include "MySocketTCP.h" #include #include #include #include using namespace std; MySocketTCP::~MySocketTCP(){ Disconnect(); if (socketDescriptor >= 0){ close(socketDescriptor); } file_des=-1; } MySocketTCP::MySocketTCP(unsigned short int const port_number):portno(DEFAULT_PORTNO), is_a_server(1), socketDescriptor(-1), file_des(-1), send_rec_max_size(SEND_REC_MAX_SIZE), last_keep_connection_open_action_was_a_send(0) { // receiver (server) local no need for ip portno=port_number; strcpy(hostname,"localhost"); // SetupParameters(); socketDescriptor = socket(AF_INET, SOCK_STREAM,0); //tcp if (socketDescriptor < 0) { cerr << "Can not create socket "<h_addrtype; memcpy((char *) &serverAddress.sin_addr.s_addr, hostInfo->h_addr_list[0], hostInfo->h_length); serverAddress.sin_port = htons(port_number); socketDescriptor=0; //You can use send and recv, //would it work????? } } int MySocketTCP::getHostname(char *name) { if (is_a_server==0) { strcpy(name,hostname); } return is_a_server; }; int MySocketTCP::Connect(){ if(file_des>0) return file_des; if(is_a_server){ //server; the server will wait for the clients connection if (socketDescriptor>0) { if ((file_des = accept(socketDescriptor,(struct sockaddr *) &clientAddress, &clientAddress_length)) < 0) { cerr << "Error: with server accept, connection refused"<=0){ //then was open if(is_a_server){ close(file_des); } else { close(socketDescriptor); socketDescriptor=-1; } file_des=-1; } } int MySocketTCP::SendDataOnly(void* buf,int length){//length in characters #ifdef VERY_VERBOSE cout << "want to send "<< length << " Bytes" << endl; #endif int nsending; int nsent; if (file_des<0) return -1; int total_sent=0; while(length>0){ nsending = (length>send_rec_max_size) ? send_rec_max_size:length; nsent = write(file_des,(char*)buf+total_sent,nsending); if(!nsent) break; length-=nsent; total_sent+=nsent; // cout<<"nsent: "<0){ nreceiving = (length>send_rec_max_size) ? send_rec_max_size:length; #ifdef VERY_VERBOSE cout << "start to receive "<< nreceiving << " Bytes" << endl; #endif nreceived = read(file_des,(char*)buf+total_received,nreceiving); #ifdef VERY_VERBOSE cout << "received "<< nreceived << " Bytes on fd " << file_des << endl; #endif if(nreceived<0) break; length-=nreceived; #ifdef VERY_VERBOSE cout << "length left "<< length << " Bytes" << endl; #endif total_received+=nreceived; #ifdef VERY_VERBOSE cout << "total "<< total_received << " Bytes" << endl; #endif // cout<<"nrec: "<