\documentclass[10pt,handout]{beamer}

\usetheme{CambridgeUS}
\usecolortheme{rose}
\usepackage[polish]{babel}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{listings}
\usepackage{wasysym}
\lstset{language=C++,
	basicstyle=\ttfamily,
	keywordstyle=\color{blue}\ttfamily,
	stringstyle=\color{red}\ttfamily,
	commentstyle=\color{magenta}\ttfamily,
}

\title{Sieci, sockety, protokoły, procesy}
\author{Bartosz Szreder}
\date{}

\begin{document}

\frame{\maketitle}

\begin{frame}{Po co?}
	\begin{itemize}
		\pause
		\item Komunikacja pomiędzy procesami na~różnych maszynach.
		\pause
		\item Komunikacja pomiędzy procesami na~jednej maszynie.
	\end{itemize}

	\pause
	Nic nie stoi na~przeszkodzie, żeby pisać programy komunikujące się po socketach nielokalnych (o~rozróżnieniu potem), działające
	na~jednym komputerze. Można w~ten sposób wytestować kod sieciowy w~kontrolowanym środowisku.
	\pause
	\begin{alertblock}{}
		Nie należy jednak robić w~ten sposób testów wydajnościowych czy odpornościowych.
	\end{alertblock}
\end{frame}

\begin{frame}{Jak?}
	\begin{itemize}
		\pause
		\item Synchronicznie czy asynchronicznie?
		\pause
		\item Oszczędnie czy reduntantnie?
		\pause
		\item \textbf{Jak zaprojektować protokół?}
	\end{itemize}
\end{frame}

\begin{frame}{Czym?}
	\begin{itemize}
		\pause
		\item Protokół transportowy: TCP? UDP? Może jeszcze jakiś inny? [trochę ich jest\ldots]
		\pause
		\item Kiedy jaki i~dlaczego?
	\end{itemize}
\end{frame}

\begin{frame}{UDP}
	\begin{itemize}
		\pause
		\item Minimalna nakładka na pakiety IP.
		\pause
		\item Bezpołączeniowy.
		\pause
		\item Brak pewności dostarczenia, brak gwarancji kolejności.
		\pause
		\item Komunikacja w~oparciu o~datagramy.
	\end{itemize}
\end{frame}

\begin{frame}{TCP}
	\begin{itemize}
		\pause
		\item Połączeniowy.
		\pause
		\item Strumieniowy.
		\pause
		\item Gwarancja dostarczenia i~kolejności.
		\pause
		\item Dość sporo logiki dołożonej ponad~IP.
	\end{itemize}
\end{frame}

\begin{frame}
	\begin{itemize}
		\item TCP wygląda świetnie.
		\pause
		\item \ldots nie zawsze go chcemy.
		\pause
		\item \emph{Latency}. Wiele gier FPS używa UDP i~predykcji ruchu.
		\pause
		\item Gry, gdzie nie~jest wymagany znaczący pośpiech, a~kluczowa jest informacja (strategie, niektóre MMORPG) preferują TCP.
		\pause
		\item Na UDP możemy sobie zaimplementować własny mechanizm ,,odporności''.
	\end{itemize}
	\pause
	\begin{block}{Local sockets}
		Do~komunikacji lokalnej możemy używać tzw. lokalnych gniazdek (\texttt{man 7 unix}).
	\end{block}
\end{frame}

\begin{frame}[fragile]
	Na~poziomie systemu gniazdko to~zwykły \emph{file descriptor}:
	\begin{lstlisting}
		int socket_fd = socket(AF_INET, SOCK_STREAM, 0);
		bind(socket_fd,  ...);
		listen(socket_fd, 10); /* backlog */
		int connection_fd = accept(socket_fd, ...);
		...
		close(connection_fd);
	\end{lstlisting}
	\pause
	\texttt{man 2 socket}, \texttt{man 2 listen}, \texttt{man 2 accept}, \texttt{man 2 connect}, \texttt{man 2 send}, \texttt{man 2 recv} \\\ \\
	\pause
	Od biedy zamiast \texttt{recv} i~\texttt{send} można \texttt{read} i~\texttt{write}.
\end{frame}

\begin{frame}[fragile]
	\begin{block}{(A)synchronicznośc}
		Trzeba uważać, żeby nie~zawiesić procesu/wątku w~oczekiwaniu na~komunikację sieciową.
		\begin{itemize}
			\pause
			\item Flaga \texttt{O\_NONBLOCK} na~deskryptorze, flaga \texttt{MSG\_DONTWAIT} w~\texttt{recv}.
			\pause
			\item (De?)multipleksing: \texttt{man 2 select}, ew. \texttt{man 2 poll}, \texttt{man 7 epoll}.
		\end{itemize}
	\end{block}
	\pause
	\ldots{}albo wywalić komunikację do~innego wątku. Wtedy oczywiście trzeba zadbać o~przepchanie danych do~wątku głównego.
\end{frame}

\begin{frame}
	Pewnie już myśleliście, że~nie powiem nic o Qt. \smiley
	\begin{itemize}
		\pause
		\item \texttt{QUdpSocket}, \texttt{QTcpSocket}, \texttt{QSslSocket}, \texttt{QTcpServer}.
		\pause
		\item Mogą działać zarówno synchronicznie (metody \texttt{waitFor*()}) jak i~asynchronicznie (sygnały).
		\pause
		\item Dokumentacja ma świetne przykłady (np. pełny klient BitTorrent, ale też dużo drobniejsze programy), więc podaruję sobie wklejanie.
		\pause
		\item Łatwo połączyć przyjemne z~pożytecznym: wywalamy komunikację do~oddzielnego wątku (\texttt{QThread}), robimy ją~synchronicznie i~przepychamy dane do~wątku głównego sygnałami.
	\end{itemize}
\end{frame}

\end{document}
