套接字socket编程—网络编程

网络套接字又叫网际插座,在英文中是Internet Socket。在网络中,套接字扮演的角色正如插座一样,它是一个端点,可以与网络中的其它套接字建立连接。

套接字允许两个进程进行通讯,这两个进程可能运行在同一台机器上,也可能运行在不同的机器上。更准确地说,套接字是使用标准Unix文件描述符来与其它计算机进行通讯的一种方式。

在Unix操作系统中,每一个读写操作都是通过读写文件描述符来完成的。一个文件描述符就是一个与打开的文件相关联的整数,它可以是一个网络连接、一个文本文件、一个终端或其它东西。

【作用】Socket被用于客户端/服务端应用框架中。服务端是一个针对客户端的请求执行某些特定操作的进程。大多数应用层协议如FTP、SMTP和POP3使用Socket来建立客户端与服务端之间的连接,从而进行数据的交换。

1、套接字地址结构:

struct sockaddr {
  sa_family_t sa_family;
  char sa_data[14];
};

sa_family表示套接字的协议族类型,对应于TCP/IP协议该值为AF_INET;成员sa_data存储具体的协议地址。

sa_data之所以被定义成14个字节,因为有的协议族使用较长的地址格式。

一般在编程中并不对该结构体进行操作,而是使用另一个与它等价的数据结构:sockaddr_in

每种协议族都有自己的协议地址格式,TPC/IP协议族的地址格式为结构体struct sockaddr_in在netinet/in.h头文件中定义。

struct sockaddr_in
{
  unsigned short   sin_family;
  unsigned short   sin_port;
  struct in_addr    sin_addr; /* Internet address. */
  unsigned char    sin_zero[8];
};
sin_family表示地址类型,对于使用TCP/IP协议进行的网络编程,该值只能是AF_INET。

sin_port是端口号

sin_addr用来存储32位的ip地址。

sin_zero为填充字段,一般赋值为0

struct in_addr的定义如下:

struct in_addr{
  unsigned long  s_addr;
};

      结构体sockaddr 的长度为16个字节,结构体sockaddr_in的长度也为16个字节。通常在编写基于TCP/IP协议的网络程序时,使用结构体sockaddr_in来设置地址,然后通过强制类型转换成sockaddr 类型。

以下是设置地址信息的示例代码:

struct sockaddr_in sock;
sock.sin_family = AF_INET ;
sock.sin_port = htons(6000);
sock.sin_addr.s_addr = inet_addr("200.200.3.18");
memset(sock.sin_zero, 0, sizeof(sock.sin_zero)); 

2、创建套接字

socket函数用来创建一个套接字。

int socket(int domain, int type, int protocol);

参数domain用于指定创建套接字所使用的协议族,

常用的协议族:

AF_UNIX, AF_LOCAL 创建只在本机内进行通信的套接字
AF_INET     使用 IPv4   TCP/IP 协议
AF_INET6      使用 IPv6    TCP/IP 协议

参数type指定套接字的类型,可取如下值:

SOCK_STREAM 创建TCP流套接字

SOCK_DGRAM 创建UDP数据报套接字

SOCK_RAW 创建原始套接字

参数protocol通常设置为0,表示通过参数domain指定的协议族和参数type指定的套接字类型来确定使用的协议。当创建原始

套接字时,系统无法唯一地确定协议,此时就需要使用该参数指定所使用的协议。

===============================================

创建TCP套接字:

int sock_fd;
sock_fd = socket(AF_INET, SOCK_STREAM, 0);
if  (sock_fd  <  0)
{
  perror("socket error:");
  exit(1);
}

创建UDP套接字:

int sock_fd;
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);

猜你喜欢

转载自blog.csdn.net/sinat_21026543/article/details/80041161