I am trying to write a server-client application for file transfer: the client written in Java and the server written in C++.

Unfortunately I have the following error: "java.net.SocketException: Connection reset by peer: socket write error".

Here is my code for client:

import java.io.*;
import java.net.Socket;


public class Proba_binar 

    public static void main(String[] args) 
    {
        byte[] buffer = null;  
        byte[] auxByte = new byte[1000];  
        String fileName = "1.jpg";
        File a_file = new File(fileName);  
        try  
        {
            // Create a socket
            Socket socket = new Socket("192.168.14.146", 8888);
            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

            // Read file
            FileInputStream fis = new FileInputStream(fileName);    
            int length = (int)a_file.length();  
            buffer = new byte[length];  
            fis.read(buffer);  
            fis.close();  

            // Send file length
            System.out.println("length = " + Integer.toString(length));
            out.write(Integer.toString(length) + "\n");
            out.flush();

            // Send file
            int imageSize = buffer.length;
            char[] auxChar = new char[1000];
            int nr_transf = imageSize / 1000;
            int rest_byte = imageSize % 1000;
            System.out.println("nr_transf = " + nr_transf);

            for(int j = 0; j < nr_transf; j++)
            {
                // send series of 1000 bytes
                for(int i = 0; i < 1000; i++)
                {
                    auxChar[i] = (char)buffer[j*1000+i];
                    auxByte[i] = buffer[j*1000+i];
                }
                out.write(auxChar);
                out.flush();
            }

            // send last bytes
            for(int i = 0; i < rest_byte; i++)
            {
                auxChar[i] = (char)buffer[1000*nr_transf+i];
                auxByte[i] = buffer[1000*nr_transf+i];
            }
            out.write(auxChar, 0, rest_byte);
            out.flush();

            out.close();
            in.close();
            socket.close();
            System.out.println("Transfer finished!");
        }  
        catch(IOException e)  
        {  
            e.printStackTrace();  
        } 
    }
}
{

And the code for server:

#include<io.h>
#include<stdio.h>
#include<winsock2.h>
#include<conio.h>

#pragma comment(lib,"ws2_32.lib") //Winsock Library

int main(int argc , char *argv[])
{
    WSADATA wsa;
    SOCKET s , new_socket;
    struct sockaddr_in server , client;
    int c, bytecount, nr_transf, rest_byte, i;
    int recv_size, file_size;
    char message[1000];     
    char buffer[1000];
    int buffer_len = 1000;
    FILE *f = fopen("out.jpg", "wb");

    printf("\nInitialising Winsock...");
    if (WSAStartup(MAKEWORD(2, 2),&wsa) != 0)
    {
        printf("Failed. Error Code : %d",WSAGetLastError());
        return 1;
    }

    printf("Initialised.\n");

    //Create a socket
    if((s = socket(AF_INET, SOCK_STREAM, 0 )) == INVALID_SOCKET)
    {
        printf("Could not create socket : %d" , WSAGetLastError());
        getch();
        return 0;
    }

    printf("Socket created.\n");

    //Prepare the sockaddr_in structure
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;
    server.sin_port = htons( 8888 );

    //Bind
    if(bind(s, (struct sockaddr*)&server, sizeof(server)) == SOCKET_ERROR)
    {
        printf("Bind failed with error code : %d" , WSAGetLastError());
        getch();
        return 0;
    }

    puts("Bind done");

    //Listen to incoming connections
    listen(s, 3);

    //Accept and incoming connection
    puts("Waiting for incoming connections...");

    c = sizeof(struct sockaddr_in);
    new_socket = accept(s, (struct sockaddr*)&client, &c);
    if (new_socket == INVALID_SOCKET)
    {
        printf("accept failed with error code : %d", WSAGetLastError());
        getch();
        return 0;
    }

    puts("Connection accepted");

    //Receive FILE DIMENSION from client
    if((recv_size = recv(new_socket, message, 1000, 0)) == SOCKET_ERROR)
    {
        puts("recv failed");
        getch();
    }     
    message[recv_size] = '\0';
    file_size = atoi(message);

    printf("\nfile_size = %d", file_size);


    nr_transf = file_size / 1000;
    rest_byte = file_size % 1000;


    //Receive FILE from client
    for(i = 0; i < nr_transf; i++)
    {
        // receive 1000 bytes
        if((bytecount = recv(new_socket, buffer, buffer_len, 0)) == SOCKET_ERROR)       
        {
            printf("Receive failed auxChar");
            getch();
            return 0;
        }
        fwrite(buffer, 1, buffer_len, f);
    }
    // receive last bytes
    if((bytecount = recv(new_socket, buffer, rest_byte, 0)) == SOCKET_ERROR)        
    {
        printf("Receive failed rest_byte");
        getch();
        return 0;
    }
    fwrite(buffer, 1, rest_byte, f);
    fclose(f);
    printf("Receive finished!");


    closesocket(s);
    WSACleanup();

    getch();
    return 0;
}

I made equivalent server in Java and works perfectly. I do not know what the problem is in c + + version. Thanks in advance!

C++ code seems ok, tested it my self and works without any exceptions. Of course my client is :
http://www.drk.com.ar/builder.php (you can download and check it with this one also)

Don't know about java, but you should ensure that your server's ip address is the one you typed and there is not a firewall in any of the machines that blocks port 8888.

Hope that helped!

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.