-:|:- Проекты -:|:-
Table of Contents
Programming UNIX Sockets in C - Frequently Asked Questions
Created by Vic Metcalfe, Andrew Gierth and other contributers
May 21, 1998
This is a list of frequently asked questions, with answers about programming TCP/IP applications in unix with the sockets interface.
General Information and Concepts
1.1 What's new?
1.2 About this FAQ
1.3 Who is this FAQ for?
1.4 What are Sockets?
1.5 How do Sockets Work?
1.6 Where can I get source code for the book [book title]?
1.7 Where can I get more information?
Questions regarding both Clients and Servers (TCP/SOCK_STREAM)
2.1 How can I tell when a socket is closed on the other end?
2.2 What's with the second parameter in bind()?
2.3 How do I get the port number for a given service?
2.4 If bind() fails, what should I do with the socket descriptor?
2.5 How do I properly close a socket?
2.6 When should I use shutdown()?
2.7 Please explain the TIME_WAIT state.
2.8 Why does it take so long to detect that the peer died?
2.9 What are the pros/cons of select(), non-blocking I/O and SIGIO?
2.10 Why do I get EPROTO from read()?
2.11 How can I force a socket to send the data in its buffer?
2.12 Where can I get a library for programming sockets?
2.13 How come select says there is data, but read returns zero?
2.14 Whats the difference between select() and poll()?
2.15 How do I send [this] over a socket?
2.16 How do I use TCP_NODELAY?
2.17 What exactly does the Nagle algorithm do?
2.18 What is the difference between read() and recv()?
2.19 I see that send()/write() can generate SIGPIPE. Is there any advantage to handling the signal, rather than just ignoring it and checking for the EPIPE error? Are there any useful parameters passed to the signal catching function?
2.20 After the chroot(), calls to socket() are failing. Why?
2.21 Why do I keep getting EINTR from the socket calls?
2.22 When will my application receive SIGPIPE?
2.23 What are socket exceptions? What is out-of-band data?
2.24 How can I find the full hostname (FQDN) of the system I'm
Writing Client Applications (TCP/SOCK_STREAM)
3.1 How do I convert a string into an internet address?
3.2 How can my client work through a firewall/proxy server?
3.3 Why does connect() succeed even before my server did an accept()?
3.4 Why do I sometimes lose a server's address when using more than one server?
3.5 How can I set the timeout for the connect() system call?
3.6 Should I bind() a port number in my client program, or let the
3.7 Why do I get "connection refused" when the server isn't running?
3.8 What does one do when one does not know how much information is comming
Writing Server Applications (TCP/SOCK_STREAM)
4.1 How come I get "address already in use" from bind()?
4.2 Why don't my sockets close?
4.3 How can I make my server a daemon?
4.4 How can I listen on more than one port at a time?
4.5 What exactly does SO_REUSEADDR do?
4.6 What exactly does SO_LINGER do?
4.7 What exactly does SO_KEEPALIVE do?
4.8 How can I bind() to a port number < 1024?
4.9 How do I get my server to find out the client's address / hostname?
4.10 How should I choose a port number for my server?
4.11 What is the difference between SO_REUSEADDR and SO_REUSEPORT?
4.12 How can I write a multi-homed server?
4.13 How can I read only one character at a time?
4.14 I'm trying to exec() a program from my server, and attach my socket's IO to it, but I'm not getting all the data across. Why?
Writing UDP/SOCK_DGRAM applications
5.1 When should I use UDP instead of TCP?
5.2 What is the difference between "connected" and "unconnected" sockets?
5.3 Does doing a connect() call affect the receive behaviour
5.4 How can I read ICMP errors from "connected" UDP sockets?
5.5 How can I be sure that a UDP message is received?
5.6 How can I be sure that UDP messages are received in order?
5.7 How often should I re-transmit un-acknowleged messages?
5.8 How come only the first part of my datagram is getting through?
5.9 Why does the socket's buffer fill up sooner than expected?
Advanced Socket Programming
6.1 How would I put my socket in non-blocking mode?
6.2 How can I put a timeout on connect()?
Sample Source Code
Table of Contents