socket 模式Word格式文档下载.docx

上传人:b****6 文档编号:19078189 上传时间:2023-01-03 格式:DOCX 页数:11 大小:17.93KB
下载 相关 举报
socket 模式Word格式文档下载.docx_第1页
第1页 / 共11页
socket 模式Word格式文档下载.docx_第2页
第2页 / 共11页
socket 模式Word格式文档下载.docx_第3页
第3页 / 共11页
socket 模式Word格式文档下载.docx_第4页
第4页 / 共11页
socket 模式Word格式文档下载.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

socket 模式Word格式文档下载.docx

《socket 模式Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《socket 模式Word格式文档下载.docx(11页珍藏版)》请在冰豆网上搜索。

socket 模式Word格式文档下载.docx

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=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1