linux下的socket编程

 

上两周的进度终于验收完毕,结果怎样我就不想多说了,总之自己学到了东西,自己做完了要求的任务,自己认为无愧于心就好。

记得一个很崇拜的师兄曾问我后悔了吗,记得豆豆曾告诉我GX并不像我想的那么单纯,直到今天我才真正领悟其中的含义。

明白只要离开了大学就算是进入了社会,不管是读研也好、工作也好,都已经不能再率性而为了。

委屈和眼泪再也不能成为逃脱的理由,我又一次选择了鸵鸟的策略,把头深深的埋进土里,看不见的就是不存在的。

好了,发了一通无用的牢骚,现在开始进入主题,关于linux下socket编程方法我就不多说了,书籍和网上的资料很多,这里只是小结下自己编程中遇到的问题,以防再犯。

1.推荐两本很有用的书

由于我前两周主要是做的linux下的socket编程和进程管理,都是以前没有涉及过的东西,从图书馆借阅了好多资料,在能够找到的资源中,有两本是值得推荐的。

一本是《实战linux socket编程》,很适合初学者,讲的十分全面而且容易理解,再配上网上流传的一篇《BSD Socket简易入门手册》,基本就可以上手写代码了。另外一本是《linux系统编程》,也是比较通俗的入门的书,讲的非常好,而且这本书可以直接看原版《Linux System Programming》,也不需要太强的英语基础。

2.Server与Client的通讯

我们在进行socket编程时,一般都是通过server进行socket()、bind()、listen()、accept(),而client进行socket()、connect()来建立连接,然后client就可以用send()发送数据,而server用recv()接受数据。

由于我是初次编写socket程序,而且要求server同时也向client发送数据,于是就开始晕乎了。觉得既然只有server调用的listen()和accept()函数,那么是不是只有它可以接收呢,那么如果它也要发送,是不是要重复进行下上述连接的反向操作。不过还好我没有立刻动手,而是先查了下相关资料,才发现原来只要建立了connect就可以双向通讯了,只不过client在调用send()时第一个参数用的是socket()函数的返回值,而server调用send()时第一个参数用accept()的返回值,调用recv()时也是同样的道理。

这个就不贴代码了,有点麻烦,这么解释不知道明白不,呃,不过我相信大家都比我聪明,这个问题应该都不会遇到的,我就留着提醒下自己吧。

3.inet_ntoa()地址转换函数

当有用户连接到服务器时,我们通常想得到它的IP地址,但是阅读套接口地址结构中的32位IP地址不太方便,于是就用到地址转换函数,地址转换函数貌似有很多种,inet_ntoa()则可以把套接口中的IP地址转换成字符串形式的点分十进制形式(如127.0.0.1),也就是我们通常见到的形式,用法简单演示如下。

记得一定要添加头文件,我一开始有个头文件忘加了,结果竟然编译通过,但是运行有错误,很费解的说。

4.fflush()在许多linux版本下无用

如果我们的输入是要求带有空格的,那么用scanf()函数时就会遇到问题,因为scanf()读到空格就停止了,剩下的只留在缓冲区中,这个问题解决的方法通常是采用集合操作,如下所示。

 

但是,在linux下却出现了问题,当第一次输入成功后便开始疯狂刷MessageSend>,整的人很郁闷。左看右看其他地方都没有问题,那么问题一定处在fflush()上了,于是实践证明了在许多linux版本下fflush()是没有效果的。这时的解决方法要么就是不要用scanf()了,或者做一个循环代替fflush()刷掉留在缓冲区中的/n,如下所示。

 

嗯,先总结到这里,以后遇到其他问题再继续添加,嘿嘿。

(2010年4月18日)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值