教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 基础教育 >

《计算机通讯与网络》实验讲义(7)

来源:网络收集 时间:2026-08-09
导读: 后的调用send所使用的地址,而connect本身不建立连接。 参数sockf d是Socket描述符,而servaddr则是成为通信信道另一个端点上进程的地址;addrlen是地址结构sockaddr的长度。当连接建立成功后,connect的返回值不小

后的调用send所使用的地址,而connect本身不建立连接。

参数sockf d是Socket描述符,而servaddr则是成为通信信道另一个端点上进程的地址;addrlen是地址结构sockaddr的长度。当连接建立成功后,connect的返回值不小于0,否则返回出错信息。

4.listen()调用:

int listen(sockf d,queuelen) int sockf d queuelen;

当server方进程准备在一条通信信息上接受连接时,系统必须将到来的连接请求送入队列,直到进程来为该请求服务。listen调用是指明所能接收的连接请求的最大数目,也就是队列的最大长度queuelen参数指出了待处理请求的最大数目sockfd是描述符。

5.accept()调用:

newsockfd== accept(sockfd clieaddr addrlen); int sockfd newsockfd;

struct sockaddr *clieaddr; int *addrlen;

该调用取队列上的第一个连接请求,并建立一个与描述符sockf d具有相询特性的Socket.若没有连接请求,accept阻塞调用者直到有连接请求的到达。

参数sockf d是Socket描述符clieaddr为向server方进程发出连接请求的client方进程地fk ; addrlen为该地址结构的长度。注意,参数clieaddr和addrlen是accept调用返回时,由系统来填人的。

newsockfd是一个与sockfd描述不同的新的Socket描述符;accept调用认为server是并发server,因而不但建立一个新的Socket,而且还指定与newsockf d相联系的新地址。这样server进程一方面可以在与sockf d'相关的地址上继续倾听(listen);另一方面在另一分开的通信信道上(与newsockf d相关的地址)与client进程进行通信。

6.send()和recv()调用:

count== send(sockfd,msg,length,flag); count== recv(sockfd,buf,length,flag); int count,sockf d; char *msg ,*buf; int length flag;

两个调用在一个已连接的socket上发送和接收数据、。参数sockf d为Socket描述符msg是要发送数据的缓冲区length是它的长度buf则是存放到来数据的数组buf也有一个指出其长度的参数length.

如果没有参数flag,上述两个调用的语法及语义与write和read就没有什么不同了。flag使这两个调用有了一些新特性。flag= 0 Of-;表示正常的数据发送或接收;flag =MSG _ OOB时,表示发送或接收带外数据(一种非常规的紧急数据)flag = MSG- PEEK时,表示在接收端上可以“偷看”一个到来的报文,检查它的内容但并不把它从队列中移去;当flag = MSGDON- ROUTE时,表示可以在没有网络路由选择的情况下发送数据。

count是调用的返回值,它以发送或接收的实际数据长度作为自己的内容。

7.send to ( )和recvf rom()调用:

- 19 -

count=sendto(sockfd,msg,length,toaddr,addrlen);

count== recvf rom(sockfd,buf,length,fromaddr,&.addrlen); int count,sockf d; char *msg ,*buf;

struct sockadd,toaddr,*fromaddr;- int length,addrlen;

两调用常用于非连接通信中的发送和接收数据,其返回值以及前三个参数与send和recv调用的参数和返回值含义一样。

参数toaddr指出了发送到目的地的进程地址addrlen是该地址的长度;参数fromaddr是发送数据的进程的地址,它也使用一个整数addrlen来指出长度。

8.close ( )和shutdown()调用: int close (int sockf d );、·

int shutdown (int sockf d , int mode); close调用关闭一套接字,并释放该Socket的描述符shutdown调用关闭一套接字连接,但该Socket描述符仍旧原封不动。

mode为1,指示不允许发送方发送数据;mode为0,表示不允许接收方接收数据;而mode为2,则表示发送和接受数据皆不允许;参数sockfd是Socket描述符。

附:参考程序(C语言)

# include(sys/Socket.h) # include(netinet/in.h) # include(netdb.h)

server方程序 main() {

int sockfd length;

struct sockaddr_ in name; char buf[1024];

//create Socket from which to read sockfd=Socket(AF_INET,SOCK_DGRAM,0); if(sockfd<0) {

perror(\ exit(1); }

//create name with wildcard name.sin_family=AF_INET;

name.sin_addr.s_addr=INADDR_ANY; name.sin_port=0;

- 20 -

if(bind(Sockfd,(struct sockaddr *)&name size of name)<0> {

perror(\ exit(1); }

//find assigned port value length=sizeof(name);

if(getsock name(sockfd(struct sockaddr *)&name &length) <0> {

perror(\ exit(1); }

printf(\ //Read from the Socket

if(read(sockfd,but,1024)<)0)

perror(\ printf(\); close(sockfd); exit(0); }

#include \

#define DATA \ //The form of the command line is //命令 主机 名端口号 ,/ main(argc,argv) int argc; char *argv[]; {

int sockfd;

struct sockaddr_in name;

struct hostnet *hp,*gethostbyname(); //create Socket on which to send

sockfd=Soeket(AF_INET,SOCK_DGRAM,0); if (Sockfd<0) {

perror(\ exit (1); }

hp=gethostbyname(argv[1]); if (hp==0) {

- 21 -

fprintf(stderr,\ exit(2); }

bcopy((char*)hp->h_addr,(char*)&name.sin_addr.hp->h_ length); name.sin_family=AF_INET;

name.sin_port= htons(atoi(argv[2]); /*send message‘/

if( sendto( sockfd,DATA, sizeof( DATA),0,( struct sockaddr *) & name, sized( name))<0) perror(\close( sockfd); exit(0); }

- 22 -

…… 此处隐藏:704字,全部文档内容请下载后查看。喜欢就下载吧 ……
《计算机通讯与网络》实验讲义(7).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/564044.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)