Socket编程实践(2) --Socket编程导引

什么是Socket?

Socket能够看成是用户进程与内核网络协议栈的接口(编程接口, 例如以下图所看到的), 其不仅能够用于本机进程间通信。能够用于网络上不同主机的进程间通信, 甚至还能够用于异构系统之间的通信。

IPv4套接口地址结构

IPv4套接口地址结构通常也称为“网际套接字地址结构”。它以“sockaddr_in”命名,定义在头文件<netinet/in.h>中

//TCP/IP地址结构
struct sockaddr_in
{
    uint8_t  sin_len;
    sa_family_t  sin_family;
    in_port_t	sin_port;	//2字节
    struct in_addr	sin_addr;	//4字节
    char sin_zero[8];	//8字节
};

成员说明:

sin_len:整个sockaddr_in结构体的长度。在4.3BSD-Reno版本号之前的第一个成员是sin_family.

sin_family:指定该地址家族。对于IPv4来说必须设为AF_INET

sin_port:端口

sin_addr:IPv4的地址;

sin_zero:暂不使用。一般将其设置为0

Linux结构(经常使用):

struct sockaddr_in
{
    sa_family_t    sin_family; /* address family: AF_INET */
    in_port_t      sin_port;   /* port in network byte order(网络字节序) */
    struct in_addr sin_addr;   /* internet address */
};
/* Internet address. */
struct in_addr
{
    uint32_t       s_addr;     /* address in network byte order */
};

通用地址结构

用来指定与套接字关联的地址(能够支持其它协议).

struct sockaddr
{
	uint8_t  sin_len;
	sa_family_t  sin_family;
	char sa_data[14]; 	//14字节   
};

说明:

sin_len:整个sockaddr结构体的长度

sin_family:指定该地址家族

sa_data:由sin_family决定它的形式。

网络字节序

1.大端字节序(Big Endian)

最高有效位(MSB:Most Significant Bit)存储于最低内存地址处。最低有效位(LSB:Lowest Significant Bit)存储于最高内存地址处。

2.小端字节序(Little Endian)

最高有效位(MSB:Most Significant Bit)存储于最高内存地址处,最低有效位(LSB:Lowest Significant Bit)存储于最低内存地址处。

时间: 2024-10-19 09:10:52

Socket编程实践(2) --Socket编程导引的相关文章

Socket编程实践(19) --Socket API封装(2)

注:这一片博客与下一篇博客<Socket编程实践(20)>合为一篇,由于代码较多,所以分为两篇,本篇为上篇,主要讲解前一篇讲解的Socket类的增强,下一篇主要讲解怎样使用这个增强版的Socket类(ServerSocket/ClientSocket类的实现与使用)! 思想来源: 1)http://www.cnblogs.com/-Lei/archive/2012/09/04/2670964.html 2)http://blog.csdn.net/column/details/linux66.

Socket编程实践(20) --Socket API封装(3)

注:这一片博客与上一篇博客<Socket编程实践(19)>合为一篇,由于代码较多,所以分为两篇,本篇为下篇,这一篇主要讲解怎样使用上一篇开发的增强版的Socket类(ServerSocket/ClientSocket类的实现与使用)! 思想来源: 1)http://www.cnblogs.com/-Lei/archive/2012/09/04/2670964.html 2)http://blog.csdn.net/column/details/linux66.html 3)http://blo

Socket编程实践(3) --Socket API

socket函数 #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); 创建一个套接字用于通信 參数: domain:指定通信协议族(protocol family),经常使用取值AF_INET(IPv4) type:指定socket类型, 流式套接字SOCK_STREAM.数据报套接字SOCK_DGRAM,原始套接字SOCK_RAW protoc

Socket编程实践(12) --UDP编程基础

UDP特点 无连接,面向数据报(基于消息,不会粘包)的数据传输服务; 不可靠(可能会丢包, 乱序, 重复), 但因此一般情况下UDP更加高效; UDP客户/服务器模型 UDP-API使用 #include <sys/types.h> #include <sys/socket.h> ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *a

Socket编程实践(13) --UDP编程基础(1)

UDP特点 无连接,面向数据报(基于消息,不会粘包)的数据传输服务; 不可靠(可能会丢包),但一般情况下UDP更加高效;     UDP客户/服务基本模型 UDP基础API 1.Recvfrom SYNOPSIS #include <sys/types.h> #include <sys/socket.h> ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr,

Socket编程实践(18) --Socket API 封装(1)

序言: 定义一套用于TCP通信比较实用/好用Socket类库(运用C++封装的思想,将socket API尽量封装的好用,实用); 思想来源:http://www.cnblogs.com/-Lei/archive/2012/09/04/2670942.html Socket.h #ifndef SOCKET_H_INCLUDED #define SOCKET_H_INCLUDED #include <sys/socket.h> #include <sys/types.h> #inc

Socket编程实践(14) --UDP编程基础(2)

使用UDP注意事项 1.UDP报文可能会丢失.重复.乱序 2.UDP缺乏流量控制:当缓冲区写满以后,由于UDP没有流量控制机制,因此会覆盖缓冲区. 3.UDP协议数据报文截断:如果接收到的UDP数据报大于缓冲区,报文可能被截断,后面的部分会丢失. 4.使用UDP: recvfrom返回0,不代表连接关闭,因为UDP是无连接的. 而且sendto可以发送数据0包(只含有UDP首部[20字节]); 5.ICMP异步错误 观察现象:关闭UDP服务端,启动客户端,从键盘接受数据后,再发送数据.UDP客户

Socket编程实践(10) --select的限制与poll的使用

select的限制 用select实现的并发服务器,能达到的并发数一般受两方面限制: 1)一个进程能打开的最大文件描述符限制.这可以通过调整内核参数.可以通过ulimit -n(number)来调整或者使用setrlimit函数设置,但一个系统所能打开的最大数也是有限的,跟内存大小有关,可以通过cat /proc/sys/fs/file-max 查看 /**示例: getrlimit/setrlimit获取/设置进程打开文件数目**/ int main() { struct rlimit rl;

Socket编程实践(3)

Socket 基础API实践(2)--实现回射服务器 accept函数 功能:从已完成连接队列返回第一个连接,如果已完成连接队列为空,则阻塞. 原型 int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); 参数 sockfd:服务器套接字 addr:将返回对等方的套接字地址 addrlen:返回对等方的套接字地址长度 返回值 On  success, these system calls return a nonneg