The UNIX and Linux Forums  
Hello and Welcome from United States to the UNIX and Linux Forums! Thank You for Visiting and Joining Our Global Community.

Go Back   The UNIX and Linux Forums > Top Forums > High Level Programming
.
google unix.com



High Level Programming Post questions about C, C++, Java, SQL, and other programming languages here.

More UNIX and Linux Forum Topics You Might Find Helpful
Thread Thread Starter Forum Replies Last Post
Socket programming in C sudharma High Level Programming 3 04-02-2009 08:51 AM
Socket programming in C nameless` High Level Programming 2 02-12-2009 01:38 PM
socket programming sureshvaikuntam IP Networking 1 04-21-2008 08:38 AM
Socket Programming socket soshell High Level Programming 2 06-29-2004 07:49 AM
Socket programming Nadeem Mistry High Level Programming 1 07-23-2001 04:33 AM

Reply
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish
 
LinkBack Thread Tools Search this Thread Rate Thread Display Modes
  #1 (permalink)  
Old 06-23-2009
htabesh htabesh is offline
Registered User
  
 

Join Date: Aug 2008
Posts: 8
Exclamation Socket Programming Send File

Hello my friends;

Look at this 2 program:

Client:

Code:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main ( int agrc, char *argv[] )
{
	int Socket;
	struct sockaddr_in Server_Address;	
	Socket = socket ( AF_INET, SOCK_STREAM, 0 );
	if ( Socket == -1 )
	{	
		printf ("Can Not Create A Socket!");	
	}
	int Port ;
	Port = atoi(argv[2]);	
	Server_Address.sin_family = AF_INET;
	Server_Address.sin_port = htons ( Port );
	Server_Address.sin_addr.s_addr = inet_addr(argv[1]);
	if ( Server_Address.sin_addr.s_addr == INADDR_NONE )
	{
		printf ( "Bad Address!" );
	}	
	connect ( Socket, (struct sockaddr *)&Server_Address, sizeof (Server_Address) );


        char *path;
        char *filename;
        path = "/home/hosein/Desktop/Project-30-3/Scan.pdf";
        filename = strrchr(path, '/') + 1;
        send(Socket,filename,sizeof(filename),0);

        FILE *in = fopen("1.tar.gz","r");
        char Buffer[2] = "";
        int len;
        while ((len = fread(Buffer,sizeof(Buffer),1, in)) > 0)
        {            
            send(Socket,Buffer,sizeof(Buffer),0);            
        }
        send(Socket,"Hi",sizeof(Buffer),0);

        char Buf[BUFSIZ];
	recv(Socket, Buf, BUFSIZ, 0);
        if ( strcmp (Buf,"ACK") == 0  )
        {
            printf("Recive ACK\n");
        }        
        close (Socket);
        fclose(in);
	return 0;	
}
Server:
Code:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int main ( int agrc, char *argv[] )
{
	/******** Program Variable Define & Initialize **********/
	int Main_Socket; 	// Main Socket For Server
	int Communication_Socket; // Socket For Special Clients
	int Status; // Status Of Fucntion
	struct sockaddr_in Server_Address; // Address Of Server
	struct sockaddr_in Client_Address; // Address Of Client That Communicate Whit Server
	int Port ;
        char Buff[100] = "";
	Port = atoi(argv[2]);
	printf ("Server Communicating By Using Port %d\n", Port);
	/******** Create A Socket To Communicate With Server **********/
	Main_Socket = socket ( AF_INET, SOCK_STREAM, 0 );
	if ( Main_Socket == -1 )
	{
		printf ("Sorry System Can Not Create Socket!\n");
	}
	/******** Create A Address For Server To Communicate **********/
	Server_Address.sin_family = AF_INET;
	Server_Address.sin_port = htons(Port);
	Server_Address.sin_addr.s_addr = inet_addr(argv[1]);
	/******** Bind Address To Socket **********/
	Status = bind ( Main_Socket, (struct sockaddr*)&Server_Address, sizeof(Server_Address) );
	if ( Status == -1 )
	{
		printf ("Sorry System Can Not Bind Address to The Socket!\n");
	}
	/******** Listen To The Port to Any Connection **********/        
	listen (Main_Socket,12);	
	socklen_t Lenght = sizeof (Client_Address);
        while (1)
        {
            Communication_Socket = accept ( Main_Socket, (struct sockaddr*)&Client_Address, &Lenght );
            if (!fork())
            {

                char CH[8];
                recv(Communication_Socket, CH, sizeof(CH), 0);
                printf("%s\n",CH);
                
                FILE *fp=fopen("sample.tar.gz","w");
                while(1)
                {
                    char Buffer[2]="";
                    if (recv(Communication_Socket, Buffer, sizeof(Buffer), 0))
                    {
                        if ( strcmp (Buffer,"Hi") == 0  )
                        {
                            break;
                        }
                        else
                        {
                            fwrite(Buffer,sizeof(Buffer),1, fp);
                        }
                    }
                }
                fclose(fp);
                send(Communication_Socket, "ACK" ,3,0);
                printf("ACK Send");
		exit(0);
            }
        }
	return 0;
}
If I declare CH[x] ( x <= 8 ), everything work right and file will send in a true way. but with CH[x] ( x > 8 ) I can't send file! what's the problem?
  #2 (permalink)  
Old 06-23-2009
pludi's Avatar
pludi pludi is offline Forum Staff  
Moderator
  
 

Join Date: Dec 2008
Location: .at
Posts: 1,788
Let me guess, you're compiling on a 64bit architecture.

sizeof() is a compile-time instruction and will, in your case, return the size of the pointer for the character array. Try declaring the a macro for the size of the array & use that macro for the recv() call.
  #3 (permalink)  
Old 06-23-2009
htabesh htabesh is offline
Registered User
  
 

Join Date: Aug 2008
Posts: 8
No! I don't use 64 bit architecture! I try strlen() instead of sizeof()! there is problem JUST in receiving File Name (recv(Communication_Socket, CH, sizeof(CH), 0);
I don't know why!
  #4 (permalink)  
Old 06-23-2009
pludi's Avatar
pludi pludi is offline Forum Staff  
Moderator
  
 

Join Date: Dec 2008
Location: .at
Posts: 1,788
OK then, what exactly do you mean by "can't send file!"? Does recv() block, is the file corrupted, won't the program end?
  #5 (permalink)  
Old 06-23-2009
htabesh htabesh is offline
Registered User
  
 

Join Date: Aug 2008
Posts: 8
Is it possible for you to test and compile that 2 program?
Thanks for your kindness.
  #6 (permalink)  
Old 06-25-2009
mgessner mgessner is offline
Registered User
  
 

Join Date: Oct 2007
Posts: 50
Quote:
Originally Posted by pludi View Post
sizeof() is a compile-time instruction
I'm nit-picking, but it isn't always the case that sizeof is compile-time.

C99 allows sizeof to be runtime for VLA's.

---------- Post updated at 09:57 AM ---------- Previous update was at 09:56 AM ----------

To the OP: it would be a good idea to check the return values from all the socket and i/o functions you're using... you're flying blind, not knowing what is happening.
Sponsored Links
Reply

Bookmarks

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes Rate This Thread
Rate This Thread:

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On



All times are GMT -4. The time now is 11:03 AM.


Powered by: vBulletin, Copyright ©2000 - 2006, Jelsoft Enterprises Limited. Language translation by Google.
vBCredits v1.4 Copyright ©2007 - 2008, PixelFX Studios
The UNIX and Linux Forums Content Copyright ©1993-2009. All Rights Reserved.Ad Management by RedTyger

Content Relevant URLs by vBSEO 3.2.0