- 浏览: 12934 次
最新评论
socket 通信基础2
2011年01月05日
◆先看定义:
typedef unsigned int u_int;
typedef u_int SOCKET;
◆Socket相当于进行网络通信两端的插座,只要对方的Socket和自己的Socket有通信联接,双方就可以发送和接收数据了。其定义类似于文件句柄的定义。
◆Socket有五种不同的类型:
1、流式套接字(stream socket)
定义:
#define SOCK_STREAM 1
流式套接字提供了双向、有序的、无重复的以及无记录边界的数据流服务,适合处理大量数据。它是面向联结的,必须建立数据传输链路,同时还必须对传输的数据进行验证,确保数据的准确性。因此,系统开销较大。
2、 数据报套接字(datagram socket)
定义:
#define SOCK_DGRAM 2
数据报套接字也支持双向的数据流,但不保证传输数据的准确性,但保留了记录边界。由于数据报套接字是无联接的,例如广播时的联接,所以并不保证接收端是否正在侦听。数据报套接字传输效率比较高。
3、原始套接字(raw-protocol interface)
定义:
#define SOCK_RAW 3
原始套接字保存了数据包中的完整IP头,前面两种套接字只能收到用户数据。因此可以通过原始套接字对数据进行分析。
其它两种套接字不常用,这里就不介绍了。
◆Socket开发所必须需要的文件(以WinSock V2.0为例):
头文件:Winsock2.h
库文件:WS2_32.LIB
动态库:W32_32.DLL
一些重要的定义
1、数据类型的基本定义:这个大家一看就懂。
typedef unsigned char u_char;
typedef unsigned short u_short;
typedef unsigned int u_int;
typedef unsigned long u_long;
2、 网络地址的数据结构,有一个老的和一个新的的,请大家留意,如果想知道为什么,
请发邮件给Bill Gate。其实就是计算机的IP地址,不过一般不用用点分开的IP地
址,当然也提供一些转换函数。
◆ 旧的网络地址结构的定义,为一个4字节的联合:
struct in_addr {
union {
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_long S_addr;
} S_un;
#define s_addr S_un.S_addr /* can be used for most tcp & ip code */
//下面几行省略,反正没什么用处。
};
其实完全不用这么麻烦,请看下面:
◆ 新的网络地址结构的定义:
非常简单,就是一个无符号长整数 unsigned long。举个例子:IP地址为127.0.0.1的网络地址是什么呢?请看定义:
#define INADDR_LOOPBACK 0x7f000001
3、 套接字地址结构
(1)、sockaddr结构:
struct sockaddr {
u_short sa_family; /* address family */
char sa_data[14]; /* up to 14 bytes of direct address */
};
sa_family为网络地址类型,一般为AF_INET,表示该socket在Internet域中进行通信,该地址结构随选择的协议的不同而变化,因此一般情况下另一个与该地址结构大小相同的sockaddr_in结构更为常用,sockaddr_in结构用来标识TCP/IP协议下的地址。换句话说,这个结构是通用socket地址结构,而下面的sockaddr_in是专门针对Internet域的socket地址结构。
(2)、sockaddr_in结构
struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
sin _family为网络地址类型,必须设定为AF_INET。sin_port为服务端口,注意不要使用已固定的服务端口,如HTTP的端口80等。如果端口设置为0,则系统会自动分配一个唯一端口。sin_addr为一个unsigned long的IP地址。sin_zero为填充字段,纯粹用来保证结构的大小。
◆ 将常用的用点分开的IP地址转换为unsigned long类型的IP地址的函数:
unsigned long inet_addr(const char FAR * cp )
用法:
unsigned long addr=inet_addr("192.1.8.84")
◆ 如果将sin_addr设置为INADDR_ANY,则表示所有的IP地址,也即所有的计算机。
#define INADDR_ANY (u_long)0x00000000
4、 主机地址:
先看定义:
struct hostent {
char FAR * h_name; /* official name of host */
char FAR * FAR * h_aliases; /* alias list */
short h_addrtype; /* host address type */
short h_length; /* length of address */
char FAR * FAR * h_addr_list; /* list of addresses */
#define h_addr h_addr_list[0] /* address, for backward compat */
};
h_name为主机名字。
h_aliases为主机别名列表。
h_addrtype为地址类型。
h_length为地址类型。
h_addr_list为IP地址,如果该主机有多个网卡,就包括地址的列表。
另外还有几个类似的结构,这里就不一一介绍了。
5、 常见TCP/IP协议的定义:
#define IPPROTO_IP 0
#define IPPROTO_ICMP 1
#define IPPROTO_IGMP 2
#define IPPROTO_TCP 6
#define IPPROTO_UDP 17
#define IPPROTO_RAW 255
发表评论
-
如何为嵌入式开发建立交叉编译环境
2012-01-20 12:16 707如何为嵌入式开发建立交叉编译环境 2010年10月12日 ... -
自己动手编写嵌入式Bootloader之(3)
2012-01-20 12:16 643自己动手编写嵌入式Boot ... -
windows编程新手常见问题
2012-01-20 12:16 406windows编程新手常见问题 ... -
C++标准库简介
2012-01-20 12:16 688C++标准库简介 2011年03 ... -
汇编调用C库函数
2012-01-20 12:16 800汇编调用C库函数 2010年07月29日 1.先包含(由 ... -
python难吗?
2012-01-19 16:59 867python难吗? 2010年06月04日 学的人很少的 ... -
python
2012-01-19 16:59 966python 2010年06月08日 面对珍珠(Pe ... -
学习python
2012-01-19 16:59 709学习python 2011年09月29日 ... -
Python for s60[1_pys60简介]
2012-01-19 16:59 735Python for s60[1_pys60简介] ... -
100%解决Python平台安装更新错误的问题
2012-01-19 16:58 650100%解决Python平台安装更新错误的问题 2010年1 ... -
2012-1-12
2012-01-17 06:44 5612012-1-12 2012年01月12日 瀹剁┓浜轰 -
屎上最难!最搞笑的脑筋急转弯!不看答案你能猜对几个?
2012-01-17 06:43 713屎上最难!最搞笑的脑筋急转弯!不看答案你能猜对几个? 201 ... -
UNIX编程随笔(三十四)socket地址
2012-01-16 05:25 980UNIX编程随笔(三十四)socket地址 2010年04月 ... -
C#托管Socket的实现方法
2012-01-16 05:25 1031C#托管Socket的实现方法 2009年10月23日 ... -
UNIX编程随笔(三十五)连接以及读写socket
2012-01-16 05:24 1199UNIX编程随笔(三十五)连接以及读写socket 2010 ... -
ActionScript3.0 Socket编程
2012-01-16 05:24 579ActionScript3.0 Socket编程 2 ...
相关推荐
socket通信基础socket通信基础
很简单的windows socket通信基础.开发环境是visual studio 2017,内含服务器端和客户端.能正常通信发消息.但是仍有小错误.需要自行改正,适合学习用.
java代码,客户端通过socket,将文件传输到服务器。
socket通信原理 学习socket的好资料 从零基础学习快速掌握
基于socket通信的javaDH通信实现,采用最基础的思路和算法进行多个客户端的通信的以及加解密的实现。
最基础的java socket通信,客户端服务端之间传送javabean对象
【IT十八掌徐培成】Java基础第18天-04.Socket通信基础-2.zip
TCPServer tcpClient udp通信,定时发送,hex字符普通字符 收发...等功能,为基础参考项目
(VC++)关于控制台Socket编程的入门操作,希望可以给大家一点启发
【IT十八掌徐培成】Java基础第18天-03.Socket通信基础.zip
Socket,双向通信,基础,控制台 适合刚开始学Socket编程的同学
delphi源码基础的Socket通信 利用ServerSocket与ClientSocket 控件建立联接
C#Socket通信实例,Modbus协议。 我使用此实例代码,通过Socket的方式,实现了一个与称重设备通信的功能。 支持一切Modbus协议的通信,在此基础上进和业务封装,实现程序功能。
简介现代 CPU 的累加器一次都能装载(至少)4 字节(这里考虑 32 位机),即一个整数。那么这 4字节在内存中排列的顺序将影响它被累加器装载成的整数的值,这
C#上位机基础学习_基于SOCKET实现与PLC服务器的TCP通信(一)
简单实现了socket单项通信,初学socket成果,分享出来。
java.net包socket通信,基础客户端 和 服务端的通信传输实现
Unity和Qt入门项目-基于Unity+Qt的Socket通信演示项目(学习Socket双向通信机制)源码.zip 本项目使用Unity3D作为物体模拟器,使用Qt作为数据接受,二者通过Socket通信来完成数据的传输。本项目的目的是为了熟悉Socket...
GPRS(General Packet Radio Swevice)是通用分组无线业务的简称,是一种以全球手机系统(GSM)为基础的数据传输技术。GPRS网不但具有覆盖范围广、数据传输速度快、通信质量高、永远在线和按流量计费等有点,而且其...
前段时间项目需求,ashmem通过java创建共享内存,在底层C程序接收fd后读数据,在别人的基础上修改,备忘。