幽默讲解linux的SocketIO模型.doc

  1. 1、本文档共25页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
幽默讲解linux的SocketIO模型

前言之前有看到用很幽默的方式讲解Windows的socket IO模型,借用这个故事,讲解下linux的socket IO模型;老陈有一个在外地工作的女儿,不能经常回来,老陈和她通过信件联系。他们的信会被邮递员投递到他们小区门口的收发室里。这和Socket模型非常类似。下面就以老陈接收信件为例讲解linux的 Socket I/O模型。一、同步阻塞模型老陈的女儿第一次去外地工作,送走她之后,老陈非常的挂心她安全到达没有;于是老陈什么也不干,一直在小区门口收发室里等着她女儿的报平安的信到;这就是linux的同步阻塞模式;在这个模式中,用户空间的应用程序执行一个系统调用,并阻塞,直到系统调用完成为止(数据传输完成或发生错误)。Socket设置为阻塞模式,当socket不能立即完成I/O操作时,进程或线程进入等待状态,直到操作完成。如图1所示: /* ?* \brief ?* tcp client ?*/ #include stdio.h #include stdlib.h #include sys/socket.h #include netdb.h #include string.h #define SERVPORT 8080 #define MAXDATASIZE 100 int main(int argc, char *argv[]) { ? int sockfd, recvbytes; ? char rcv_buf[MAXDATASIZE]; /*./client 127.0.0.1 hello */ ? char snd_buf[MAXDATASIZE]; ? struct hostent *host; ? ? ? ? ? ? /* struct hostent ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?* { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?* char *h_name; // general hostname ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?* char **h_aliases; // hostnames alias ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?* int h_addrtype; // AF_INET ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?* int h_length;? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?* char **h_addr_list; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?* }; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?*/ ? struct sockaddr_in server_addr; ? if (argc 3) ? { ? ? printf(Usage:%s [ip address] [any string]\n, argv[0]); ? ? return 1; ? } ? *snd_buf = \0; ? strcat(snd_buf, argv[2]); ? if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) ? { ? ? perror(socket:); ? ? exit(1); ? } ? 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); ? /* create the connection by socket? ? ?* means that connect sockfd to server_addr ? ?* 同步阻塞模式?? ?*/ ? if (connect(sockfd, (struct sockaddr *)server_addr, sizeof(struct sockaddr)) == -1) ? { ? ? perror(connect); ? ? exit(1); ? } ? /* 同步阻塞模式 ?*/? if (send(sockfd, snd_buf, sizeof(snd_buf), 0) == -1) ? { ? ? perror(send:); ? ? exit(1); ? } ?

文档评论(0)

zhanghc + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档