socket 模式Word格式文档下载.docx
《socket 模式Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《socket 模式Word格式文档下载.docx(11页珍藏版)》请在冰豆网上搜索。
8.
9.#include
sys/types.h>
10.#include
sys/stat.h>
11.#include
fcntl.h>
#defineSERVPORT8080
#defineMAXDATASIZE100
#defineTFILE"
data_from_socket.txt"
intmain(intargc,char*argv[])
{
intsockfd,recvbytes;
charrcv_buf[MAXDATASIZE];
/*./client127.0.0.1hello*/
charsnd_buf[MAXDATASIZE];
structhostent*host;
/*structhostent
*{
*char*h_name;
//generalhostname
*char**h_aliases;
//hostname'
salias
*inth_addrtype;
//AF_INET
*inth_length;
*char**h_addr_list;
*};
structsockaddr_inserver_addr;
/**/
fd_setreadset,writeset;
intcheck_timeval=1;
structtimevaltimeout={check_timeval,0};
//阻塞式select,等待1秒,1秒轮询
intmaxfd;
intfp;
intcir_count=0;
intret;
if(argc<
3)
{
printf("
Usage:
%s[ipaddress][anystring]\n"
argv[0]);
return1;
}
*snd_buf='
\0'
;
strcat(snd_buf,argv[2]);
if((fp=open(TFILE,O_WRONLY))<
0)
//不是用fopen
perror("
fopen:
"
);
exit
(1);
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
socket:
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(SERVPORT);
inet_pton(AF_INET,argv[1],&
server_addr.sin_addr);
memset(&
(server_addr.sin_zero),0,8);
/*createtheconnectionbysocket
*meansthatconnect"
sockfd"
to"
server_addr"
if(connect(sockfd,(structsockaddr*)&
server_addr,sizeof(structsockaddr))==-1)
connect"
/**/
if(send(sockfd,snd_buf,sizeof(snd_buf),0)==-1)
send:
%s\n"
snd_buf);
while
(1)
FD_ZERO(&
readset);
//每次循环都要清空集合,否则不能检测描述符变化
FD_SET(sockfd,&
//添加描述符
writeset);
FD_SET(fp,
&
maxfd=sockfd>
fp?
(sockfd+1):
(fp+1);
//描述符最大值加1
ret=select(maxfd,&
readset,NULL,NULL,NULL);
//阻塞模式
switch(ret)
case-1:
exit(-1);
break;
case0:
default:
if(FD_ISSET(sockfd,&
readset))
//测试sock是否可读,即是否网络上有数据
recvbytes=recv(sockfd,rcv_buf,MAXDATASIZE,MSG_DONTWAIT);
rcv_buf[recvbytes]='
recv:
rcv_buf);
if(FD_ISSET(fp,&
writeset))
write(fp,rcv_buf,strlen(rcv_buf));
//不是用fwrite
gotoend;
cir_count++;
CNT:
%d\n"
cir_count);
end:
close(fp);
close(sockfd);
return0;
}
perl实现:
#!
/usr/bin/perl
###############################################################################
#\File
#
tcp_client.pl
#\Descript
sendmessagetoserver
useIO:
:
Socket;
Select;
#hashtoinstallIPPort
%srv_info=(
#"
srv_ip"
=>
"
61.184.93.197"
192.168.1.73"
srv_port"
8080"
);
my$srv_addr=$srv_info{"
};
my$srv_port=$srv_info{"
my$sock=IO:
Socket:
INET->
new(
PeerAddr=>
$srv_addr"
PeerPort=>
$srv_port"
Type
=>
SOCK_STREAM,
Blocking=>
1,
Timeout
5,
Proto
tcp"
)
ordie"
Cannotcreatesocketconnect.$@"
$sock->
send("
Helloserver!
\n"
0)orwarn"
sendfailed:
$!
$@"
autoflush
(1);
my$sel=IO:
Select->
new($sock);
while(my@ready=$sel->
can_read)
foreachmy$fh(@ready)
if($fh==$sock)
while()
print$_;
$sel->
remove($fh);
close$fh;
close();
四、异步非阻塞模式
最后,异步非阻塞I/O模型是一种处理与I/O重叠(并行)进行的模型。
以read系统调用为例
steps:
a.调用read;
b.read请求会立即返回,说明请求已经成功发起了。
c.在后台完成读操作这段时间内,应用程序可以执行其他处理操作。
d.当read的响应到达时,就会产生一个信号或执行一个基于线程的回调函数来完成这次I/O处理过程。
readset,NULL,NULL,
&
timeout);
//非阻塞模式
timeout.tv_sec=check_timeval;
//必须重新设置,因为超时时间到后会将其置零
五、server端程序:
*tcpserver
netinet/in.h>
arpa/inet.h>
#defineBACKLOG10//maxnumbefofclientconnection
intmain(charargc,char*argv[])
intsockfd,client_fd,addr_size,recvbytes;
charrcv_buf[MAXDATASIZE],snd_buf[MAXDATASIZE];
char*val;
structsockaddr_inclient_addr;
intbReuseaddr=1;
charIPdotdec[20];
/*createanewsocketandregiterittoos.
*SOCK_STREAMmeansthatsupplytcpservice,
*andmustconnect()beforedatatransfort.
/*settingserver'
ssocket*/
//IPv4networkprotocol
server_addr.sin_addr.s_addr=INADDR_ANY;
//autoIPdetect
(server_addr.sin_zero),0,8);
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,(constchar*)&
bReuseaddr,sizeof(int));
if(bind(sockfd,(structsockaddr*)&
server_addr,sizeof(structsockaddr))==-1)
bind:
/*
*wattingforconnection,
*andserverpermittorecivetherequestionfromsockfd
if(listen(sockfd,BACKLOG)==-1)//BACKLOGassignthdmaxnumberofconnection
listen:
}
while
(1)
{
addr_size=