对socket编程的一点理解-2011.2.17

把最近两天研究Linuxsocket编程的成果总结一下。

向网络方向发展,socket编程是首先要解决的问题。之前虽然调过socket的程序,但是理解不深,或者说根本没去理解,敲个代码,调通OK

既然发起了《计算机网络》的读书计划,也意识到只看书不做代码不可能有深入的理解,就把第三章好好的研究一下,实现几个小例子吧。即使做的不好,也是非常有意义的。什么东西都要经历从不好到好的一个过程。

实现的第一个例子:把socket通信调通,达到能自己不看参考写出来的程度。

准备实现的第二个例子:自定义一个小的协议,用socket传输协议。

准备实现的第三个例子:做一个CS模型,客户端可以登录,服务端能响应客户端的请求。

要求:体现出网络通信的分层结构。

可以响应5用户同时登录。

 

言归正传,先说一下几个结构体吧。老是记混,有时候还不记得头文件,这次把它们找出来了,以后就省事了。

第一个结构

Struct sockaddr

       Unsigned short int sa_family;

       Unsigned char sa_data[14];

/usr/include/sys/socket.h

 

sockaddr同等的结构

Sturct sockaddr_in

       Unsigned short int sin_family;

       Unsigned short int sin_port;

       Struct in_addr sin_addr;

       Unsigned char sin_zero[8];

/usr/include/netinet/in.h

 

第三个结构:

Typedef uint32_t in_addr_t;

Struct in_addr

{

       In_addr_t s_addr;

};

/usr/include/netinet/in.h

 

 

我的理解:

到底什么是socket呢?socket就是一种标志,通过IP和端口唯一的标志一个网络中的一个主机上的一个进程,其中IP确定主机,端口确定进程。

什么是socket通信呢?简单的可以这样理解:实现网络中两个不同主机中的进程通信。

说到底就是两个进程在通信,通信就是交换信息。

如何实现?Linux下的一切都是文件,socket也是一种文件,只是比较特别,调用socket()返回的就是一个int型的文件标识,调用bind()后,使这个文件与主机中的一个进程对应起来。然后一个去Listen(),等待别人的连接,一个主动去连接,所谓连接就是使上面讲的两个文件发生关联。连接建立以后,就像对文件一样的操作,一个写,另一个读。

 

在看socket的时候,开始对Listenaccept很不理解,就找了socket的源码来看看,当然是对着源码分析看的,呵呵。发现原来是这个样子:

在调用accept的时候,内核重新生成了一个socket。而且每调用一次生成一个socket。新生成的socket用来通信,即send recv。而Listen的那个socket还在监听。把连接的socket放到一个hash表里,而调用一次accept就从队列里取走一个socket处理。打个形象的比喻:“只取蛋,不杀鸡”。

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值