UNIX网络编程入门2
发信人: beyondfan.bbs@linux.wuhee.edu.cn (叮当), 信区: Linux 标
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
: UNIX网络编程入门之二
发信站: wuhee bbs (Sun Mar 21 05:38:59 1999)
转信站: whbbs!rjgcnews!wuheebbs
四、套接字编程示例
下面给出一个运用字节流套接字在TCP/IP网络上实现客户机/服
务器方式进程通信的实例。
在此例中,服务进程先于客户进程运行,当双方建立连接后,服务 进程通过该连接向客户进程不断发送一个连续增长的序列数,客户进
程每接收到50个序列数就在屏幕上显示一个‘.',显示至20个点后换
行,直至任意一方进程被中断为止。
/******server.c******/
# include
# include
# include
# include
# include
main()
{
int sock,namelen,seq,netint;
struct sockaddr-in server;
//存服务器的internet地址
char msgsock;
char buf[1024];
//创建internet域的TCP
协议
离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载
的字节流套接字 sock=socket(AF-INET,SOCK-STREAM,IPPROTO-TCP);
if(sock<0){
perror("socket");
exit(1);
}
//将本地主机(服务器)的地址捆扎到创建的套接字上 server.sinfamily=AF-INET;
//internet域
sevrer.sinaddr.s-addr=INADDR-ANY; //使用任意合法地址 sevrer.sinport=htons(1032);
//公认的服务端口号
if(bind(sock,&server,sizeof(server))<0){
perror("bind");
exit(2);
}
//建立长度为5的监听队列,从套接字上收听连接请求 if(listen(sock,5)<0){
perror("listen");
exit(3)
}
//阻塞至客户方有连接请求到来,建立一新套接字用于通信
namelen=sizeof(server);
if((msgsock=accept(sock,&server,&namelen))<0){
perror("accept");
exit(4);
}
//此时连接已建立,可以进行通信 seq=0;
for(;;){
netint=htonl(seq);
//主机字节顺序转为网络字节顺序 write(msgsock,&netint,4);
//向客户方写序列数
seq++;
}
}
/******client.c******/
# include
# include
# include
# include
# include
main(argc,argv)
int argc;
char *argv[];
{
int sock,myseq,recvseq;
struct sockaddr-in server;//存服务器的internet地址
struct hostcnt *h;//存主机信息 //命令行必须跟参数:服务器的主机名,该主机
//必须在/etc/hosts文件中定义,例如: // 192.7.100.31 hp486
if(argc!=2){
printf("Usage:%s servername\n",argv[0];
exit(1);
}
//创建internet域TCP协议的字节流套接字
sock=socket(AF-INET,SOCK-STREAM,IPPROTO-TCP);
if(sock<0){
perror("socket");
exit(2);
}
//根据命令行参数提供的服务器主机名,取得服务器的地址
if(!(h=gethostbyname(argv[1]))){
perror(argv[1];
exit(3);
}
bzero(&server,sizeof(server)); //先将服务器地址清0
server.sinfamily=AF-INET;
//internet域
//将取到的主机地址填入服务器的地址 bcopy(h->h-addr,&server.sinaddr,h->length);
server.sinport=htons(1032); //填入公认的服务端口号与服
务进程建立连接
if(connect(sock,&server,sizeof(server))<0){
perror("connect");
exit(4);
}
//此时,连接已建立,可通过对套接字的读/写实现通信
myseq=0;
while(read(sock,&recvseq,4)==4){//读序列数
recvseq=ntohl(recvseq);
//网络字节顺序转换为主机字节顺序 if(myseq!=recvseq){
printf("sented=%d wanted=%d\n",recvseq,myseq);
myseq=recvseq;
}
else
myseq++;
if(!(recvseq%50))
printf(".");
if(!(recvseq%1000))
printf("\n");
}
}
--