Compare commits
17 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
4ff56f2636 | ||
|
3010b45e05 | ||
|
590ad72d9b | ||
dab08afc82 | |||
|
a4c9d7c72e | ||
|
8b50fe95b9 | ||
|
fb938341f1 | ||
1ef8745451 | |||
8c7115ef7b | |||
|
120a454d9d | ||
2a468af441 | |||
4c84927fd4 | |||
f9d2f53d81 | |||
b3e7938dc4 | |||
e6a7ebefc3 | |||
86bc60b23a | |||
30c3f77afa |
35
README.md
35
README.md
@ -1,25 +1,20 @@
|
|||||||
# Projekt_SIK
|
# Projekt_SIK
|
||||||
|
|
||||||
Serwer na zasadzie przesylania wiadomosci
|
Projekt 1 Sieci Komputerowe <br>
|
||||||
|
Wykorzystujemy protokol TCP! <br>
|
||||||
|
|
||||||
Klient okresla do kogo ma wyslac
|
W gitignore dodalem pliki ktore nie maja byc przesylane na repozytorium. U mnie sa to smieci produkowane z Visual Studio Code oraz folder target z javy - tam jest generowany plik jar przez maven (jak zrobi sie maven install), mozna to robic lokalnie, nie trzeba przesylac na repozytorium. Dodatkowo nie przesylamy skompilowanego pliku z C czyli server/server.
|
||||||
|
|
||||||
|
## klient
|
||||||
|
W javie. Wykorzystalem to narzedzie maven, na Inzynierii oprogramowania je uruchomil. W skrocie sluzy do tego zebysmy potem mogli ladnie wyeksportowac plik javy do jednego pliku ktory mozemy uruchomic - takie narzedzie co kompiluje nam jave pozniej. Caly kod jest w App.java, wysylanie wiadomosci dziala - uwaga na wielkosc wiadomosci - te bajty. Bedziemy musieli chyba zrobic tak ze wiadomosci tekstowe sa rozdzielane na takie segmenty odpowiedniej wielkosci zeby pozniej je ladnie wyslac bo niestety C w ktorym jest napisany serwer musi miec dokladnie okreslona wielkosc odbieranej wiadomosci.
|
||||||
|
|
||||||
|
## serwer
|
||||||
|
W C. <br>
|
||||||
|
Done:
|
||||||
|
* laczenie sie z pojedynczym klientem
|
||||||
|
* odbieranie wiadomosci tekstowych od jednego klienta i wyswietlanie je w konsoli
|
||||||
|
|
||||||
TODO:
|
TODO:
|
||||||
usunac guzik File
|
* polaczenie od wielu klientow
|
||||||
|
* odbieranie duzych plikow
|
||||||
/DOWNLOAD nazwapliku ->polecenie
|
* przekazywanie wiadomosci do klienta
|
||||||
user> DOWNLOAD: nazwapliku -> wysylam
|
|
||||||
FILE: dlugosc pliku -> odbieram
|
|
||||||
odbieranie pliku w innym procesie
|
|
||||||
koniec polaczenia
|
|
||||||
|
|
||||||
/EXIT to wylogowanie
|
|
||||||
|
|
||||||
/FILE sciezkaDoPliku -> polecenie do wyslania
|
|
||||||
user> FILE:nazwa:dlugosc -> wysylam cos takiego
|
|
||||||
wysylanie pliku w czesciach (konwertuje do bajtow)
|
|
||||||
koniec polaczenia
|
|
||||||
|
|
||||||
/Users/kuba/Downloads/Vocab1.pdf
|
|
||||||
|
|
||||||
/Users/kuba/Desktop/vid.mov
|
|
||||||
|
Binary file not shown.
@ -24,53 +24,51 @@
|
|||||||
<version>4.11</version>
|
<version>4.11</version>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.commons</groupId>
|
|
||||||
<artifactId>commons-lang3</artifactId>
|
|
||||||
<version>3.9</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
|
|
||||||
<dependency>
|
|
||||||
<groupId>commons-io</groupId>
|
|
||||||
<artifactId>commons-io</artifactId>
|
|
||||||
<version>2.6</version>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
<finalName>${project.artifactId}-${project.version}</finalName>
|
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
|
||||||
<plugins>
|
<plugins>
|
||||||
<plugin>
|
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
|
||||||
<groupId>org.apache.maven.plugins</groupId>
|
<plugin>
|
||||||
<artifactId>maven-assembly-plugin</artifactId>
|
<artifactId>maven-clean-plugin</artifactId>
|
||||||
<executions>
|
<version>3.1.0</version>
|
||||||
<execution>
|
</plugin>
|
||||||
<phase>package</phase>
|
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
|
||||||
<goals>
|
<plugin>
|
||||||
<goal>single</goal>
|
<artifactId>maven-resources-plugin</artifactId>
|
||||||
</goals>
|
<version>3.0.2</version>
|
||||||
<configuration>
|
</plugin>
|
||||||
<attach>false</attach>
|
<plugin>
|
||||||
<appendAssemblyId>false</appendAssemblyId>
|
<artifactId>maven-compiler-plugin</artifactId>
|
||||||
<archive>
|
<version>3.8.0</version>
|
||||||
<manifest>
|
</plugin>
|
||||||
<mainClass>
|
<plugin>
|
||||||
Projekt.App
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
</mainClass>
|
<version>2.22.1</version>
|
||||||
</manifest>
|
</plugin>
|
||||||
</archive>
|
<plugin>
|
||||||
<descriptorRefs>
|
<artifactId>maven-jar-plugin</artifactId>
|
||||||
<descriptorRef>jar-with-dependencies</descriptorRef>
|
<version>3.0.2</version>
|
||||||
</descriptorRefs>
|
</plugin>
|
||||||
</configuration>
|
<plugin>
|
||||||
</execution>
|
<artifactId>maven-install-plugin</artifactId>
|
||||||
</executions>
|
<version>2.5.2</version>
|
||||||
</plugin>
|
</plugin>
|
||||||
</plugins>
|
<plugin>
|
||||||
|
<artifactId>maven-deploy-plugin</artifactId>
|
||||||
|
<version>2.8.2</version>
|
||||||
|
</plugin>
|
||||||
|
<!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-site-plugin</artifactId>
|
||||||
|
<version>3.7.1</version>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-project-info-reports-plugin</artifactId>
|
||||||
|
<version>3.0.0</version>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</pluginManagement>
|
||||||
</build>
|
</build>
|
||||||
|
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
|
@ -1,201 +1,41 @@
|
|||||||
package Projekt;
|
package Projekt;
|
||||||
|
|
||||||
import javax.swing.DefaultListModel;
|
import java.io.*;
|
||||||
import javax.swing.JButton;
|
import java.net.*;
|
||||||
import javax.swing.JFrame;
|
|
||||||
import javax.swing.JList;
|
|
||||||
import javax.swing.JScrollPane;
|
|
||||||
import javax.swing.JTextField;
|
|
||||||
|
|
||||||
import org.apache.commons.io.FileUtils;
|
|
||||||
import org.apache.commons.lang3.ArrayUtils;
|
|
||||||
|
|
||||||
import java.awt.event.*;
|
|
||||||
import java.io.DataInputStream;
|
|
||||||
import java.io.DataOutputStream;
|
|
||||||
import java.io.File;
|
|
||||||
import java.net.InetAddress;
|
|
||||||
import java.net.Socket;
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/*
|
|
||||||
Lepiej lapac exception!!!
|
|
||||||
CZY po wyjsciu z aplikacji zamkaja sie tez inne procesy? chyba tak
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class App {
|
|
||||||
static JTextField ipText, portText, messageT, myUserT; // przy evencie musi byc static albo w klasie musi byc final
|
|
||||||
static JFrame frame = new JFrame("Messages");
|
|
||||||
static JButton mSendB, connectB;
|
|
||||||
static JList<String> messagesL;
|
|
||||||
static DefaultListModel<String> messages = new DefaultListModel<>();
|
|
||||||
static JScrollPane sPane;
|
|
||||||
|
|
||||||
static Thread receiveThread = new Thread() { //watek w ktorym bedziemy tylko odbierac wiadomosci
|
|
||||||
public void run() { //uwazac zeby nie dochodzic jednoczesnie do tej samej zmiennej (synchronize?)
|
|
||||||
Socket rSocket;
|
|
||||||
try {
|
|
||||||
InetAddress rAddr = InetAddress.getByName(ipText.getText());
|
|
||||||
int rPort = Integer.parseInt(portText.getText());
|
|
||||||
rSocket = new Socket(rAddr, rPort + 1); // laczymy
|
|
||||||
DataInputStream rDis = new DataInputStream(rSocket.getInputStream()); // tu bedziemy przyjmowac wiadomosci
|
|
||||||
addMessage("LISTEN CONNECTION OK");
|
|
||||||
while (true) { //czytamy wiadomosc
|
|
||||||
byte[] rec = new byte[1024];
|
|
||||||
if (rDis.read(rec) > 0){
|
|
||||||
String s = new String(rec);
|
|
||||||
addMessage(s);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (Exception ae) {
|
|
||||||
ae.printStackTrace();
|
|
||||||
addMessage("REC CANT CONNECT");
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
public class App
|
||||||
|
{
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
try {
|
||||||
frame.setSize(320, 400);
|
// USTALAMY adres serwera i port - trzeba wpisac to co wyrzuca po uruchomieniu serwer
|
||||||
ipText = new JTextField("0.0.0.0");
|
InetAddress addr = InetAddress.getByName("0.0.0.0");
|
||||||
ipText.setBounds(10, 10, 200, 30);
|
int port = 44444; //Integer.parseInt(args[1]);
|
||||||
portText = new JTextField("44444");
|
|
||||||
portText.setBounds(210, 10, 100, 30);
|
|
||||||
connectB = new JButton("Connect");
|
|
||||||
connectB.setBounds(110, 50, 100, 30);
|
|
||||||
connectB.addActionListener(new ActionListener() {
|
|
||||||
public void actionPerformed(ActionEvent e){
|
|
||||||
//zapobiegac podwojnemu kliknieciu w connect!
|
|
||||||
receiveThread.start();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
myUserT = new JTextField("Nick");
|
// utworz gniazdo i od razu podlacz je do addr:port
|
||||||
myUserT.setBounds(10, 50, 100, 30);
|
Socket socket = new Socket(addr, port);
|
||||||
messagesL = new JList<String>(messages);
|
|
||||||
sPane = new JScrollPane(messagesL);
|
|
||||||
sPane.setBounds(10, 100, 300, 180);
|
|
||||||
messageT = new JTextField("Message");
|
|
||||||
messageT.setBounds(10, 290, 300, 30);
|
|
||||||
mSendB = new JButton("Send");
|
|
||||||
mSendB.setBounds(110, 330, 100, 30);
|
|
||||||
mSendB.addActionListener(new ActionListener() {
|
|
||||||
public void actionPerformed(ActionEvent e) { //wysylanie wiadomosci
|
|
||||||
try {
|
|
||||||
InetAddress tAddr = InetAddress.getByName(ipText.getText()); //ustanawiamy polaczenie na wysylanie wiadomosci
|
|
||||||
int tPort = Integer.parseInt(portText.getText());
|
|
||||||
String messString = messageT.getText();
|
|
||||||
DataOutputStream tDos, fDos;
|
|
||||||
DataInputStream fDis;
|
|
||||||
Socket tSocket, fSocket;
|
|
||||||
String toCheckString = messString + "xdddddddd"; //sprawdzany string zawsze bedzie mial min 9 znakow
|
|
||||||
|
|
||||||
if (toCheckString.substring(0, 5).equals("/FILE")){ //CHYBA OK? wysylanie pliku
|
//strumienie
|
||||||
String fileName = messString.substring(6, messString.length()); //uzyskujemy sciezke do pliku
|
DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); //tu wysylamy wiadomosci
|
||||||
System.out.println(fileName);
|
DataInputStream dis = new DataInputStream(socket.getInputStream()); //tu bedziemy przyjmowac wiadomosci
|
||||||
File sendFile = new File(fileName);
|
|
||||||
if (!sendFile.exists() || !sendFile.isFile()) { //zly plik
|
|
||||||
addMessage("ZLY PLIK!");
|
|
||||||
} else {
|
|
||||||
System.out.println(sendFile.length()); //wielkosc pliku
|
|
||||||
tSocket = new Socket(tAddr, tPort); // laczymy
|
|
||||||
tDos = new DataOutputStream(tSocket.getOutputStream()); // tu wysylamy wiadomosci
|
|
||||||
String[] parsed = messString.split("/"); //chcemy pobrac nazwe pliku
|
|
||||||
tDos.write(convert(myUserT.getText() + "> /FILE " + parsed[parsed.length-1] + " " + sendFile.length())); //wysylamy wielkosc pliku
|
|
||||||
byte[] fileContent = Files.readAllBytes(sendFile.toPath()); //plik do bitow
|
|
||||||
tSocket.close();
|
|
||||||
fSocket = new Socket(tAddr, tPort + 2);
|
|
||||||
fDos = new DataOutputStream(fSocket.getOutputStream()); //polaczenie dla pliku
|
|
||||||
int wyslano = 0;
|
|
||||||
while (wyslano < sendFile.length()){ //wysylamy po 1024
|
|
||||||
int tobyte = 1024; //standardowa ilosc bajtow
|
|
||||||
if (wyslano + tobyte > fileContent.length){
|
|
||||||
tobyte = fileContent.length - wyslano;
|
|
||||||
}
|
|
||||||
byte[] bufor = new byte[tobyte];
|
|
||||||
System.arraycopy(fileContent, wyslano, bufor, 0, tobyte);
|
|
||||||
fDos.write(bufor); //uwaga dodac sprawdzanie czy na pewno wyslalismy dobra liczbe bajtow
|
|
||||||
wyslano += tobyte;
|
|
||||||
addMessage("WYSLANO: " + wyslano);
|
|
||||||
}
|
|
||||||
messageT.setText("");
|
|
||||||
fSocket.close(); //czy to tez trzeba?
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if(toCheckString.substring(0, 9).equals("/DOWNLOAD")) { //pobieranie pliku
|
//wiadomosc musimy stworzyc tak zeby miala 1024 bajty - tak zeby pasowala do tablicy charow z serwera!
|
||||||
tSocket = new Socket(tAddr, tPort); // laczymy
|
byte[] mess = new byte[1024];
|
||||||
tDos = new DataOutputStream(tSocket.getOutputStream()); // tu wysylamy wiadomosci
|
String str = "Hello world from java!";
|
||||||
tDos.write(convert(myUserT.getText() + "> /DOWNLOAD " + messString.substring(10, messString.length()))); //wysylamy prosbe
|
mess = str.getBytes(); //konwertujemy na bajty
|
||||||
fSocket = new Socket(tAddr, tPort + 2);
|
dos.write(mess); //wysylamy
|
||||||
fDis = new DataInputStream(fSocket.getInputStream());
|
|
||||||
byte[] rec = new byte[1024];
|
|
||||||
String s = new String();
|
|
||||||
if (fDis.read(rec) > 0){
|
|
||||||
s = new String(rec); //otrzymana wiadomosc o wielkosci pliku
|
|
||||||
System.out.println(s);
|
|
||||||
}
|
|
||||||
int received = 0;
|
|
||||||
List<byte[]> fileBList = new ArrayList<byte[]>(); //plik
|
|
||||||
while (received < Integer.parseInt(s.trim())){ //pobieramy zawartosc pliku
|
|
||||||
rec = new byte[1024]; //czyscimy tablice
|
|
||||||
if (fDis.read(rec) > 0){
|
|
||||||
fileBList.add(rec); //dodajemy do listy
|
|
||||||
}
|
|
||||||
received += 1024;
|
|
||||||
addMessage("POBRANO: " + received);
|
|
||||||
}
|
|
||||||
byte[] fileB = fileBList.get(0);
|
|
||||||
for(int i=1; i<fileBList.size(); i++){
|
|
||||||
fileB = ArrayUtils.addAll(fileB, fileBList.get(i));
|
|
||||||
}
|
|
||||||
FileUtils.writeByteArrayToFile(new File(messString.substring(10, messString.length())), fileB); //zapis pliku
|
|
||||||
addMessage("ZAPISANO PLIK");
|
|
||||||
|
|
||||||
} else {
|
|
||||||
tSocket = new Socket(tAddr, tPort); // laczymy
|
|
||||||
tDos = new DataOutputStream(tSocket.getOutputStream()); // tu wysylamy wiadomosci
|
|
||||||
tDos.write(convert(myUserT.getText() + "> " + messString)); //wysylamy
|
|
||||||
messageT.setText("");
|
|
||||||
tSocket.close(); //czy to tez trzeba?
|
|
||||||
}
|
|
||||||
} catch (Exception ae){
|
|
||||||
ae.printStackTrace();
|
|
||||||
addMessage("CANT SEND");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
frame.add(ipText);
|
// czytaj odpowiedz to jest kod golinskiego
|
||||||
frame.add(portText);
|
//String s = dis.readUTF();
|
||||||
frame.add(sPane);
|
// wypisz odpowiedz
|
||||||
frame.add(messageT);
|
//System.out.println("Serwer powiedzial: "+s);
|
||||||
frame.add(mSendB);
|
dis.close();
|
||||||
frame.add(myUserT);
|
dos.close();
|
||||||
frame.add(connectB);
|
socket.close();
|
||||||
frame.setLayout(null);
|
|
||||||
frame.setVisible(true);
|
} catch (Exception e) { //kiepskie lapanie wyjatkow!! lepiej bardziej sprecyzowac jaki wyjatek lapiemy
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
System.out.println("Klient zakonczyl dzialanie");
|
||||||
}
|
}
|
||||||
|
|
||||||
synchronized static byte[] convert(String wiad){
|
|
||||||
byte[] mess = new byte[1024]; //UWAGA pewnie dluzsze wiadomosci trzeba jakos rozdzielac
|
|
||||||
mess = wiad.getBytes(); // konwertujemy na bajty
|
|
||||||
return mess;
|
|
||||||
}
|
|
||||||
|
|
||||||
synchronized static void addMessage(String mess){ //funkcja do wsadzania nowych wiadomosci
|
|
||||||
messages.addElement(mess);
|
|
||||||
messagesL.setModel(messages);
|
|
||||||
//messagesL.ensureIndexIsVisible(messages.getSize() - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//byte[] combined = new byte[1024*(i+1)]; //bufor do laczenia
|
|
||||||
//System.arraycopy(fileB, 0, combined, 0, fileB.length); //kopiowanie
|
|
||||||
//System.arraycopy(fileBList.get(i), 0, combined, fileB.length, fileBList.get(i).length);
|
|
||||||
//fileB = new byte[1024*(i+1)];
|
|
||||||
//System.arraycopy(combined, 0, fileB, 0, combined.length); //kopiowanie 2
|
|
BIN
server/.DS_Store
vendored
BIN
server/.DS_Store
vendored
Binary file not shown.
@ -37,7 +37,6 @@ int main(void) {
|
|||||||
int socket_recv;
|
int socket_recv;
|
||||||
int accept_recv;
|
int accept_recv;
|
||||||
int accept_temp;
|
int accept_temp;
|
||||||
unsigned char buff[1024];
|
|
||||||
char msg[1024] = "Puste";
|
char msg[1024] = "Puste";
|
||||||
char msg_copy[1024];
|
char msg_copy[1024];
|
||||||
struct client_socket client[7]; //Tablica Klientów
|
struct client_socket client[7]; //Tablica Klientów
|
||||||
@ -137,9 +136,6 @@ int main(void) {
|
|||||||
printf("Error: Listen Pliki \n");
|
printf("Error: Listen Pliki \n");
|
||||||
}
|
}
|
||||||
printf("Zaczynam Nasłuchiwanie...\n");
|
printf("Zaczynam Nasłuchiwanie...\n");
|
||||||
|
|
||||||
printf("Bazowy na %s:%d\n", inet_ntoa(recv_adr.sin_addr), ntohs(recv_adr.sin_port)); //DODALEM KUBA
|
|
||||||
|
|
||||||
//NASŁUCHIWANIE KLIENTÓW
|
//NASŁUCHIWANIE KLIENTÓW
|
||||||
while (1) {
|
while (1) {
|
||||||
timeout.tv_sec = 1;
|
timeout.tv_sec = 1;
|
||||||
@ -171,7 +167,7 @@ int main(void) {
|
|||||||
client[i].accept_adr = accept_temp_adr;
|
client[i].accept_adr = accept_temp_adr;
|
||||||
FD_SET(client[i].socket, &client[i].Client);
|
FD_SET(client[i].socket, &client[i].Client);
|
||||||
printf("Dodano użytkownika %s na miejscu %i\n", inet_ntoa(client[i].accept_adr.sin_addr), i);
|
printf("Dodano użytkownika %s na miejscu %i\n", inet_ntoa(client[i].accept_adr.sin_addr), i);
|
||||||
strcpy(client[i].Ip, inet_ntoa(client[i].accept_adr.sin_addr));
|
//strcpy(client[i].Ip, inet_ntoa(client[i].accept_adr.sin_addr));
|
||||||
i++;
|
i++;
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
@ -189,8 +185,6 @@ int main(void) {
|
|||||||
if(select(socket_recv+1, &Recv, NULL, NULL, &timeout) > 0) {
|
if(select(socket_recv+1, &Recv, NULL, NULL, &timeout) > 0) {
|
||||||
printf("Wykryto wiadomosc\n");
|
printf("Wykryto wiadomosc\n");
|
||||||
accept_recv = accept(socket_recv, (struct sockaddr*)&recv_adr, &dl);
|
accept_recv = accept(socket_recv, (struct sockaddr*)&recv_adr, &dl);
|
||||||
memset(msg, 0, 1024);
|
|
||||||
memset(msg_copy, 0, 1024);
|
|
||||||
if(recv(accept_recv, msg, 1024, 0) > 0) {
|
if(recv(accept_recv, msg, 1024, 0) > 0) {
|
||||||
//Sklonuj msg i tokenizuj trzy pierwsze słowa (1.user> 2.Down/upload 3.Sciezka do pliku)
|
//Sklonuj msg i tokenizuj trzy pierwsze słowa (1.user> 2.Down/upload 3.Sciezka do pliku)
|
||||||
printf("Zaczynam Kopiowac\n");
|
printf("Zaczynam Kopiowac\n");
|
||||||
@ -221,7 +215,6 @@ int main(void) {
|
|||||||
if(strcmp(client[i].Ip, inet_ntoa(recv_adr.sin_addr)) == 0) {
|
if(strcmp(client[i].Ip, inet_ntoa(recv_adr.sin_addr)) == 0) {
|
||||||
printf("Użytkownik %i wyszedł\n", i);
|
printf("Użytkownik %i wyszedł\n", i);
|
||||||
close(client[i].socket);
|
close(client[i].socket);
|
||||||
client[i].socket = 0;
|
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
@ -241,15 +234,12 @@ int main(void) {
|
|||||||
wielkosc = htonl(wielkosc);
|
wielkosc = htonl(wielkosc);
|
||||||
send(pliki_accept, &wielkosc, sizeof(long), 0);
|
send(pliki_accept, &wielkosc, sizeof(long), 0);
|
||||||
} else {
|
} else {
|
||||||
wielkosc = (long) file_info.st_size; //wielkosc = htonl((long) file_info.st_size); KUBA
|
wielkosc = htonl((long) file_info.st_size);
|
||||||
memset(msg, 0, 1024); //DODANE KUBA
|
send(pliki_accept, &wielkosc, sizeof(long), 0);
|
||||||
snprintf(msg, 1024, "%li", wielkosc); //DODALEM KUBA
|
wielkosc = file_info.st_size;
|
||||||
send(pliki_accept, &msg, sizeof(long), 0); //KUBA
|
|
||||||
// wielkosc = file_info.st_size; USUNIETE KUBA
|
|
||||||
plik = fopen(token3, "rb");
|
plik = fopen(token3, "rb");
|
||||||
razem = 0;
|
razem = 0;
|
||||||
while(razem < wielkosc) {
|
while(razem < wielkosc) {
|
||||||
memset(msg, 0, 1024);
|
|
||||||
read_plik = fread(msg, 1, 1024, plik);
|
read_plik = fread(msg, 1, 1024, plik);
|
||||||
send_plik = send(pliki_accept, msg, read_plik, 0);
|
send_plik = send(pliki_accept, msg, read_plik, 0);
|
||||||
if (read_plik != send_plik) {
|
if (read_plik != send_plik) {
|
||||||
@ -282,20 +272,18 @@ int main(void) {
|
|||||||
pliki_accept = accept(pliki_socket, (struct sockaddr*)&pliki_adr, &dl);
|
pliki_accept = accept(pliki_socket, (struct sockaddr*)&pliki_adr, &dl);
|
||||||
if(token3 != NULL && token4 != NULL) {
|
if(token3 != NULL && token4 != NULL) {
|
||||||
//recv(pliki_socket, &wielkosc, sizeof(long), 0);
|
//recv(pliki_socket, &wielkosc, sizeof(long), 0);
|
||||||
char *eptr; //KUBA
|
wielkosc = (long) token4;
|
||||||
wielkosc = strtol(token4, &eptr, 10); //wielkosc = (long) token4; KUBA
|
if(wielkosc = ntohl(wielkosc) <= 0) {
|
||||||
if(wielkosc <= 0) { //if(wielkosc = ntohl(wielkosc) <= 0) { KUBA
|
|
||||||
printf("Błąd pobierania\n");
|
printf("Błąd pobierania\n");
|
||||||
} else {
|
} else {
|
||||||
razem = 0;
|
razem = 0;
|
||||||
plik = fopen(token3, "wb");
|
plik = fopen(token3, "wb");
|
||||||
while(razem < wielkosc) {
|
while(razem < wielkosc) {
|
||||||
memset(msg, 0, 1024);
|
read_plik = recv(pliki_socket, msg, 1024, 0);
|
||||||
read_plik = recv(pliki_accept, msg, 1024, 0); //read_plik = recv(pliki_socket, msg, 1024, 0); KUBA
|
|
||||||
if(read_plik < 0) {
|
if(read_plik < 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
fwrite(msg, 1, read_plik, plik);
|
fwrite(msg, 1, 1024, plik);
|
||||||
razem += read_plik;
|
razem += read_plik;
|
||||||
}
|
}
|
||||||
fclose(plik);
|
fclose(plik);
|
@ -1,77 +0,0 @@
|
|||||||
#include <sys/types.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
int main(void) {
|
|
||||||
char bufor[1024], rBufor[1024], tBufor[1024]; //wiadomosc
|
|
||||||
int gniazdo, gniazdo2, rGniazdo, tGniazdo;
|
|
||||||
struct sockaddr_in adr, rNadawca, tNadawca, adrS;
|
|
||||||
socklen_t dl = sizeof(struct sockaddr_in);
|
|
||||||
gniazdo = socket(PF_INET, SOCK_STREAM, 0);
|
|
||||||
gniazdo2 = socket(PF_INET, SOCK_STREAM, 0);
|
|
||||||
|
|
||||||
//adres do odbierania widomosci od klienta
|
|
||||||
adr.sin_family = AF_INET;
|
|
||||||
adr.sin_port = htons(44444); //port
|
|
||||||
adr.sin_addr.s_addr = INADDR_ANY;
|
|
||||||
|
|
||||||
//adres do wysylania widomosci do klienta
|
|
||||||
adrS.sin_family = AF_INET;
|
|
||||||
adrS.sin_port = htons(44445); //port
|
|
||||||
adrS.sin_addr.s_addr = INADDR_ANY;
|
|
||||||
|
|
||||||
printf("Odbieram na %s:%d\n", inet_ntoa(adr.sin_addr), ntohs(adr.sin_port));
|
|
||||||
printf("Wysylam na %s:%d\n", inet_ntoa(adrS.sin_addr), ntohs(adrS.sin_port));
|
|
||||||
|
|
||||||
//konfiguracja do odbierania wiadomosci
|
|
||||||
if (bind(gniazdo, (struct sockaddr*) &adr, sizeof(adr)) < 0) { //bind
|
|
||||||
printf("Bind nie powiodl sie.\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (listen(gniazdo, 10) < 0) { //listen
|
|
||||||
printf("Listen nie powiodl sie.\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
//konfiguracja do wysylania wiadomosci
|
|
||||||
if (bind(gniazdo2, (struct sockaddr*) &adrS, sizeof(adrS)) < 0) { //bind
|
|
||||||
printf("Bind nie powiodl sie.\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (listen(gniazdo2, 10) < 0) { //listen
|
|
||||||
printf("Listen nie powiodl sie.\n");
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
printf("Polaczenia skonfigurowane ...\n");
|
|
||||||
|
|
||||||
if (fork() == 0){ //child wejdzie w to TUTAJ WYSYLAM WIDOMOSCI co 5 sekund
|
|
||||||
while ((tGniazdo = accept(gniazdo2, (struct sockaddr*) &tNadawca, &dl)) > 0) {
|
|
||||||
int licznik = 1;
|
|
||||||
while(1){
|
|
||||||
memset(tBufor, 0, 1024);
|
|
||||||
tBufor[1] = licznik + '0';
|
|
||||||
printf("Wysylam licznik\n");
|
|
||||||
send(tGniazdo, tBufor, 1024, 0);
|
|
||||||
licznik += 1;
|
|
||||||
sleep(3);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else { //tutaj odbieram wiadomosci
|
|
||||||
while ((rGniazdo = accept(gniazdo, (struct sockaddr*) &rNadawca, &dl)) > 0) { //odbieranie
|
|
||||||
memset(rBufor, 0, 1024);
|
|
||||||
recv(rGniazdo, rBufor, 1024, 0);
|
|
||||||
printf("Wiadomosc od %s: %s\n", inet_ntoa(rNadawca.sin_addr), rBufor);
|
|
||||||
close(rGniazdo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//do tego w sumie nigdy nie dojdziemy
|
|
||||||
close(gniazdo2);
|
|
||||||
close(gniazdo);
|
|
||||||
return 0;
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user