Linux Socket编程(不限Linux)

“一切皆Socket!”

话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket。

——有感于实际编程和开源项目研究。

我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web 服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型 有哪些?还有socket的基本函数,这些都是本文想介绍的。本文的主要内容如下:

  • 1、网络中进程之间如何通信?
  • 2、Socket是什么?
  • 3、socket的基本操作
    • 3.1、socket()函数
    • 3.2、bind()函数
    • 3.3、listen()、connect()函数
    • 3.4、accept()函数
    • 3.5、read()、write()函数等
    • 3.6、close()函数
  • 4、socket中TCP的三次握手建立连接详解
  • 5、socket中TCP的四次握手释放连接详解
  • 6、一个例子(实践一下)
  • 7、留下一个问题,欢迎大家回帖回答!!!

Read moreLinux Socket编程(不限Linux)

使用telnet理解http

今天上计算机网络课,老师给讲解http协议。在最后演示的时候,使用telnet连接http服务的端口,并敲入http请求,看到了http服务返回的信息。不得不说这么一弄确实让我对http的理解又深了一层,对http基于tcp有了深刻的认识。捎带着对telnet的认识也清晰了,它就是在一个tcp连接下透明传输字节流的工具。上课时老师只写了Request line,没写其他的http头,服务器一直返回4xx,5xx错误,我回到宿舍亲自试了一遍,终于找到了原因,必须附加HOST头,不然无法请求成功。下面就贴出使用telnet发送的手写http请求(本地127.0.0.1的apache http服务)和服务器返回的信息:

Read more使用telnet理解http

全图形界面配置Windows无线共享工具——无线共享助手

一句话介绍:这是一个只需轻点几下鼠标就能把笔记本变身无线路由的神器。

自己写了个Windows下的配置无线共享的工具,可以完美替代netsh hostednetwork那一套命令和在适配器上右键单击选择网卡设置ICS共享。软件需要.netFramework 2.0支持。估计能有无线网卡的电脑都会装了。

Read more全图形界面配置Windows无线共享工具——无线共享助手

解决使用curl设置好COOKIEJAR文件时cookie无法保存的问题

今天使用curl来进行模拟登陆,在进行关于cookie的操作时,设置好了cookie

却发现无论如何都无法保存服务器返回的cookie

Read more解决使用curl设置好COOKIEJAR文件时cookie无法保存的问题

jQuery的getJSON方法post数据时自动添加的下划线字段

这两天在研究模拟登陆网盘。其中遇到一个问题,需要模拟发送一个POST,但是检测HTTP数据通信发现在发送时,经过POST发送的字段总是比form内的字段多一个下划线字段。一开始百思不得其解,后来经过仔细观察,发现这个字段的数值是一个数值,隐约感觉非常像json的时间字段,精确到毫秒的ticks。经过转换发现确实是标示发送时间的字段。

下划线字段的含义解决了,那它究竟是谁添加的呢?

在阅读发送这段内容的源代码后发现,这段代码是由jQuery的getJSON方法发送的,而且在发送前,已经使用ajaxSetup方法配置成异步、不缓存。阅读了jQuery的Refference后,发现默认就是异步,但是缓存为true。所以料想添加的下划线字段应该是用精确到毫秒的时间字段来将url标识为独一无二的请求,从而强制服务器发送最新的数据。

至此下划线问题完美解决:它是jQuery的ajax方法在设置为不缓存时自动添加的时间字段。

Uva刷题有感

虽然今儿天亮了就要去缓考毛概和英语,但是从昨晚上开始就在刷Uva但是一直没过,我就一直要等到过了再复习。前些天也是,这一个星期只刷了6道题,发现自己存在着很多的问题,大体总结如下:

  • 对c的输入输出不熟悉(但现在经过6个题后已经熟练使用gets,sscanf,sprintf,printf)
  • 不会使用样例输入和输出,并对比输入输出(现在已经熟练使用流的重定向功能和diff来对比文件)
  • 部分题意理解不明,死做硬做浪费时间(遇到此类情况应查看题解)
  • 正确的输出文件并非保证最后全无空行,大部分时候有一行空行才是正确答案,不要纠结于此
  • 根据输入数据量大小动态分配内存并非最佳的解决方案,根据输入输出范围提前分配好足够的空间往往是最方便解决方案
  • 针对C语言在线调试相对不便的问题,应在写代码时,在关键部位输出调试信息,并方便关闭(现在学会了使用不定个数的参数个数,构建一个与printf功能相同的dbg函数来输出调试信息)
  • 应注意输入值的范围,比如输入的区间边界值是否一定是前小后大,比如计算出的值是否需要根据允许的范围取余修正,特殊情况输入会不会造成程序死循环等。
  • 应注意在使用前一定要初始化变量,以及访问和读入变量的顺序问题,避免顺序错误导致的数据异常

先写到这里吧。。。该去复习一下毛概了。。。

缓考完后,我一定要好好刷题,提高效率!

挑战编程

这个星期开始用挑战编程这本书来提高自己的算法与编程能力,到今天一共只做了4道题。虽然一次次的wa着实让人不爽,但自己还是得到了不少的提高

最起码自己对这些了解了:

  • oj工作原理
  • 手动人肉oj

经过前些天折腾驱动和这几天写题,渐渐对c产生了从未有过的好感。在以往的印象中,c又麻烦又不好用,要什么没有什么。但经过这些天的使用,发现c其实是非常强大的,scanf格式化输入,配合占位符和正则表达式完爆c#的Console.ReadLine,printf格式化输出媲美Console.WriteLine,stdlib.h提供了atof等就像float.Prase,比较麻烦的只有手动分配内存和释放内存,不过其实也是相当的灵活。现在真的逐渐明白了c真的是一门简单而又强大的高级语言。没有了Intellisense,我学会了自己差错和规范格式,算是一个提高吧~

回宿舍后继续做题,现在继续上管理信息系统。。。