TCP/IP是一种比较通用的通信协议,在windows中采用socket组件库实现,是对协议通信功能的一种封装,
如你要发送一个信息(数据如“MSG”)从A到B,那么A将“MSG”打包成“4MSG”,第一个字节“4”表示这个数据包长度为4,那么接紧接的3个字节就是数据,那么这里就是一个协议,只是这个协议很简单,属于你自己开发的协议,而TCP这些协议属于开放协议,大家都知道标准,因此只要收到一个TCP数据包,那么你就可以根据协议分析你收到的数据包的格式是什么,数据包协议中,一般在数据包的开始部分定义了固定格式的信息,如TCP包头中包含了数据长度,目的的IP地址等很多信息。
如果你收到一个数据包,你不清楚它是什么格式的,那么你怎么解析呢,根本无法解析的,当然如果人工打开这个数据包进行数据内容与已知的协议比对,也许可以猜出它是什么格式。
看数据包的传送过程,
程序A:sengPackage("MSG"){ 调用TCP协议函数sendTCPPackage("4MSG");};
sendTCPPackage(char pkg){调用IP协议函数sendIPPackage(TCP头+“4MSG”)};
sendIPPackage(char pkg){调用MAC协议函数sendMACPackage(IP头+“TCP头+4MSG”)};
sendMACPackage(char pkg){调用驱动发送数据包sendPkg(MAC头+“IP头TCP头+4MSG”)};
这里仅仅是用函数调用的描述解释协议实现的原理:协议的分层在编写程序时体现的就是一个调用层次关系。
在接收方,其实就是调用相同层级的函数对收到的数据包进行解包,把去掉本层头部的数据包传给上层调用函数,
如getPackage(char buffer){
buffer = getTCPPackageData(buffer);
return buffer +1; // 去掉开始的一个字节。这里就是我自己定义的协议解包过程。
}; //buffer是收到的数据包。
char getTCPPackage(char buffer){
buffer = getIPPackageData(buffer);
buffer = 去掉TCP包后的数据包; // TCP包解包过程,IP,MAC的解包一样。
return buffer;
}
如>老大,原来你连 C 的原理都不会啊?
C 语言所有调用函数,都要有声明,这种外部函数库的调用,都要用他们的 header 文件来声明函数变量等等的东西,编译器会根据实际情况去把这些程序里面的函数调用链接到函数库的正确位置上。
微软的产品因为他垄断了他自己系统的所有功能设计。所以他的系统+他的开发程序+他的开发函数库就不需要 header 文件了,因为它可以设计为 dll 本身含有足够的信息去干别的事情了。所以,你别以为你用了微软的 net ,他就还是 C 语言了。他已经脱离了 C 语言的范围了。
GCC一般情况下是编译器,但编译器是不够的,还需要连接器的工作才行。binutils 里面的软件提供相关的功能。
要知道以前链接到函数库功能,光有 header 和函数库文件本体还是不行的,还需要另外的函数库信息文件来帮助编译器连接器来找到正确的函数入口位置才行的。
你编程 C ,你要选择你所使用的功能调用方法,GCC 一般调用 mysql 有调用外部 dll ,或者程序自己直接链接 mysql 端口,自己分析 mysql 服务进程发送的各种信息!
前一种办法,可以直接选择 mysql 客户端里面的 SDK 来直接获得官方的功能支持,但官方 MySQL 是 GPL 协议发布的,你使用他的功能接口后,你的程序也必须以 GPL 发布,不然你就要去选择其他的函数库,比如 ODBC 的 mysql 库。当然还有第三方的 mysql 功能库可以选择。
不过你要注意,LGPL 必须严格区分你的程序和 LGPL 代码。你必须动态链接到 LGPL 函数库。如果你的程序包含 LGPL 函数库一起发布,且 LGPL 库是你的软件的必备函数库,那么你的程序也必须开源,但不是 GPL 而是 LGPL !
不然你就选择自己写程序直接与 mysql 服务器进行数据传输,不使用第三方功能库。
但我不认为身为一个 Linux 下程序开发人员,会去傻傻的自己写功能函数而不是用现成的函数库。
你所遇到的“非要客户安装 mysql client ”,就是因为你的软件调用了一些非你自己编写的函数调用功能,而为了获取这些函数而需要安装几个 mysql 函数库的问题。
这个问题我想不应该是一个开发人员提出来的吧?
------------------------------------
楼主你还是重新学习 C 语言吧。net 的 C 被微软改的不是真正的 C 语言了,所以你没办法按照 C 的标准去比较 net 和 GCC 的。
而且很多 net 的编程习惯也没办法延续到 GCC 的。
在c语言里,socket的连接是不是只能写ip地址,不能写网址,如>
欢迎分享,转载请注明来源:内存溢出
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)