duffman.sk
December 14th, 2007, 03:56 PM
Hi I have problem with creating of my ftp client for university. My program cannot create data socket and bind it to port, it always writes "Cannot assign requested address". Here's code of my procedure for connect:
int makeConnection(char server_addr[100], int portno) //function creates connection to server, else returns 1
{
struct hostent *server;
struct hostent *client;
struct sockaddr_in serv_addr; //server address
struct sockaddr_in local_addr; //client address
int return_value;
int len;
char hostname[50];
ctrlSckt = socket(AF_INET, SOCK_STREAM, 0);
return_value=0;
if (ctrlSckt < 0)
{
perror("ERROR opening socket");
return_value=1;
}
server = gethostbyname(server_addr);
if (server == NULL) {
fprintf(stderr,"ERROR, no such host\n");
return_value=1;
exit(1);
}
((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
serv_addr.sin_port = htons(portno);
if (connect(ctrlSckt,&serv_addr,sizeof(serv_addr)) < 0) {
perror("ERROR connecting");
return_value=1;
}
cin = fdopen(ctrlSckt, "r");
cout = fdopen(ctrlSckt, "w");
len=sizeof(local_addr);
getsockname(ctrlSckt,(struct sockaddr *)&local_addr,&len);
printf("datapo: %d;;\n",ntohs(local_addr.sin_port));
//creating data socket
dataSckt = socket(AF_INET, SOCK_STREAM, 0);
//get port number of control connection
bzero((char *) &local_addr, sizeof(local_addr));
local_addr.sin_family = AF_INET;
len=sizeof(local_addr);
getsockname(ctrlSckt,(struct sockaddr *)&local_addr,&len);
data_portno=ntohs(local_addr.sin_port)+1;
local_addr.sin_port=htons(data_portno);
gethostname((char *)hostname, sizeof(hostname));
client = gethostbyname((char *)hostname);
bcopy((char *)client->h_addr, (char *)&local_addr.sin_addr.s_addr, client->h_length);
local_addr.sin_addr.s_addr=client->h_addr;
gethostname((char *)hostname, sizeof(hostname));
//bind data socket to port
if (bind(dataSckt,(struct sockaddr *) &local_addr, sizeof(local_addr))<0)
perror("ftp bind");
listen(dataSckt,5);
Can you help me? And don't you know some link to simple ftp client source code so I can inspire? Because I didn't find anything simple..
int makeConnection(char server_addr[100], int portno) //function creates connection to server, else returns 1
{
struct hostent *server;
struct hostent *client;
struct sockaddr_in serv_addr; //server address
struct sockaddr_in local_addr; //client address
int return_value;
int len;
char hostname[50];
ctrlSckt = socket(AF_INET, SOCK_STREAM, 0);
return_value=0;
if (ctrlSckt < 0)
{
perror("ERROR opening socket");
return_value=1;
}
server = gethostbyname(server_addr);
if (server == NULL) {
fprintf(stderr,"ERROR, no such host\n");
return_value=1;
exit(1);
}
((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr, (char *)&serv_addr.sin_addr.s_addr, server->h_length);
serv_addr.sin_port = htons(portno);
if (connect(ctrlSckt,&serv_addr,sizeof(serv_addr)) < 0) {
perror("ERROR connecting");
return_value=1;
}
cin = fdopen(ctrlSckt, "r");
cout = fdopen(ctrlSckt, "w");
len=sizeof(local_addr);
getsockname(ctrlSckt,(struct sockaddr *)&local_addr,&len);
printf("datapo: %d;;\n",ntohs(local_addr.sin_port));
//creating data socket
dataSckt = socket(AF_INET, SOCK_STREAM, 0);
//get port number of control connection
bzero((char *) &local_addr, sizeof(local_addr));
local_addr.sin_family = AF_INET;
len=sizeof(local_addr);
getsockname(ctrlSckt,(struct sockaddr *)&local_addr,&len);
data_portno=ntohs(local_addr.sin_port)+1;
local_addr.sin_port=htons(data_portno);
gethostname((char *)hostname, sizeof(hostname));
client = gethostbyname((char *)hostname);
bcopy((char *)client->h_addr, (char *)&local_addr.sin_addr.s_addr, client->h_length);
local_addr.sin_addr.s_addr=client->h_addr;
gethostname((char *)hostname, sizeof(hostname));
//bind data socket to port
if (bind(dataSckt,(struct sockaddr *) &local_addr, sizeof(local_addr))<0)
perror("ftp bind");
listen(dataSckt,5);
Can you help me? And don't you know some link to simple ftp client source code so I can inspire? Because I didn't find anything simple..