七、socket基本概念
1、简介
a、协议簇和地址簇
TCP/IP协议簇符号标识是PF_*,地址簇符号标识是AF_*。由于TCP/IP的协议簇只有一种地址簇,已有的实现都把他们定义为相同的值。
b、端口
能通过端口找到相应的进程
2、WinSocket和Berkeley socket的区别
3、WinSocket I/O模式
在WinSocket中主要有三种I/O操作模式:阻塞、非阻塞和重叠I/O。在默认情况下,Berkeley和WinSocket都是建立阻塞的socket。为了建立非阻塞的socket,应用程序使用ioctlsocket的FIONBIO命令把socket设置为非阻塞的。在创建socket中制定了重叠I/O属性时,才能使用重叠I/O功能
a、阻塞I/O
线程使用了一个recv调用,但socket上没有数据,线程将被阻塞,直到socket接收到数据,并把数据复制到线程接收函数提供的缓冲区中。阻塞I/O虽然简单,但他不是最有效的编程方式
b、非阻塞I/O
和上面的一个简单的区别就是应用程序使用select检测是否有数据刻度,如有则使用recv接收数据,确保recv不会阻塞
c、重叠I/O
这是在WinSocket2.0版本中新加的特征。发送数据时,程序可以连续多次调用发送函数提供多个数据缓冲区去排队输出数据。发送数据时,程序使用WSASend或WSASendTo提供用户数据的缓冲区,如果Winsock不能立即发送数据,这些数据将按调用的顺序排队,当可以发送时再把数据发送到网络上。用户在接受到数据已经成功发送出去的通知之前,不能破坏缓冲区中的内容
d、同步和异步
同步传输数据块与数据块之间的时间间隔是固定的,必须严格规定它们的时间关系。同步有两种传输方式:字节同步和位同步,一般采用位同步方式
异步传输是指字符之间(前一个字符结束到下一个字符开始)的时间间隔是可变的,并不需要严格地限制它们的时间关系
八、转换函数
1、字节序
一般有两种选择:从多字节数据的小段(右端,最低有效位)开始,称为小尾数;另一种是从大端(左端,最高有效位)开始顺序传输,称为大尾数
主机上面的字节序称为主机字节序
在只有一台计算机的情况下,不需要考虑字节相关的问题,计算机会自动确定用哪种方式存储数值数据。但如果把计算机连接到网络上,就必须考虑字节序问题。当两台计算机的字节序不同时,如果在传输和接收数据时都按自己的方式处理数据,就会导致错误
2、一个判断字节序的程序
在这个程序中有一个联合体,第一个成员是sval,是程序中要判断的数组,第二个成员cval与sval占用相同的内存大小,这样就可以知道sval中的高位和地位都在内存的什么位置了。这两个成员有同样的长度,当联合体中的成员长度不同时,最大的成员长度就是联合的长度
HostEndian.cpp:
#include "stdafx.h" #include "iostream" union endian { unsigned short sval; unsigned char cval[4]; }; int _tmain(int argc, _TCHAR* argv[]) { char *info = "unknow endian"; union endian t = { 0x1234 }; if (t.cval[0] == 0x12 && t.cval[1] == 0x34) { info = "big-endian"; } else if (t.cval[0] == 0x34 && t.cval[1] == 0x12) { info = "little-endian"; } std::cout << "host is : " << info << std::endl; return 0; }
3、网络字节序
为了防止字节不统一的情况发生,即通信的双方对同一数组数据做出不同的解释,而导致错误,Internet定义了存储数值数据的标准顺序----高序字节在低序字节之前,保存在内存的低地址,即大尾数字节序,也称为网络字节序,而计算机上的字节序称为主机字节序。这两个字节序有可能不一样,所以需要先进行判断
NetConvt.cpp:
#include "stdafx.h" #include "iostream" #include "winsock2.h" #define INADDR_INVALD 0xffffffff //无效地址 static unsigned long range[] = { 0xffffffff, 0xffffff, 0xffff, 0xff }; unsigned short NetHtons(unsigned short shost) { unsigned char *p = (unsigned char *)&shost; return (unsigned short)(p[0] << 8 | p[1]); } unsigned short NetNtohs(unsigned short snet) { unsigned char *p = (unsigned char *)&snet; return (unsigned short)(p[0] << 8 | p[1]); } unsigned long NetHtonl(unsigned long lhost) { unsigned char *p = (unsigned char *)&lhost; return (unsigned long)(p[3] | (p[2] << 8) | (p[1] <
if (!selected) { LG.tip('请选择行!'); return }
M_Id = selected.DepId;
Fedora在安装‘添加/删除软件’那个管理项目里的软件包时,出现了如下情况 “初始化失败初始化软件包后端失败。此类现象可能在同时使用其他软件包工具时发生。更多详情 There are unfinished transactions remaining. Please run yum-complete-transaction as root.”
解决方法: 切换成root用户用su 输入用户名root; 密码 ,然后: # yum-complete-transaction 。