[ 永远的UNIX::UNIX技术资料的宝库 ]

首页 > 编程技术 > 网络编程 > 正文
基本TCP套接口编程二
本文出自:http://sunsland.top263.net 作者: (2001-10-22 15:00:01)


并发服务器

迭代服务器 iterative server 单进程

并发服务器 concurrent server 多进程

当连接建立时,accept返回,服务器调用fork

子进程为客户提供服务(通过connfd已连接套接口),

父进程等待另一个连接(通过listenfd监听套接口)。

子进程开始处理新客户后,父进程便关闭已连接套接口。

accept 返回前/后客户-服务器的状态

fork返回后客户-服务器的状态

父子进程关闭相应套接口后客户-服务器状态

父进程connfd的close不会终止它与客户的连接:

每个文件或套接口都有一个访问计数,该访问计数在文件表项中维护,它表示当前指

向该文件或套接口的打开的描述字个数。

从sock返回后,与listenfd关联的文件表项访问计数值为1,

从accept返回后,与connfd关联的文件表项访问计数值也为1。

当fork返回后,两个描述字在父进程与子进程间共享(duplicated)与两个套接门相关

联的文件表项访问计数值均为2。

当父进程关闭connfd时,只是将访问计数值从2减为1。描述字只在访问计数值达到0时

才真正关闭,这在后面某个时候子进程关闭connfd时会碰上.


close 函数

功能:将套接口做上“已关闭的标记”,并立即返回进程。

将套接口描述字的访问计数器减1。

当访问计数器值为0时,引发TCP的四个分组连接终止序列,从而关闭套接口。

定义:
#include <sys/unistd.h>
int close(int sockfd);


getsockname 和 getpeername函数

功能:

getsockname: 返回本地协议地址

getpeername:返回远程协议地址

定义:

#include <sys/unistd.h>

int getsockname (int sockfd, struct sockaddr *localaddr, int *addrlen);
int getpeername(int sockfd, struct sockaddr *peeraddr, int *addrlen);


一个示例程序:

#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#define MYPORT 3490 /* the port users will be connecting to */
#define BACKLOG 10 /* how many pending connections queue will hold */
main()
{
int sockfd, new_fd; /* listen on sock_fd, new connection on new_fd */
struct sockaddr_in my_addr; /* my address information */
struct sockaddr_in their_addr; /* connector's address information */
int sin_size;
sockfd = socket(AF_INET, SOCK_STREAM, 0); /* do some error checking! */
my_addr.sin_family = AF_INET; /* host byte order */
my_addr.sin_port = htons(MYPORT); /* short, network byte order */
my_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with my IP */
bzero(&(my_addr.sin_zero), 8); /* zero the rest of the struct */
/* don't forget your error checking for these calls: */
bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));
listen(sockfd, BACKLOG);
sin_size = sizeof(struct sockaddr_in);
new_fd = accept(sockfd, &their_addr, &sin_size);
. . . . . . . . . . . . .


(http://www.fanqiang.com)
    进入【UNIX论坛

相关文章
基本UDP套接口编程 (2001-10-23 10:00:00)
套接口选项 (2001-10-23 09:00:00)
基本TCP套接口编程二 (2001-10-22 15:00:01)
基本TCP套接口编程一 (2001-10-22 12:00:00)
套接口编程基础 (2001-10-22 10:00:00)
UNIX的套接口(Socket)编程简介 (2001-04-19 12:48:30)
 

★  樊强制作 欢迎分享  ★