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
|
||||
|
||||
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:
|
||||
usunac guzik File
|
||||
|
||||
/DOWNLOAD nazwapliku ->polecenie
|
||||
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
|
||||
* polaczenie od wielu klientow
|
||||
* odbieranie duzych plikow
|
||||
* przekazywanie wiadomosci do klienta
|
||||
|
Binary file not shown.
@ -24,53 +24,51 @@
|
||||
<version>4.11</version>
|
||||
<scope>test</scope>
|
||||
</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>
|
||||
|
||||
<build>
|
||||
<finalName>${project.artifactId}-${project.version}</finalName>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-assembly-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<phase>package</phase>
|
||||
<goals>
|
||||
<goal>single</goal>
|
||||
</goals>
|
||||
<configuration>
|
||||
<attach>false</attach>
|
||||
<appendAssemblyId>false</appendAssemblyId>
|
||||
<archive>
|
||||
<manifest>
|
||||
<mainClass>
|
||||
Projekt.App
|
||||
</mainClass>
|
||||
</manifest>
|
||||
</archive>
|
||||
<descriptorRefs>
|
||||
<descriptorRef>jar-with-dependencies</descriptorRef>
|
||||
</descriptorRefs>
|
||||
</configuration>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
|
||||
<plugins>
|
||||
<!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
|
||||
<plugin>
|
||||
<artifactId>maven-clean-plugin</artifactId>
|
||||
<version>3.1.0</version>
|
||||
</plugin>
|
||||
<!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
|
||||
<plugin>
|
||||
<artifactId>maven-resources-plugin</artifactId>
|
||||
<version>3.0.2</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.8.0</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>2.22.1</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-jar-plugin</artifactId>
|
||||
<version>3.0.2</version>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-install-plugin</artifactId>
|
||||
<version>2.5.2</version>
|
||||
</plugin>
|
||||
<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>
|
||||
|
||||
|
||||
</project>
|
||||
|
@ -1,201 +1,41 @@
|
||||
package Projekt;
|
||||
|
||||
import javax.swing.DefaultListModel;
|
||||
import javax.swing.JButton;
|
||||
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;
|
||||
}
|
||||
};
|
||||
import java.io.*;
|
||||
import java.net.*;
|
||||
|
||||
public class App
|
||||
{
|
||||
public static void main(String[] args) {
|
||||
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
|
||||
frame.setSize(320, 400);
|
||||
ipText = new JTextField("0.0.0.0");
|
||||
ipText.setBounds(10, 10, 200, 30);
|
||||
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();
|
||||
}
|
||||
});
|
||||
try {
|
||||
// USTALAMY adres serwera i port - trzeba wpisac to co wyrzuca po uruchomieniu serwer
|
||||
InetAddress addr = InetAddress.getByName("0.0.0.0");
|
||||
int port = 44444; //Integer.parseInt(args[1]);
|
||||
|
||||
myUserT = new JTextField("Nick");
|
||||
myUserT.setBounds(10, 50, 100, 30);
|
||||
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
|
||||
// utworz gniazdo i od razu podlacz je do addr:port
|
||||
Socket socket = new Socket(addr, port);
|
||||
|
||||
if (toCheckString.substring(0, 5).equals("/FILE")){ //CHYBA OK? wysylanie pliku
|
||||
String fileName = messString.substring(6, messString.length()); //uzyskujemy sciezke do pliku
|
||||
System.out.println(fileName);
|
||||
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?
|
||||
}
|
||||
//strumienie
|
||||
DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); //tu wysylamy wiadomosci
|
||||
DataInputStream dis = new DataInputStream(socket.getInputStream()); //tu bedziemy przyjmowac wiadomosci
|
||||
|
||||
} else if(toCheckString.substring(0, 9).equals("/DOWNLOAD")) { //pobieranie pliku
|
||||
tSocket = new Socket(tAddr, tPort); // laczymy
|
||||
tDos = new DataOutputStream(tSocket.getOutputStream()); // tu wysylamy wiadomosci
|
||||
tDos.write(convert(myUserT.getText() + "> /DOWNLOAD " + messString.substring(10, messString.length()))); //wysylamy prosbe
|
||||
fSocket = new Socket(tAddr, tPort + 2);
|
||||
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");
|
||||
//wiadomosc musimy stworzyc tak zeby miala 1024 bajty - tak zeby pasowala do tablicy charow z serwera!
|
||||
byte[] mess = new byte[1024];
|
||||
String str = "Hello world from java!";
|
||||
mess = str.getBytes(); //konwertujemy na bajty
|
||||
dos.write(mess); //wysylamy
|
||||
|
||||
} 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);
|
||||
frame.add(portText);
|
||||
frame.add(sPane);
|
||||
frame.add(messageT);
|
||||
frame.add(mSendB);
|
||||
frame.add(myUserT);
|
||||
frame.add(connectB);
|
||||
frame.setLayout(null);
|
||||
frame.setVisible(true);
|
||||
// czytaj odpowiedz to jest kod golinskiego
|
||||
//String s = dis.readUTF();
|
||||
// wypisz odpowiedz
|
||||
//System.out.println("Serwer powiedzial: "+s);
|
||||
dis.close();
|
||||
dos.close();
|
||||
socket.close();
|
||||
|
||||
} 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 accept_recv;
|
||||
int accept_temp;
|
||||
unsigned char buff[1024];
|
||||
char msg[1024] = "Puste";
|
||||
char msg_copy[1024];
|
||||
struct client_socket client[7]; //Tablica Klientów
|
||||
@ -137,9 +136,6 @@ int main(void) {
|
||||
printf("Error: Listen Pliki \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
|
||||
while (1) {
|
||||
timeout.tv_sec = 1;
|
||||
@ -171,7 +167,7 @@ int main(void) {
|
||||
client[i].accept_adr = accept_temp_adr;
|
||||
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);
|
||||
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++;
|
||||
break;
|
||||
} else {
|
||||
@ -189,8 +185,6 @@ int main(void) {
|
||||
if(select(socket_recv+1, &Recv, NULL, NULL, &timeout) > 0) {
|
||||
printf("Wykryto wiadomosc\n");
|
||||
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) {
|
||||
//Sklonuj msg i tokenizuj trzy pierwsze słowa (1.user> 2.Down/upload 3.Sciezka do pliku)
|
||||
printf("Zaczynam Kopiowac\n");
|
||||
@ -221,7 +215,6 @@ int main(void) {
|
||||
if(strcmp(client[i].Ip, inet_ntoa(recv_adr.sin_addr)) == 0) {
|
||||
printf("Użytkownik %i wyszedł\n", i);
|
||||
close(client[i].socket);
|
||||
client[i].socket = 0;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
@ -241,15 +234,12 @@ int main(void) {
|
||||
wielkosc = htonl(wielkosc);
|
||||
send(pliki_accept, &wielkosc, sizeof(long), 0);
|
||||
} else {
|
||||
wielkosc = (long) file_info.st_size; //wielkosc = htonl((long) file_info.st_size); KUBA
|
||||
memset(msg, 0, 1024); //DODANE KUBA
|
||||
snprintf(msg, 1024, "%li", wielkosc); //DODALEM KUBA
|
||||
send(pliki_accept, &msg, sizeof(long), 0); //KUBA
|
||||
// wielkosc = file_info.st_size; USUNIETE KUBA
|
||||
wielkosc = htonl((long) file_info.st_size);
|
||||
send(pliki_accept, &wielkosc, sizeof(long), 0);
|
||||
wielkosc = file_info.st_size;
|
||||
plik = fopen(token3, "rb");
|
||||
razem = 0;
|
||||
while(razem < wielkosc) {
|
||||
memset(msg, 0, 1024);
|
||||
read_plik = fread(msg, 1, 1024, plik);
|
||||
send_plik = send(pliki_accept, msg, read_plik, 0);
|
||||
if (read_plik != send_plik) {
|
||||
@ -282,20 +272,18 @@ int main(void) {
|
||||
pliki_accept = accept(pliki_socket, (struct sockaddr*)&pliki_adr, &dl);
|
||||
if(token3 != NULL && token4 != NULL) {
|
||||
//recv(pliki_socket, &wielkosc, sizeof(long), 0);
|
||||
char *eptr; //KUBA
|
||||
wielkosc = strtol(token4, &eptr, 10); //wielkosc = (long) token4; KUBA
|
||||
if(wielkosc <= 0) { //if(wielkosc = ntohl(wielkosc) <= 0) { KUBA
|
||||
wielkosc = (long) token4;
|
||||
if(wielkosc = ntohl(wielkosc) <= 0) {
|
||||
printf("Błąd pobierania\n");
|
||||
} else {
|
||||
razem = 0;
|
||||
plik = fopen(token3, "wb");
|
||||
while(razem < wielkosc) {
|
||||
memset(msg, 0, 1024);
|
||||
read_plik = recv(pliki_accept, msg, 1024, 0); //read_plik = recv(pliki_socket, msg, 1024, 0); KUBA
|
||||
read_plik = recv(pliki_socket, msg, 1024, 0);
|
||||
if(read_plik < 0) {
|
||||
break;
|
||||
}
|
||||
fwrite(msg, 1, read_plik, plik);
|
||||
fwrite(msg, 1, 1024, plik);
|
||||
razem += read_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