Wielowątkowy dostęp do gniazda

0

Cześć
Chciałbym dowiedzieć się czy operacje zapisu i odczytu z gniazda są bezpieczne jeśli każda z nich wykonuje się w osobnym wątku.
W dużym uproszczeniu chcę zrobić coś takiego:
Wątek 1: wątek z funkcją main() w nim otwieram gniazdo i tworzę 2 nowe wątki
Wątek 2: tutaj odbywa się wyłącznie zapis do gniazda (wysyłanie danych) jedną z funkcji sendto(), write() itp.
Wątek 3: tutaj wyłącznie odbieranie danych z sieci recvfrom(), read() itp.

Po wymianie danych program kończy wątki 2 i 3. Następnie wątek 1 zamyka gniazdo.
Jak wyglądają takie operacje dla gniazd TCP i UDP?
Czy sposób działania jest różny w windowsie i linuxie?

Szukając informacji w internecie znalazłem coś takiego:
https://groups.google.com/forum/#!topic/comp.os.linux.networking/cLbMGRNw8EA

Padła tutaj informacja, że jeśli gniazdo pracuje w duplexie to będzie wszystko ok, ale jak upewnić się programowo że tak rzeczywiście jest (no i czy tak faktycznie jest)
Jeśli ktoś dysponuje linkami do dokumentacji w której jak byk jest napisane, że te operacje są bezpieczne to bardzo proszę o ich podanie

Dzięki

1

Na stacku napisali http://stackoverflow.com/questions/1981372/are-parallel-calls-to-send-recv-on-the-same-socket-valid ,że wołanie send-ów/recv-ów na tym samym sockecie z wielu wątków jest bezpieczne.
Wygląda na to, że trzeba powołać się tutaj na fragmenty "If the message is too long to pass atomically through the underlying protocol, the error EMSGSIZE is returned, and the message is not transmitted. " oraz "The socket type requires that message be sent atomically, and the size of the message to be sent made this impossible."
W takich sytuacjach czasami pomaga zajrzenie w najlepszą dokumentację kernela czyli jego kod :) Wszystkie send/sendmsg/sendto zależenie od protokołu prowadzą do tcp_sendmsg (http://lxr.free-electrons.com/source/net/ipv4/tcp.c#L1067 ) oraz udp_sendmsg (http://lxr.free-electrons.com/source/net/ipv4/udp.c#L876). W obu wypadkach widać wyraźnie (no dobra z tym wyraźnie to żartowałem), że OS nakłada lock-a przez lock_socka. Analogiczna sytuacja wystepuje dla tcp_recvmsg/udp_recvmsg.
Oczywiście wszystko co napisałem tyczy się linuksa. A windowsa to ja mam tylko do witcher-a 3, więc się nie wypowiem.

0

Bardzo Ci dziękuję.
Co do windowsa udało mi się znaleźć to: http://www.codeproject.com/Questions/156575/Socket-Send-receive-simultaneously i tutaj napisali "You can send and receive on the same socket at the same time (via multiple threads). But the send and receive may not actually occur simultaneously, since one operation may block the other from starting until it's done. That is how it's in Winsock." więc można i windzie.
Jako ciekawostkę znalazłem też funkcje do wysyłania i odbierania danych w sposób pokrywający się:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms741688(v=vs.85).aspx

Jeszcze raz bardzo wielkie dzięki :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1