SOCKET 学习1

来源:互联网 发布:串口监视软件 编辑:程序博客网 时间:2024/05/16 21:05
下面我们就通过实例来学习,套接字的相关知识:


//  该例子的主要功能是:
// 1.客户从标准输入读入一行文本,并写给服务器
//  2.服务器从网络输入读入这行文本,并回射给客户
//  3.客户从网络输入读入这行回射文本,并显示在标准输出上
其服务器端程序如下:


#include"unp.h"
int main(int argc,char **argv)
{
int listened,connfd;
pid_t  childpid;
socklen_t clilen;
struct sockaddr_in  cliaddr,  servaddr;
listenfd=Socket(AF_INET,SOCK_STREAM,0);
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family=AF_INET;
servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
servaddr.sin_port=htons(SERV_PORT);
Bind(listenfd,(SA*)&servaddr,sizeof(servaddr));
Listen(listenfd,LISTENQ);
for( ; ;)
{
clien=sizeof(cliaddr);
connfd=Accept(listenfd,(SA*)&cliaddr,&clilen);
connfd=Accept(listenfd,(SA*)&cliaddr,&clilen);
if((childpid=Fork())==0) 
{
/*child process*/
Close(listenfd);/*close listening socket*/
str_echo(connfd); /*process the request*/
exit(0); 
}
Close(connfd); //  *parent close connected socket*/
}


}




那么,我们该如何理解这个  服务器端程序呢?


请看下面解释:


1.创建套接字,捆绑服务器的众所周知的端口
创建一个TCP套接字,在待捆绑到该TCP套接字的网络套接字地址结构中填入通配地址(INADDR_ANY)和服务器的众所周知端口(SERV_PORT,在头文件unp.h中其值定义为9877)。捆绑通配地址是在告知系统:要是系统是多宿主主机,我们将接受目的地址为任何本地接口的连接。我们对TCP端口号的选择基于图,它应该比1023大,比5000大,比49152小,而且不应该与任何已注册的端口冲突。listen把该套接字转换成一个监听套接字。


2.等待完成客户连接
服务器阻塞与accept调用,等待客户连接完成。


并发服务器
fork为每个客户派生一个处理它们的子进程。子进程关闭监听套接字,父进程关闭已连接套接字。子进程接着调用str_echo处理客户。


str_echo函数执行处理每个客户的服务:从客户读入数据,并把它们回射给客户。


函数如下:


#include  “unp.h”
void str_echo(int sockfd)
{
ssize_t n;
char   buf[MAXLINE];
again:
while((n=read(sockfd,buf,MAXLINE))>0)
Writen(sockfd,buf,n);
if(n<0&&errno==EINTR)
goto again ;
else if (n<0)
err_sys(&str_echo:read error*);

}


功能分析:


read函数从套接字读入数据,writen 函数把其中内容回射给客户,如果客户关闭连接,那么接受到客户的FIN将导致服务器子进程的read函数返回0,这导致str_echo函数的返回,从而终止子进程。


创建套接字,装填忘记网套接字地址结构
创建一个TCP套接字,用服务器的IP地址和端口号装填一个网际套接字地址结构。
我们可以从命令行参数取得服务器的IP地址,从头文件unp.h 取的服务器的众所周知端口(SERV_port)


连接到服务器:


connect 建立与服务器的连接。str_cli 函数完成剩余部分的客户处理工作。




0 0
原创粉丝点击