# Socket Programming Send File

**URL:** <https://community.unix.com/t/socket-programming-send-file/243137>\
**Category:** Programming\
**Created:** [June 23, 2009, 11:51am UTC](https://community.unix.com/t/socket-programming-send-file/243137 "2009-06-23T11:51:36Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![htabesh](https://community.unix.com/letter_avatar/htabesh/32/6_22734026db12803ebb3e059622ac3534.png) [@htabesh](https://community.unix.com/u/htabesh)\
**Post date:** [June 23, 2009, 11:51am UTC](https://community.unix.com/t/socket-programming-send-file/243137/1 "2009-06-23T11:51:36Z")

</div>

Hello my friends;

Look at this 2 program:

Client:

```nohighlight
#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:

```nohighlight
#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?😕

---

<div class="post-metadata">

**Author:** ![pludi](https://community.unix.com/user_avatar/community.unix.com/pludi/32/1278_2.png) [@pludi](https://community.unix.com/u/pludi)\
**Post date:** [June 23, 2009, 12:05pm UTC](https://community.unix.com/t/socket-programming-send-file/243137/2 "2009-06-23T12:05:57Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![htabesh](https://community.unix.com/letter_avatar/htabesh/32/6_22734026db12803ebb3e059622ac3534.png) [@htabesh](https://community.unix.com/u/htabesh)\
**Post date:** [June 23, 2009, 12:50pm UTC](https://community.unix.com/t/socket-programming-send-file/243137/3 "2009-06-23T12:50:07Z")

</div>

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! ☹

---

<div class="post-metadata">

**Author:** ![pludi](https://community.unix.com/user_avatar/community.unix.com/pludi/32/1278_2.png) [@pludi](https://community.unix.com/u/pludi)\
**Post date:** [June 23, 2009, 2:34pm UTC](https://community.unix.com/t/socket-programming-send-file/243137/4 "2009-06-23T14:34:14Z")

</div>

OK then, what exactly do you mean by "can't send file!"? Does recv() block, is the file corrupted, won't the program end?

---

<div class="post-metadata">

**Author:** ![htabesh](https://community.unix.com/letter_avatar/htabesh/32/6_22734026db12803ebb3e059622ac3534.png) [@htabesh](https://community.unix.com/u/htabesh)\
**Post date:** [June 23, 2009, 2:46pm UTC](https://community.unix.com/t/socket-programming-send-file/243137/5 "2009-06-23T14:46:25Z")

</div>

Is it possible for you to test and compile that 2 program?  
Thanks for your kindness. 🙂

---

<div class="post-metadata">

**Author:** ![mgessner](https://community.unix.com/letter_avatar/mgessner/32/6_22734026db12803ebb3e059622ac3534.png) [@mgessner](https://community.unix.com/u/mgessner)\
**Post date:** [June 25, 2009, 9:57am UTC](https://community.unix.com/t/socket-programming-send-file/243137/6 "2009-06-25T09:57:36Z")

</div>

> [@pludi](#):
>
> 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.
