客户端的代码:
#include "csapp.h" int main(int argc, char **argv) { int clientfd, port; char *host, buf[MAXLINE]; rio_t rio; if (argc != 3) { fprintf(stderr, "usage: %s <host> <port>\n", argv[0]); exit(0); } host = argv[1]; port = atoi(argv[2]); printf("----000\n"); clientfd = Open_clientfd(host, port); printf("----1111\n"); Rio_readinitb(&rio, clientfd); while (Fgets(buf, MAXLINE, stdin) != NULL) { Rio_writen(clientfd, buf, strlen(buf)); printf("---test---\n"); Rio_readlineb(&rio, buf, MAXLINE); Fputs(buf, stdout); } Close(clientfd); exit(0); }
服务器的代码:
#include "csapp.h" void echo(int connfd) { size_t n; char buf[MAXLINE]; rio_t rio; Rio_readinitb(&rio, connfd); while ((n = Rio_readlineb(&rio, buf, MAXLINE)) != 0) { printf("server received %lu by66tes \n", n); printf("%s\n", buf); // Rio_writen(connfd, buf, n); } } int main(int argc, char **argv) { int listenfd, connfd, port, clientlen; struct sockaddr_in clientaddr; struct hostent *hp; char *haddrp; if (argc != 2) { fprintf(stderr, "usage: %s <port> \n", argv[0]); exit(0); } port = atoi(argv[1]); listenfd = Open_listenfd(port); while (1) { clientlen = sizeof(clientaddr); connfd = Accept(listenfd, (SA *)&clientaddr, &clientlen); /* determine the domin name and IP address of the client. */ hp = Gethostbyaddr((const char *)&clientaddr.sin_addr.s_addr, sizeof(clientaddr.sin_addr.s_addr), AF_INET); haddrp = inet_ntoa(clientaddr.sin_addr); printf("server connect to %s (%s)\n", hp->h_name, haddrp); echo(connfd); Close(connfd); } exit(0); }这是书上的源码,很容易看明白, 这样就可以大概了解socket的基本方法。以下 运行
./echoserver 8080&
./echoclient ubuntu-64bit-compile 8080
这样就可以啦。
虽然现代编译系统已经发展的相当“智能”,但并不能成为我们不去了解它的理由,它是我们代码转换的工具,要想使用好这个工具,就必须对它有相对全面的了解才行。
了解编译系统如何工作可以使我们:
1、优化程序性能:真正影响系统执行效率的是编译完成后的“二进制代码”,如果想做的更好,我们就非常有必要知道源代码是如何转换成二进制代码的,以及使用了怎样一种规则。只有从汇编的角度理解机器执行路径才能更好的评估系统性能,所以我们需要对不同C语言转换出来的汇编语言有所了解。问自己几个问题:switch是否总比if-else高效?数组是否比指针效率高?如何区分函数调用和宏函数的使用环境?等等这些都是我们需要回答的。
2、理解链接时出现的错误:根据经验,最困扰我们的错误很多都跟链接操作相关,尤其是在进行大型系统开发时。只有了解编译系统内部的操作原理以及错误出现的时机,才能真正理解这些错误,并加以排除和防范。想一下:为什么有时候编译器报错"无法解析某个引用"?为什么不能定义两个全局变量?为什么有些错误直到运行时才出现?而且出现时机不定?(多半是数据溢出,指针错误)。
3、避免安全漏洞:据查“缓冲区溢出漏洞”一直是网络安全上的重心,主要是很多程序员对自己的程序没有相关堆栈规则的认识,不了解底层的数据组织造成的。这些问题如果造成,在排查时非常困难,将严重影响产品进度。我就曾遇到过这个情况,在开发某一款产品时,由于嵌入式硬件和操作系统本身的的资源限制,造成了当执行某个模块时,其他无关数据错误的现象,经排查才发现是由于操作系统对栈空间大小有限制,该模块执行时,对资源的要求较高造成了栈数据溢出,直接覆盖了其他无关数据。当修改系统默认栈空间之后,该问题从未出现。
CMDN Club #23 开放平台和O2O移动产品开发
活动时间:12月14日下午2:00~5:00
活动地点:望京福泰公寓酒店一层纽约厅
活动人数:60人
活动形式:演讲+小型讨论或互动游戏
活动主题:开放平台和O2O移动产品开发
活动安排:
2:00~2:10:开场
2:10~2:50:中国电信天翼开放平台+法国电信
2:50~3:30:O2O“失落的半圆”和未来畅想(客如云创始人:彭雷)
3:30~3:40:短休
3:40~4:20:QR Code二维码的前世今生(信恩科技创始人:林兴陆)
4:20~5:00:音频二维码的技术实现和应用场景(“蛐蛐儿”创始人:朱连兴)
演讲#1:天翼开放平台服务及架构解析
内容简介:该议题将围绕天翼开放平台所提供的开发者合作服务,重点介绍天翼开放平台合作状况、中国电信开放能力体系及天翼开放平台系统架构,并探讨未来基于运营商开放平台合作的发展与机遇。这个环节还将邀请法国电信的嘉宾参与,分享开放平台的“掘金”之路
讲师简介:李志猛 中国电信互联网业务部能力运营室经理
演讲#2:O2O“失落的半圆”和畅想
内容简介:O2O,从字面上来看,就是把线上用户带到线下Online 2 Offline。对于O2O,其实只是一个半圆,没有闭环。这个“失落的半圆”,其实是Offline 2 Online!O2O未来的创业公司,第一个步是要寻找的是找到商户的某个或某几个痛点,并以此建立有忠诚度,长期合作的模式。然后调动用户与商户互动,使得商户可以更加依赖你的服务,这样就一定可以走出一个成功的企业。本演讲将剖析O2O的前世今生,对团购和电子商务产品和行业的发展进行分析和畅想,并预测未来O2O的格局。
演讲嘉宾:彭雷,客如云创始人,前24券COO。资深创业者,在互联网新业务模式探索,综合运营管 理,研发管理方面有着丰富的经验。从大学开始十余年的创业历史,创立了多个创业公司, 涵盖领域包括,O2O,团购,数据库营销,数据挖掘,CRM,SNS到企业应用等。
演讲#3:QR Code二维码的前世今生
内容简介:QR Code是使用最广泛的二维码,它也是第一个明确定义并公开发布的标准化规范。随着iOS 6推出 Passbook,完善的生态系统将使该功能迅速普及, 二维码将真正腾飞。而随着线下的商户迅速集成到线上,与二维码结合的线上产品形态也越来越丰富。O2O的商业前景被众多投资客看好。该演讲将剖析二维码的前世今生,大量的应用场景示例,将启发你在O2O掘金路上的新思考。
演讲嘉宾:林兴陆,信恩科技创始人。80后互联网老兵,17岁加盟瀛海威,先后任职于润迅、恒基伟业、265等企业。2000年曾与刘韧、杜红超共同发起DoNews,此外还参与组建过多家互联网公司。后投身于移动互联网创业大潮,并致力于创建儿童平板操作系统。
演讲#4:音频二维码的技术实现和应用场景
内容简介:利用声音实现手机之间或者手机与PC之间的近距离信息传输,这就是我们说的音频二维码。目前类似于这种技术的应用有联想开发的茄子快传,腾讯在“朋友圈”应用上的“嘀一嘀”功能,以及蛐蛐儿SDK。该演讲将探讨这一技术的实现和应用场景,内容包括:音频二维码的实现原理,音频二维码技术与传统二维码的比较,音频二维码的应用场景畅想:文件传输、社交分享、电子门票、电子支付等等。
演讲嘉宾:朱连兴,“蛐蛐儿”创始人,锦涛年间知名草根iPhone开发团队139.ME创始人,139.ME2008开始做iPhone开发,是国内第一个被媒体广泛报道的iOS开发团队。