sock udp tcp总结

Struct in_addr{

       In_addr_ts_addr;//-----uint32_t

}

Struct sockaddr_in

{

       Uint8_tsin_len;//--没有用

       Sa_family_tsin_family;//--- 是32位还是64位

       In_port_tsin_port;

       Structin_addr sin_addr;//--结构体里面就是32位ip

       Charsin_zero[8];///---没有用

}

很多函数用通用的sock接口

Struct sockaddr{

       Uint8_tsa_len;

       Sa_family_tsa_family;

       Charsa_data[14]

}

是与上面一样的。要强制转换。

 

 

发送及接收时都要转换成网络字序

Htons ntohs

 

Inet_aton,inet_ntoa(将字符ip转成32int 的ip)

 

//---------tcp ---ok完全理解------------

Server: Socketàbind-àlisten-à      accept-àread write (send recv)

Client: Socketàconnect---------------------------àread write

//bindà可以指定port或ip,如果client指定则为源ip,如为server则只监听此ip的连接

//listen将一个主动sock转换为一个被动sock

//accept产生一个新的(已连接)sock,与监听的sock是不一样的,一个用来接收连接,一个用来发收数据

注:发送还是发送到那个端口,内核会处理分发到各个接收的sock

客户端不用bind,因为server accept后就建立固定连接

??可以用bind的那个sock发送吗,,,因可以吧,,,不不可以  tcp不可以,要发也要connect

 

//--------udp-------------------

Server:socketàbind---àrecvfrom----àsendto

Client: socket---(bind)---àrecvfromàsnedto

客户端也可以绑定个端口,再连接服务器端。随时接受键盘输入并发送到服务器端

//--recvfrom会返回与之通信的地址

//--sendto也有指定要发送的地址

注:client如果无bind ,则每个sendto的端口地址会都一样吗

       不一样,但sendto 一次后会绑定,但再sendto又会再绑定一次

所以udp要互通都得bind一下,这样是全双向的

 

Upd可以调用connect,指定连只接收指定的ip,这样其它的ip会收不到得调用read/w

效率会快很多。如tftp要这样做

 

 

 

 

 

 

          我曾经很自信的认为自己了解UDP通信,什么无连接呀、不可靠呀,信手拈来,面试的时候还能跟人家口水一下,仿佛很懂。今天突然想到几个问题,越琢磨越觉得糊涂,于是在网上搜了一番资料,搞明白了几个问题。
          1
sendto的端口是固定的吗?答案是NO。调用recvfrom之前必须绑定地址和端口号么?答案是Yes。问题来了:为什么客户端只没有bind,在sendto之后直接可以recvfrom到数据呢?答案是内核在调用sendto时偷偷地帮你绑定了ipport因此在你再次调用sendto之前sock是被绑定的,recvfrom当然可以收到数据。
          2
udp也是可以connect的,connect也会自动帮你绑定ipport(因此如果你不想让客户端的端口号每次都变化的话可以考虑使用connec,当然也可以使用bind,不过据文档说客户端显式的bind是不被鼓励的)。connect有啥好处呢?毕竟我们不能做无用功呀。如果不connectsendto两个数据的时候内核会做如下的事情:
                       
绑定本地地址
                       
连接服务器
                       
发送第一个数据
                       
关闭连接
                       
绑定本地地址
                       
连接服务器
                       
发送第二个数据
                       
关闭连接
             connect
之后在sendto两个数据时,内核做的事情如下:
                       
绑定本地地址
                       
连接服务器
                       
发送第一个数据
                       
发送第二个数据
                      
关闭连接
             
效率提高了很多吧?所以如果你要连续发送数据的时候(比如传送一个文件),先connect一下吧。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值