- Is it ever acceptable just to terminate a program if a network error is detected?
Yes. For some applications terminating on error is the right call. For more substantial applications, the ability to retry and continue on may be needed.
- Which system functions are used to convert error codes into text descriptions?
You can use FormatMessage() on Windows and strerror() on other platforms to obtain error messages.
- How long does it take for a call to connect() to complete on a TCP socket?
A call to connect() typically blocks for at least one network time round trip while the TCP three-way handshake is being completed.
- What happens if you call send() on a disconnected TCP socket?
On Unix-based systems, your program can receive a SIGPIPE signal. It is important to plan for that. Otherwise, send() returns -1.
- How can you ensure that the next call to send() won't block?
Either use select() to make sure the socket is ready for more data or use non-blocking sockets.
- What happens if both peers to a TCP connection try to send a large amount of data simultaneously?
If both sides to a TCP connection are calling send(), but not recv(), then they can be trapped in a deadlocked state. It is important to intersperse calls to send() with calls to recv(). The use of select() can help inform your program about what to do next.
- Can you improve application performance by disabling the Nagle algorithm?
It depends on what your application is doing. For real-time applications using TCP, disabling the Nagle algorithm is often a good trade-off for decreasing latency at the expense of bandwidth efficiency. For other applications, disabling it can decrease throughput, increase network congestion, and even increase latency.
- How many connections can select() handle?
It depends on your platform. It is defined in the FD_SETSIZE macro, which is easily increased on Windows but not on other platforms. Typically, the upper limit is around 1,024 sockets.