基于TCP的socket编程
socket函数
connect 函数
TCP客户用connect函数来建立TCP服务器的连接
bind函数
bind函数把一个本地地址赋予一个套接字
listen函数
listen函数仅由TCP服务器调用,它做两件事
当socket函数创建一个套接字时,它被假设为一个主动套接字,listen函数把一个未连接的套接字转换成一个被动套接字。
本函数第二个参数规定了内核应该为相应的套接字排队的最大连接个数。
int listen(int sockfd,int backlog);
accept函数
accept函数由TCP服务器调用,用于从已完成连接队列队头返回下一个已完成连接。如果完成连接队列为空,那么进程被投入睡眠。
int accept(int sockfd, struct sockaddr *cliaddr,socklen_t *addrlen);
addrlen是值-结果参数。
本函数最多返回三个值;一个即可能是新套接字描述符也可能是出错指示的整数,客户进程的协议地址以及该地址的大小。
fork函数和exec函数
pid_t fork(void);返回在子进程为0,在父进程中为子进程的ID 出错返回-1
fork调用一次,它却返回两次。它在调用父进程中返回一次,返回值是新派生进程的进程ID号。在子进程又返回一次,返回值为0;子进程可以调用getppid取得父进程的ID。如果父进程想要跟踪所有子进程的进程ID,那么它必须记录每次调用fork的返回值。
父进程中调用fork之前打开的所有描述符在fork返回之后由子进程分享
fork的两个典型用法
1.一个进程创建一个自身的副本,每个副本都可以在另一个副本执行其他任务的同时处理各自的某个操作。
2. 一个进程想要执行另一个程序,首先调用fork创建一个自身的副本,然后其中一个副本调用exec把自身替换成新的程序。
close函数
close函数也用来关闭套接字,并终止TCP连接
int close(int sockfd);
getsockname和getpeername函数
这两个函数的最后一个参数都是值-结果参数,
获取套接字的地址族
所有的客户和服务器都从调用socket开始,它返回一个套接字描述符。客户随后调用connest,服务器则调用bind,listen和accept。套接字通常使用标准close函数关闭。