在TCP客户和服务器彼此可以通信之前,每一端都应指定连接的套接字对;本地IP地址、本地端口号、外地IP地址、外地端口号。如下图:
外地IP地址和外地端口号必须在客户调用connect时指定。而两个本地值通常都由内核作为connect的一部分来选定。客户也可以在connect之前,通过调用bind来指定其中的一个或全部数值。但做饭并不常见。客户可以在连接建立后调用getsockname获取由内核指定的两个本地值。
本地端口(服务器众所周知端口)由bind指定。bind调用中服务器指定的本地IP地址通常是通配IP地址。如果服务器在一个多宿主机上绑定通配IP地址,那么它可以在连接建立后通过调用getsockname来确定本地IP地址。两个外地值则有accept调用返回给服务器。如果另外一个程序由调用accept的服务器通过调用exec来执行,那么这个新程序可以在必要时调用getpeername来确定客户端的IP地址和端口号。
网络编程时,需要注意的三种情况:
1、当调用fork产生子进程时,必须捕捉SIGCHLD信号。
2、当捕捉信号时,必须处理被中断的系统调用。例如调用accept时,判断在返回值为-1并且errno被设置为EINTR的情况下,要重新启用accept。
3、SIGCHLD的信号处理函数必须正确编写,使用waitpid函数避免留下僵尸进程。