|
Thank's a lot.
It works fine.
Kind regards.
|
|
|
|
|
Isn't there a "standard" dialog for simple input
from the user (something akin to InputBox in VB)?
All I need is a simple prompt, a single edit box,
and OK and Cancel buttons. Being able to supply
a default value would be bonus but not necessary.
I would swear I've seen it, but I've drawn an absolute
blank.
Thanks.
|
|
|
|
|
There is no InputBox equivalent in VC++
You will have to create your own dialog box
Nish
Sonork ID 100.9786 voidmain
www.busterboy.org
Nish is a BIG fan of Goran Ivanisevic
|
|
|
|
|
Hmm. I'm surprised.
Thanks for the response.
I don't mind creating my own, I just figured there
would be a standard dialog (common dialog)
for it.
BTW, I'm a fan of Goran myself. I was quite excited
when he won his slam this year.
|
|
|
|
|
David Fleming wrote:
BTW, I'm a fan of Goran myself. I was quite excited
when he won his slam this year.
Cool!
Then you'd be glad to know that he is doing well in the season ending Master's Cup
Yesterday he beat Gustavo Kuerten 6-2,6-7,6-4 [28 aces]
In the third set, 6th game, he was love-40 down and hit 5 aces to take the game
Typical Goran stuff!!!
Nish
Sonork ID 100.9786 voidmain
www.busterboy.org
Nish is a BIG fan of Goran Ivanisevic
|
|
|
|
|
That's cool. I'm surprised he's doing so well
considering how long he's been around.
|
|
|
|
|
That's Goran for you
You never know with Goran
Nish
Sonork ID 100.9786 voidmain
www.busterboy.org
Nish is a BIG fan of Goran Ivanisevic
|
|
|
|
|
|
Hey, that's just what I was looking for. I hunted
around the CodeProject site, but did not see this.
Thanks.
|
|
|
|
|
I'm trying to implement a class not unlike CList, XList. I'm using a template
template <class T> class XList
and when I compile I get unresolved externals errors for my constructor and deconstructor. I originally got this error for all my functions but I fixed it by adding 'virtual' to the front of the declaration. This doesn't seem to work with the aforemention functions. I'm declaring them thus:
XList();
virtual ~XList();
template <class T>
XList<T>::XList() {
// Constructor Code
}
template <class Tglt;
XList<T>::~XList() {
// Deconstructor code
}
Any help would be appreciated
- X
|
|
|
|
|
Did you put the function definitions into the same file where your template class is declared (e.g. into the header file and not the .cpp file)?
The compiler requires the functions definitions to be in the same translation unit than the class declaration.
Oliver
|
|
|
|
|
|
Did you mean that it's not possible to declare the class in a h file and the implementation in a cpp file?
I have the same trouble as I convert my list which use void* to use template. But I don't move the code from cpp to h and when I link the library, it's ok. But when I link the application , I get link error.
Does it exist another way to move the implementation from cpp to h for solving this kind of problem?
Bruno
|
|
|
|
|
When you use your template class in more than one source file you should put the class declaration and the function definition in the same header file. Most template libraries like STL, ATL, WTL ship without cpp files.
Oliver
|
|
|
|
|
Hello
I am currently working on a SERVER which could send/receive string using Win32 Socket.... Could someone please send me a simple example?
I am a real beginner using Win32...
PLEASE HELP ME!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
|
take a look at jon sagara's triple-post below. rcopy.cpp and server.cpp should get you started. He's written them for unix but the basic principles are essentially the same
Nish
Sonork ID 100.9786 voidmain
www.busterboy.org
Nish is a BIG fan of Goran Ivanisevic
|
|
|
|
|
|
Hi guys,
I'm in a bit of a bind (haha, I made a funny). I'm writing a small file copying application for a class. We're trying to emulate the datalink layer on Unix by implementing a stop-and-wait protocol using UDP datagrams.
I have two separate programs:
rcopy is the client. It requests a file from the server. If the file does not exist, rcopy exits gracefully.
server is the server (naturally). It accepts requests from clients who want to copy a file. If the file does not exist on the server, then the server sends a flag back to rcopy basically saying "File does not exist."
I can get the datagrams to work one way: I can get the file name from the command line in rcopy and successfully send that to server. server can then attempt to open the file, and based on the outcome, can prepare a flag to send back to rcopy.
*** Here's the problem ***
When I call recvfrom(...) on the server to get the file name from rcopy, the sockaddr_in parameter is not getting sent. Therefore, I can't send the file ACK back to rcopy, and rcopy blocks indefinitely.
Anyhow, I have been trying to get this for *several* hours now, and I'm no further along than when I started. I hope one of you networking gurus will be able to help me out here.
Many thanks in advance for any help.
Note - I will post my code below because I'm not sure of the max size of these messages.
Thanks again,
Jon Sagara
"After all is said and done, usually more is said than done." -- Unknown
|
|
|
|
|
// ============================================================================
// rcopy.cc
//
// This program is repsonsible for taking the file names as command line
// arguments and communicating with the server program to request the remote-
// file. This program will then receive the file and store it to disk using
// the local-file name. Thr program will be run as:
//
// rcopy remote-file local-file remote-machine remote-port error-percent
//
// where:
//
// remote-file: is the file on the remote machine to be copied
// local-file: is the file cpied into on the local machine
// remote-machine: is the remote machine running the server
// remote-port: is the port number of the server application
// error-percent: is the percent of packets that are in error (floating
// poing number)
//
// Author: Jon Sagara
//
// This file represents the CLIENT.
// ============================================================================
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <stream.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <strings.h>
#include <sys/time.h>
#include "networks.h"
#include "sendtoErrB.h"
int CreateUDPSocket(struct sockaddr_in &remote, char *szHostName, char *szPort);
int main(int argc, char *argv[])
{
int nSocket; // Socket descriptor.
int nBytesRead = 0; // Number of bytes read from server.
int nBytesSent = 0; // Number of bytes send to server.
int nSendLen = 0; // Number of bytes to send to server.
int nRecvLen = 0; // Number of bytes received from server.
float fErrorPct = 0.0; // Percent of packets that are in error.
sockaddr_in recv; // Socket address passed by recvfrom().
sockaddr_in remote; // Socket address for remote socket (server).
unsigned char recv_buf[BUFF_SIZE];
unsigned char send_buf[BUFF_SIZE];
//
// Check command line parameters.
//
if (6 != argc)
{
cout << "usage: " << argv[0] << " remote-file local-file"
<< "remote-machine remote-port error-percent\n";
exit(1);
}
fErrorPct = atof(argv[5]);
//
// Create the socket.
//
nSocket = CreateUDPSocket(remote, argv[3], argv[4]);
cout << "nSocket right after socket creation: " << nSocket << endl;
cout << "Enter the data to transmit: ";
cin.getline((char *) send_buf, BUFF_SIZE);
nSendLen = strlen((char *) send_buf) + 1;
cout << send_buf << " len: " << nSendLen << endl;
//
// Send data to server.
//
cout << "nSocket right before sending to server: " << nSocket << endl;
nBytesSent = sendto(nSocket, send_buf, nSendLen, 0, (struct sockaddr *) &remote, sizeof(remote));
if (nBytesSent < 0)
{
perror("Error sending data in rcopy. Trying to send to server.");
close(nSocket);
exit(1);
}
//
// Read data back from server.
//
nBytesRead = recvfrom(nSocket, recv_buf, BUFF_SIZE, 0, (struct sockaddr *) &recv, &nRecvLen);
if (nBytesRead < 0)
{
perror("Error reading data in rcopy. Trying to read back from server.");
close(nSocket);
exit(1);
}
cout << "recv_buf: " << recv_buf << endl;
cout << "nRecvLen: " << nRecvLen << endl;
close (nSocket);
return 0;
}
// ----------------------------------------------------------------------------
// CreateUDPSocket(...)
//
// Creates a UDP socket that connects to the server application on a remote
// machine. The applications port is passed in on the command line.
//
// Parameters:
// struct sockaddr_in &remote [IN/OUT]:
// Socket address for remote socket.
// char *hostName [IN]:
// Name of the remote host.
//
// Assumes: The function has been called correctly from the command line. Also
// assumes that server is already running and is blocking, waiting for
// data.
// Results: A UPD socket is created.
// Returns: The socket descriptor of the remote socket.
// ----------------------------------------------------------------------------
//
int CreateUDPSocket(struct sockaddr_in &remote, char *szHostName, char *szPort)
{
int nSocket;
hostent *hp; // Address of remote host (server).
//
// Create the socket.
//
if ((nSocket = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("Error creating socket in CreateUDPSocket");
exit(1);
}
//
// Get the address of the remote host.
//
hp = gethostbyname(szHostName);
//
// Set up the remote address.
//
remote.sin_family = AF_INET;
memcpy(&remote.sin_addr, hp->h_addr_list[0], hp->h_length);
remote.sin_port = atoi(szPort);
return nSocket;
}
Jon Sagara
"After all is said and done, usually more is said than done." -- <i>Unknown</i>
|
|
|
|
|
// ============================================================================
// server.cc
//
// This program is responsible for accepting requests for files from the rcopy
// program and transmitting the file back. This program should never terminate
// (unless you kill it with a ctrl-c). It should continually process requests
// from the rcopy program.
//
// The server needs to handle error conditions such as non-existing files by
// passing back a flag to the rcopy program and then waiting for a new file
// request.
//
// The server should output its port number to be used by the rcopy program.
// The server program will be run as:
//
// server error-percent
//
// where
//
// error-percent is the percent of packets that are in error (floating
// point number)
//
// Author: Jon Sagara
//
// This file represents the SERVER.
// ============================================================================
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <stream.h>
#include <ctype.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <strings.h>
#include <sys/time.h>
#include "networks.h"
#include "sendtoErrB.h"
int CreateServerSocket();
int main(int argc, char *argv[])
{
int nSocket;
int nBytesRead = 0; // Number of bytes read from rcopy.
int nBytesSent = 0; // Number of bytes send to rcopy.
int nRemoteLen = 0; // Length of remote
sockaddr_in remote; // Socket address of rcopy.
unsigned char recv_buf[BUFF_SIZE];
unsigned char send_buf[BUFF_SIZE];
//
// Check command line arguments.
//
if (2 != argc)
{
cout << "usage: " << argv[0] << " error-percent" << endl;
exit(-1);
}
nSocket = CreateServerSocket();
nBytesRead = recvfrom(nSocket, recv_buf, BUFF_SIZE, 0, (struct sockaddr *) &remote, &nRemoteLen);
cout << recv_buf << " len: " << nBytesRead << endl;
memcpy(send_buf, "Jon Sagara", 11);
nBytesSent = sendto(nSocket, send_buf, 11, 0, (struct sockaddr *) &remote, sizeof(remote));
if (nBytesSent < 0)
{
perror("Error sending data in server. Sending back to rcopy");
close(nSocket);
exit(1);
}
close(nSocket);
return 0;
}
// ----------------------------------------------------------------------------
// CreateServerSocket()
//
// Creates a server socket and binds it to a particular address and port. This
// allows any process to (theoretically) connect to our server.
//
// Assumes: We will bind to the local address.
// Results: A socket is created, bound to the local machine's address.
// Returns: The socket descriptor.
// ----------------------------------------------------------------------------
//
int CreateServerSocket()
{
int nSocket = 0; // Socket descriptor.
int nLocalLen = 0; // sizeof(local).
sockaddr_in local; // Local socket address.
//
// Create the socket.
//
if ((nSocket = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
{
perror("Error creating socket in CreateServerSocket()");
exit(1);
}
//
// Set up the socket ("name it").
//
local.sin_family = AF_INET; // Internet family.
local.sin_addr.s_addr = INADDR_ANY; // Wild card machine address (local address).
local.sin_port = 0; // Let the system choose the port.
//
// Bind the name (address) to a port.
//
nLocalLen = sizeof(local);
if ((bind(nSocket, (struct sockaddr *) &local, nLocalLen)) < 0)
{
perror("Error calling bind() in CreateServerSocket()");
exit(1);
}
//
// Get the port name and print it out.
//
getsockname(nSocket, (struct sockaddr *) &local, &nLocalLen);
cout << "Socket has port " << local.sin_port << "\n";
return nSocket;
}
Jon Sagara
"After all is said and done, usually more is said than done." -- <i>Unknown</i>
|
|
|
|
|
|
Jon
you've got some nerve posting Unix code on codeproject
Nish
Sonork ID 100.9786 voidmain
www.busterboy.org
Nish is a BIG fan of Goran Ivanisevic
|
|
|
|
|
Like you said in the next thread up, the concepts are largely the same. I was stuck on the same lamo bug for a few hours and I was getting desperate, so I thought I'd give it a go here in the CP forums. Seems like every time I post a question here, I end up answering it myself 20 minutes later. Maybe I should post first and think later.
Jon Sagara
"After all is said and done, usually more is said than done." -- Unknown
|
|
|
|
|
Jon Sagara wrote:
I end up answering it myself 20 minutes later.
Who am I kidding? It took almost 3 hours. Time stamps are the devil.
Jon Sagara
"After all is said and done, usually more is said than done." -- Unknown
|
|
|
|
|
Jon Sagara wrote:
Time stamps are the devil.
got you that time, didnt we !
Nish
Sonork ID 100.9786 voidmain
www.busterboy.org
Nish is a BIG fan of Goran Ivanisevic
|
|
|
|
|