Internally, a signed and an unsigned type are the same. The char you send is just 8 bits of data, just like an unsigned char. Therefore,
void Write(char * arr,int size)
{
unsigned char* dt = (unsigned char*)a; write(Socket,dt,size);
}
will send exactly the same data as
void Write(char * arr,int size)
{
write(Socket,arr,size);
}