forked from AFPy/python-docs-fr
481 lines
20 KiB
Plaintext
481 lines
20 KiB
Plaintext
# Copyright (C) 2001-2018, Python Software Foundation
|
|
# For licence information, see README file.
|
|
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
|
#
|
|
#, fuzzy
|
|
msgid ""
|
|
msgstr ""
|
|
"Project-Id-Version: Python 3.6\n"
|
|
"Report-Msgid-Bugs-To: \n"
|
|
"POT-Creation-Date: 2018-06-10 11:27+0200\n"
|
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
|
"Language: fr\n"
|
|
"MIME-Version: 1.0\n"
|
|
"Content-Type: text/plain; charset=UTF-8\n"
|
|
"Content-Transfer-Encoding: 8bit\n"
|
|
|
|
#: ../Doc/howto/sockets.rst:5
|
|
msgid "Socket Programming HOWTO"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:0
|
|
msgid "Author"
|
|
msgstr "Auteur"
|
|
|
|
#: ../Doc/howto/sockets.rst:7
|
|
msgid "Gordon McMillan"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:None
|
|
msgid "Abstract"
|
|
msgstr "Résumé"
|
|
|
|
#: ../Doc/howto/sockets.rst:12
|
|
msgid ""
|
|
"Sockets are used nearly everywhere, but are one of the most severely "
|
|
"misunderstood technologies around. This is a 10,000 foot overview of "
|
|
"sockets. It's not really a tutorial - you'll still have work to do in "
|
|
"getting things operational. It doesn't cover the fine points (and there are "
|
|
"a lot of them), but I hope it will give you enough background to begin using "
|
|
"them decently."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:20
|
|
msgid "Sockets"
|
|
msgstr "Interfaces de connexion (*sockets*)"
|
|
|
|
#: ../Doc/howto/sockets.rst:22
|
|
msgid ""
|
|
"I'm only going to talk about INET (i.e. IPv4) sockets, but they account for "
|
|
"at least 99% of the sockets in use. And I'll only talk about STREAM (i.e. "
|
|
"TCP) sockets - unless you really know what you're doing (in which case this "
|
|
"HOWTO isn't for you!), you'll get better behavior and performance from a "
|
|
"STREAM socket than anything else. I will try to clear up the mystery of what "
|
|
"a socket is, as well as some hints on how to work with blocking and non-"
|
|
"blocking sockets. But I'll start by talking about blocking sockets. You'll "
|
|
"need to know how they work before dealing with non-blocking sockets."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:31
|
|
msgid ""
|
|
"Part of the trouble with understanding these things is that \"socket\" can "
|
|
"mean a number of subtly different things, depending on context. So first, "
|
|
"let's make a distinction between a \"client\" socket - an endpoint of a "
|
|
"conversation, and a \"server\" socket, which is more like a switchboard "
|
|
"operator. The client application (your browser, for example) uses \"client\" "
|
|
"sockets exclusively; the web server it's talking to uses both \"server\" "
|
|
"sockets and \"client\" sockets."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:40
|
|
msgid "History"
|
|
msgstr "Historique"
|
|
|
|
#: ../Doc/howto/sockets.rst:42
|
|
msgid ""
|
|
"Of the various forms of :abbr:`IPC (Inter Process Communication)`, sockets "
|
|
"are by far the most popular. On any given platform, there are likely to be "
|
|
"other forms of IPC that are faster, but for cross-platform communication, "
|
|
"sockets are about the only game in town."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:47
|
|
msgid ""
|
|
"They were invented in Berkeley as part of the BSD flavor of Unix. They "
|
|
"spread like wildfire with the Internet. With good reason --- the combination "
|
|
"of sockets with INET makes talking to arbitrary machines around the world "
|
|
"unbelievably easy (at least compared to other schemes)."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:54
|
|
msgid "Creating a Socket"
|
|
msgstr "Créer un *socket*"
|
|
|
|
#: ../Doc/howto/sockets.rst:56
|
|
msgid ""
|
|
"Roughly speaking, when you clicked on the link that brought you to this "
|
|
"page, your browser did something like the following::"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:64
|
|
msgid ""
|
|
"When the ``connect`` completes, the socket ``s`` can be used to send in a "
|
|
"request for the text of the page. The same socket will read the reply, and "
|
|
"then be destroyed. That's right, destroyed. Client sockets are normally only "
|
|
"used for one exchange (or a small set of sequential exchanges)."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:70
|
|
msgid ""
|
|
"What happens in the web server is a bit more complex. First, the web server "
|
|
"creates a \"server socket\"::"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:80
|
|
msgid ""
|
|
"A couple things to notice: we used ``socket.gethostname()`` so that the "
|
|
"socket would be visible to the outside world. If we had used ``s."
|
|
"bind(('localhost', 80))`` or ``s.bind(('127.0.0.1', 80))`` we would still "
|
|
"have a \"server\" socket, but one that was only visible within the same "
|
|
"machine. ``s.bind(('', 80))`` specifies that the socket is reachable by any "
|
|
"address the machine happens to have."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:87
|
|
msgid ""
|
|
"A second thing to note: low number ports are usually reserved for \"well "
|
|
"known\" services (HTTP, SNMP etc). If you're playing around, use a nice high "
|
|
"number (4 digits)."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:91
|
|
msgid ""
|
|
"Finally, the argument to ``listen`` tells the socket library that we want it "
|
|
"to queue up as many as 5 connect requests (the normal max) before refusing "
|
|
"outside connections. If the rest of the code is written properly, that "
|
|
"should be plenty."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:95
|
|
msgid ""
|
|
"Now that we have a \"server\" socket, listening on port 80, we can enter the "
|
|
"mainloop of the web server::"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:106
|
|
msgid ""
|
|
"There's actually 3 general ways in which this loop could work - dispatching "
|
|
"a thread to handle ``clientsocket``, create a new process to handle "
|
|
"``clientsocket``, or restructure this app to use non-blocking sockets, and "
|
|
"multiplex between our \"server\" socket and any active ``clientsocket``\\ s "
|
|
"using ``select``. More about that later. The important thing to understand "
|
|
"now is this: this is *all* a \"server\" socket does. It doesn't send any "
|
|
"data. It doesn't receive any data. It just produces \"client\" sockets. Each "
|
|
"``clientsocket`` is created in response to some *other* \"client\" socket "
|
|
"doing a ``connect()`` to the host and port we're bound to. As soon as we've "
|
|
"created that ``clientsocket``, we go back to listening for more connections. "
|
|
"The two \"clients\" are free to chat it up - they are using some dynamically "
|
|
"allocated port which will be recycled when the conversation ends."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:121
|
|
msgid "IPC"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:123
|
|
msgid ""
|
|
"If you need fast IPC between two processes on one machine, you should look "
|
|
"into pipes or shared memory. If you do decide to use AF_INET sockets, bind "
|
|
"the \"server\" socket to ``'localhost'``. On most platforms, this will take "
|
|
"a shortcut around a couple of layers of network code and be quite a bit "
|
|
"faster."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:129
|
|
msgid ""
|
|
"The :mod:`multiprocessing` integrates cross-platform IPC into a higher-level "
|
|
"API."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:134
|
|
msgid "Using a Socket"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:136
|
|
msgid ""
|
|
"The first thing to note, is that the web browser's \"client\" socket and the "
|
|
"web server's \"client\" socket are identical beasts. That is, this is a "
|
|
"\"peer to peer\" conversation. Or to put it another way, *as the designer, "
|
|
"you will have to decide what the rules of etiquette are for a conversation*. "
|
|
"Normally, the ``connect``\\ ing socket starts the conversation, by sending "
|
|
"in a request, or perhaps a signon. But that's a design decision - it's not a "
|
|
"rule of sockets."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:143
|
|
msgid ""
|
|
"Now there are two sets of verbs to use for communication. You can use "
|
|
"``send`` and ``recv``, or you can transform your client socket into a file-"
|
|
"like beast and use ``read`` and ``write``. The latter is the way Java "
|
|
"presents its sockets. I'm not going to talk about it here, except to warn "
|
|
"you that you need to use ``flush`` on sockets. These are buffered \"files\", "
|
|
"and a common mistake is to ``write`` something, and then ``read`` for a "
|
|
"reply. Without a ``flush`` in there, you may wait forever for the reply, "
|
|
"because the request may still be in your output buffer."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:152
|
|
msgid ""
|
|
"Now we come to the major stumbling block of sockets - ``send`` and ``recv`` "
|
|
"operate on the network buffers. They do not necessarily handle all the bytes "
|
|
"you hand them (or expect from them), because their major focus is handling "
|
|
"the network buffers. In general, they return when the associated network "
|
|
"buffers have been filled (``send``) or emptied (``recv``). They then tell "
|
|
"you how many bytes they handled. It is *your* responsibility to call them "
|
|
"again until your message has been completely dealt with."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:160
|
|
msgid ""
|
|
"When a ``recv`` returns 0 bytes, it means the other side has closed (or is "
|
|
"in the process of closing) the connection. You will not receive any more "
|
|
"data on this connection. Ever. You may be able to send data successfully; "
|
|
"I'll talk more about this later."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:165
|
|
msgid ""
|
|
"A protocol like HTTP uses a socket for only one transfer. The client sends a "
|
|
"request, then reads a reply. That's it. The socket is discarded. This means "
|
|
"that a client can detect the end of the reply by receiving 0 bytes."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:169
|
|
msgid ""
|
|
"But if you plan to reuse your socket for further transfers, you need to "
|
|
"realize that *there is no* :abbr:`EOT (End of Transfer)` *on a socket.* I "
|
|
"repeat: if a socket ``send`` or ``recv`` returns after handling 0 bytes, the "
|
|
"connection has been broken. If the connection has *not* been broken, you "
|
|
"may wait on a ``recv`` forever, because the socket will *not* tell you that "
|
|
"there's nothing more to read (for now). Now if you think about that a bit, "
|
|
"you'll come to realize a fundamental truth of sockets: *messages must either "
|
|
"be fixed length* (yuck), *or be delimited* (shrug), *or indicate how long "
|
|
"they are* (much better), *or end by shutting down the connection*. The "
|
|
"choice is entirely yours, (but some ways are righter than others)."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:180
|
|
msgid ""
|
|
"Assuming you don't want to end the connection, the simplest solution is a "
|
|
"fixed length message::"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:217
|
|
msgid ""
|
|
"The sending code here is usable for almost any messaging scheme - in Python "
|
|
"you send strings, and you can use ``len()`` to determine its length (even if "
|
|
"it has embedded ``\\0`` characters). It's mostly the receiving code that "
|
|
"gets more complex. (And in C, it's not much worse, except you can't use "
|
|
"``strlen`` if the message has embedded ``\\0``\\ s.)"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:223
|
|
msgid ""
|
|
"The easiest enhancement is to make the first character of the message an "
|
|
"indicator of message type, and have the type determine the length. Now you "
|
|
"have two ``recv``\\ s - the first to get (at least) that first character so "
|
|
"you can look up the length, and the second in a loop to get the rest. If you "
|
|
"decide to go the delimited route, you'll be receiving in some arbitrary "
|
|
"chunk size, (4096 or 8192 is frequently a good match for network buffer "
|
|
"sizes), and scanning what you've received for a delimiter."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:231
|
|
msgid ""
|
|
"One complication to be aware of: if your conversational protocol allows "
|
|
"multiple messages to be sent back to back (without some kind of reply), and "
|
|
"you pass ``recv`` an arbitrary chunk size, you may end up reading the start "
|
|
"of a following message. You'll need to put that aside and hold onto it, "
|
|
"until it's needed."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:237
|
|
msgid ""
|
|
"Prefixing the message with its length (say, as 5 numeric characters) gets "
|
|
"more complex, because (believe it or not), you may not get all 5 characters "
|
|
"in one ``recv``. In playing around, you'll get away with it; but in high "
|
|
"network loads, your code will very quickly break unless you use two ``recv`` "
|
|
"loops - the first to determine the length, the second to get the data part "
|
|
"of the message. Nasty. This is also when you'll discover that ``send`` does "
|
|
"not always manage to get rid of everything in one pass. And despite having "
|
|
"read this, you will eventually get bit by it!"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:246
|
|
msgid ""
|
|
"In the interests of space, building your character, (and preserving my "
|
|
"competitive position), these enhancements are left as an exercise for the "
|
|
"reader. Lets move on to cleaning up."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:252
|
|
msgid "Binary Data"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:254
|
|
msgid ""
|
|
"It is perfectly possible to send binary data over a socket. The major "
|
|
"problem is that not all machines use the same formats for binary data. For "
|
|
"example, a Motorola chip will represent a 16 bit integer with the value 1 as "
|
|
"the two hex bytes 00 01. Intel and DEC, however, are byte-reversed - that "
|
|
"same 1 is 01 00. Socket libraries have calls for converting 16 and 32 bit "
|
|
"integers - ``ntohl, htonl, ntohs, htons`` where \"n\" means *network* and \"h"
|
|
"\" means *host*, \"s\" means *short* and \"l\" means *long*. Where network "
|
|
"order is host order, these do nothing, but where the machine is byte-"
|
|
"reversed, these swap the bytes around appropriately."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:264
|
|
msgid ""
|
|
"In these days of 32 bit machines, the ascii representation of binary data is "
|
|
"frequently smaller than the binary representation. That's because a "
|
|
"surprising amount of the time, all those longs have the value 0, or maybe 1. "
|
|
"The string \"0\" would be two bytes, while binary is four. Of course, this "
|
|
"doesn't fit well with fixed-length messages. Decisions, decisions."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:272
|
|
msgid "Disconnecting"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:274
|
|
msgid ""
|
|
"Strictly speaking, you're supposed to use ``shutdown`` on a socket before "
|
|
"you ``close`` it. The ``shutdown`` is an advisory to the socket at the "
|
|
"other end. Depending on the argument you pass it, it can mean \"I'm not "
|
|
"going to send anymore, but I'll still listen\", or \"I'm not listening, good "
|
|
"riddance!\". Most socket libraries, however, are so used to programmers "
|
|
"neglecting to use this piece of etiquette that normally a ``close`` is the "
|
|
"same as ``shutdown(); close()``. So in most situations, an explicit "
|
|
"``shutdown`` is not needed."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:282
|
|
msgid ""
|
|
"One way to use ``shutdown`` effectively is in an HTTP-like exchange. The "
|
|
"client sends a request and then does a ``shutdown(1)``. This tells the "
|
|
"server \"This client is done sending, but can still receive.\" The server "
|
|
"can detect \"EOF\" by a receive of 0 bytes. It can assume it has the "
|
|
"complete request. The server sends a reply. If the ``send`` completes "
|
|
"successfully then, indeed, the client was still receiving."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:289
|
|
msgid ""
|
|
"Python takes the automatic shutdown a step further, and says that when a "
|
|
"socket is garbage collected, it will automatically do a ``close`` if it's "
|
|
"needed. But relying on this is a very bad habit. If your socket just "
|
|
"disappears without doing a ``close``, the socket at the other end may hang "
|
|
"indefinitely, thinking you're just being slow. *Please* ``close`` your "
|
|
"sockets when you're done."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:297
|
|
msgid "When Sockets Die"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:299
|
|
msgid ""
|
|
"Probably the worst thing about using blocking sockets is what happens when "
|
|
"the other side comes down hard (without doing a ``close``). Your socket is "
|
|
"likely to hang. TCP is a reliable protocol, and it will wait a long, long "
|
|
"time before giving up on a connection. If you're using threads, the entire "
|
|
"thread is essentially dead. There's not much you can do about it. As long as "
|
|
"you aren't doing something dumb, like holding a lock while doing a blocking "
|
|
"read, the thread isn't really consuming much in the way of resources. Do "
|
|
"*not* try to kill the thread - part of the reason that threads are more "
|
|
"efficient than processes is that they avoid the overhead associated with the "
|
|
"automatic recycling of resources. In other words, if you do manage to kill "
|
|
"the thread, your whole process is likely to be screwed up."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:313
|
|
msgid "Non-blocking Sockets"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:315
|
|
msgid ""
|
|
"If you've understood the preceding, you already know most of what you need "
|
|
"to know about the mechanics of using sockets. You'll still use the same "
|
|
"calls, in much the same ways. It's just that, if you do it right, your app "
|
|
"will be almost inside-out."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:320
|
|
msgid ""
|
|
"In Python, you use ``socket.setblocking(0)`` to make it non-blocking. In C, "
|
|
"it's more complex, (for one thing, you'll need to choose between the BSD "
|
|
"flavor ``O_NONBLOCK`` and the almost indistinguishable Posix flavor "
|
|
"``O_NDELAY``, which is completely different from ``TCP_NODELAY``), but it's "
|
|
"the exact same idea. You do this after creating the socket, but before using "
|
|
"it. (Actually, if you're nuts, you can switch back and forth.)"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:327
|
|
msgid ""
|
|
"The major mechanical difference is that ``send``, ``recv``, ``connect`` and "
|
|
"``accept`` can return without having done anything. You have (of course) a "
|
|
"number of choices. You can check return code and error codes and generally "
|
|
"drive yourself crazy. If you don't believe me, try it sometime. Your app "
|
|
"will grow large, buggy and suck CPU. So let's skip the brain-dead solutions "
|
|
"and do it right."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:334
|
|
msgid "Use ``select``."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:336
|
|
msgid ""
|
|
"In C, coding ``select`` is fairly complex. In Python, it's a piece of cake, "
|
|
"but it's close enough to the C version that if you understand ``select`` in "
|
|
"Python, you'll have little trouble with it in C::"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:347
|
|
msgid ""
|
|
"You pass ``select`` three lists: the first contains all sockets that you "
|
|
"might want to try reading; the second all the sockets you might want to try "
|
|
"writing to, and the last (normally left empty) those that you want to check "
|
|
"for errors. You should note that a socket can go into more than one list. "
|
|
"The ``select`` call is blocking, but you can give it a timeout. This is "
|
|
"generally a sensible thing to do - give it a nice long timeout (say a "
|
|
"minute) unless you have good reason to do otherwise."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:355
|
|
msgid ""
|
|
"In return, you will get three lists. They contain the sockets that are "
|
|
"actually readable, writable and in error. Each of these lists is a subset "
|
|
"(possibly empty) of the corresponding list you passed in."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:359
|
|
msgid ""
|
|
"If a socket is in the output readable list, you can be as-close-to-certain-"
|
|
"as-we-ever-get-in-this-business that a ``recv`` on that socket will return "
|
|
"*something*. Same idea for the writable list. You'll be able to send "
|
|
"*something*. Maybe not all you want to, but *something* is better than "
|
|
"nothing. (Actually, any reasonably healthy socket will return as writable - "
|
|
"it just means outbound network buffer space is available.)"
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:366
|
|
msgid ""
|
|
"If you have a \"server\" socket, put it in the potential_readers list. If it "
|
|
"comes out in the readable list, your ``accept`` will (almost certainly) "
|
|
"work. If you have created a new socket to ``connect`` to someone else, put "
|
|
"it in the potential_writers list. If it shows up in the writable list, you "
|
|
"have a decent chance that it has connected."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:372
|
|
msgid ""
|
|
"Actually, ``select`` can be handy even with blocking sockets. It's one way "
|
|
"of determining whether you will block - the socket returns as readable when "
|
|
"there's something in the buffers. However, this still doesn't help with the "
|
|
"problem of determining whether the other end is done, or just busy with "
|
|
"something else."
|
|
msgstr ""
|
|
|
|
#: ../Doc/howto/sockets.rst:377
|
|
msgid ""
|
|
"**Portability alert**: On Unix, ``select`` works both with the sockets and "
|
|
"files. Don't try this on Windows. On Windows, ``select`` works with sockets "
|
|
"only. Also note that in C, many of the more advanced socket options are done "
|
|
"differently on Windows. In fact, on Windows I usually use threads (which "
|
|
"work very, very well) with my sockets."
|
|
msgstr ""
|