Mitä on Socket-ohjelmointi?
Socket-ohjelmointi on tapa yhdistää kaksi verkon solmua kommunikoidakseen keskenään. Yksi socket (solmu) kuuntelee tiettyä porttia IP-osoitteessa, kun taas toinen socket tavoittaa toisen yhteyden muodostamiseksi. Palvelin muodostaa kuuntelijan, kun asiakas tavoittaa palvelimen.
Tilakaavio palvelin- ja asiakasmallille

Tilakaavio Socketin palvelin- ja asiakasmallille
Vaiheet palvelimelle
Palvelin luodaan seuraavilla vaiheilla:
java-esiintymä
1. Socketin luominen
int sockfd = socket(domain, type, protocol)>
- sockfd: socket descriptor, kokonaisluku (kuten tiedostokahva) domain: integer, määrittää viestintäalueen. Käytämme POSIX-standardissa määriteltyä AF_LOCAL-arvoa viestintään samassa isäntäkoneessa olevien prosessien välillä. Käytämme AF_INET:tä ja AF_I NET 6:ta IPV6:n liittämille prosesseille kommunikointiin eri isäntien välillä. tyyppi: viestintätyyppi
SOCK_STREAM: TCP (luotettava, yhteyssuuntautunut)
SOCK_DGRAM: UDP (epäluotettava, yhteydetön) -protokolla: Internet Protocol(IP) -protokollan arvo, joka on 0. Tämä on sama numero, joka näkyy protokollakentässä paketin IP-otsikossa. (Man-protokollat saadaksesi lisätietoja)
2. Setsockopt
Tämä auttaa käsittelemään tiedostokuvaajan sockfd viittaaman socketin vaihtoehtoja. Tämä on täysin valinnainen, mutta se auttaa osoitteen ja portin uudelleenkäytössä. Estää virheitä, kuten: osoite jo käytössä.
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);>
3. Sido
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);>
Socketin luomisen jälkeen sidostoiminto sitoo socketin addr (mukautettu tietorakenne) -kohdassa määritettyyn osoitteeseen ja porttinumeroon. Esimerkkikoodissa sitomme palvelimen localhost-palvelimeen, joten käytämme INADDR_ANY-koodia IP-osoitteen määrittämiseen.
4. Kuuntele
int listen(int sockfd, int backlog);>
Se asettaa palvelinsocketin passiiviseen tilaan, jossa se odottaa asiakkaan lähestyvän palvelinta yhteyden muodostamiseksi. Ruuhka määrittelee enimmäispituuden, johon sockfd:n odottavien yhteyksien jono voi kasvaa. Jos yhteyspyyntö saapuu, kun jono on täynnä, asiakas voi saada virheilmoituksen, jossa lukee ECONNREFUSED.
5. Hyväksy
int new_socket= accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);>
Se purkaa ensimmäisen yhteyspyynnön kuunteluliittimen, sockfd, odottavien yhteyksien jonosta, luo uuden yhdistetyn socketin ja palauttaa uuden tiedostokuvaajan, joka viittaa tähän liitäntään. Tässä vaiheessa yhteys asiakkaan ja palvelimen välille muodostuu ja ne ovat valmiita siirtämään tietoja.
Vaiheet asiakkaalle
1. Pistorasialiitäntä: Täsmälleen sama kuin palvelimen socketin luominen
2. Yhdistä: Connect()-järjestelmäkutsu yhdistää tiedostokuvaajan sockfd viittaaman socketin addr:n määräämään osoitteeseen. Palvelimen osoite ja portti on määritetty osoitteessa.
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);>
Toteutus
Tässä vaihdamme yhden tervehdysviestin palvelimen ja asiakkaan välillä näyttääksemme asiakas/palvelin-mallin.
C Ohjelma palvelimen luomiseksi
Server.c
C
java kartat
// Server side C program to demonstrate Socket> // programming> #include> #include> #include> #include> #include> #include> #define PORT 8080> int> main(>int> argc,>char> const>* argv[])> {> >int> server_fd, new_socket;> >ssize_t valread;> >struct> sockaddr_in address;> >int> opt = 1;> >socklen_t addrlen =>sizeof>(address);> >char> buffer[1024] = { 0 };> >char>* hello =>'Hello from server'>;> >// Creating socket file descriptor> >if> ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) <0) {> >perror>(>'socket failed'>);> >exit>(EXIT_FAILURE);> >}> >// Forcefully attaching socket to the port 8080> >if> (setsockopt(server_fd, SOL_SOCKET,> >SO_REUSEADDR | SO_REUSEPORT, &opt,> >sizeof>(opt))) {> >perror>(>'setsockopt'>);> >exit>(EXIT_FAILURE);> >}> >address.sin_family = AF_INET;> >address.sin_addr.s_addr = INADDR_ANY;> >address.sin_port = htons(PORT);> >// Forcefully attaching socket to the port 8080> >if> (bind(server_fd, (>struct> sockaddr*)&address,> >sizeof>(address))> ><0) {> >perror>(>'bind failed'>);> >exit>(EXIT_FAILURE);> >}> >if> (listen(server_fd, 3) <0) {> >perror>(>'listen'>);> >exit>(EXIT_FAILURE);> >}> >if> ((new_socket> >= accept(server_fd, (>struct> sockaddr*)&address,> >&addrlen))> ><0) {> >perror>(>'accept'>);> >exit>(EXIT_FAILURE);> >}> >valread = read(new_socket, buffer,> >1024 - 1);>// subtract 1 for the null> >// terminator at the end> >printf>(>'%s
'>, buffer);> >send(new_socket, hello,>strlen>(hello), 0);> >printf>(>'Hello message sent
'>);> >// closing the connected socket> >close(new_socket);> >// closing the listening socket> >close(server_fd);> >return> 0;> }> |
>
>
C Ohjelma luoda asiakas
asiakas.c
C
font gimp
// Client side C program to demonstrate Socket> // programming> #include> #include> #include> #include> #include> #define PORT 8080> int> main(>int> argc,>char> const>* argv[])> {> >int> status, valread, client_fd;> >struct> sockaddr_in serv_addr;> >char>* hello =>'Hello from client'>;> >char> buffer[1024] = { 0 };> >if> ((client_fd = socket(AF_INET, SOCK_STREAM, 0)) <0) {> >printf>(>'
Socket creation error
'>);> >return> -1;> >}> >serv_addr.sin_family = AF_INET;> >serv_addr.sin_port = htons(PORT);> >// Convert IPv4 and IPv6 addresses from text to binary> >// form> >if> (inet_pton(AF_INET,>'127.0.0.1'>, &serv_addr.sin_addr)> ><= 0) {> >printf>(> >'
Invalid address/ Address not supported
'>);> >return> -1;> >}> >if> ((status> >= connect(client_fd, (>struct> sockaddr*)&serv_addr,> >sizeof>(serv_addr)))> ><0) {> >printf>(>'
Connection Failed
'>);> >return> -1;> >}> >send(client_fd, hello,>strlen>(hello), 0);> >printf>(>'Hello message sent
'>);> >valread = read(client_fd, buffer,> >1024 - 1);>// subtract 1 for the null> >// terminator at the end> >printf>(>'%s
'>, buffer);> >// closing the connected socket> >close(client_fd);> >return> 0;> }> |
>
>
Lähtö
Client:Hello message sent Hello from server Server:Hello from client Hello message sent>
Kokoaminen
gcc client.c -o client gcc server.c -o server>
Seuraava: Socket-ohjelmointi C/C++:ssa: Useiden asiakkaiden käsitteleminen palvelimella ilman monisäikeistystä