⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 基本tcp套接口编程二.txt

📁 学习(编程技巧_编程知识_程序代码),是学习编程不可多得的学习精验
💻 TXT
字号:
基本TCP套接口编程二
 

--------------------------------------------------------------------------------
 
第八军团 时间:2004-1-17 21:35:42 
   

并发服务器
迭代服务器 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);
. . . . . . . . . . . . .
 
 
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -