Socket编程基础

来源:互联网 发布:前瞻数据库账号 编辑:程序博客网 时间:2024/06/05 07:10

首先我们来弄明白一些概念,

第一个:什么是SocketSocket简单的说就是套接字,它的作用就是在两个通信端点

之间建立一个‘通道’,通信双方的所有信息交流都通过这个‘通道’来完成。

其原型为:  

SOCKET socket (int af, int type, int protocol );

参数意义:

    af: address family 地址族,用于指出这个创建的socket所用的地址类型。

       UNIX系统支持的地址族包括:

                AF_UNIX       内部地址

                AF_INET       TCP/IP地址                     

                AF_NX         Xerox NS地址                    

                AF_MPLINK    ARPANET IMP(接口报文处理机)地址

AF_APPLETALK Apple公司的Appletalk地址。

       DOS and Windows 系统下紧紧支持:

                AF_INET       TCP/IP地址 

Type : 新套接字的类型描述符,Socket支持的套接字类型有:

            SOCKET_STREAM    流式socket

            SOCKET_DGRAM     数据报socket

            SOCKET_RAW        原始socket

            SOCKET_SEQPACKET 定序分组socket

            SOCKET_RDM        可靠发送的消息

根据常见的情况,这里我们只对SOCKET_STREAM(流式套接字)SOCKET_DGRAM(数据报套接字)加以详细的说明解释,其它几种类型的套接字

大家在使用时再个别查找吧。

1.    流式套接字

流式套接字提供双工、有序、可靠但无边界记录的数据流服务,它适合于大量的数据传输和对数据可靠性较高的情况下。流式套接字使用传输控制协议TCP。在使用流式套接字之前,我们必须在数据发送端和数据接受端建立连接,根据TCP协议的特点我们知道,它的传输可靠性是建立在数据校验及选择重传基础之上的,从而也就加大了系统的开销。

2.    数据报套接字

数据报套接字支持双向的数据流,但不保证传输的可靠性、有序性和无重复性。它记录数据的边界,数据报套接字适合于数据小或者数据发送双方同在一个局域网之内的情况。使用数据报套接字,不需要在数据发送之前建立连接,只需指定目的地址就可以了。所以编程较为简单、灵活。

     Protocol : 使用的协议类型,有如下3种选择:

                IPPROTO_TCP   TCP协议

                IPPROTO_UDP   UDP协议

                0               不指定,由系统自动指定。

返回值: 如果无错误发生,socket返回引用一个新的可用的套接字描述符。否则返回

SOCKET_ERROR错误,我们可以调用WSAGetLastError()获取相应的错误代码,至于具体有哪些错误代码,大家可以在MSDN的帮助文档中找到,这里不做说明。

+++++++++++++++++++++++++++++++++++++

                                    

当我们得到一个套接字描述符之后我们接着要做什么呢?大家都知道,我们在网上和别人通信是靠IP地址,因此我们还要把这个新创建的套接字与我们的地址绑定起来。我们使用bind()函数。原型如下:

int bind(SOCKET s,const struct sockaddr FAR*  name,int namelen);

参数意义:

S : 待绑定的套接字描述符(我们已经创建的)。

Name : 指向分配给套接字的地址指针

Namelen : name包含的地址的字节长度

返回值 : 如果成功返回0,失败返回SOCKET_ERROR.

补充说明 :

      1.关于bind()函数:本函数适用于未连接的数据报或流类套接字,在connectlisten调用前使用。

      2.关于struct sockaddr结构体类型

  struct sockaddr IP地址结构,其定义为:

        struct sockaddr {
u_short   sa_family;
              char       sa_data[14];
}; 
       此结构体在具体的编程中使用的不多,较常用的是结构体类型sockaddr_in 
        我们可以将sockaddr_in类型方便的转换为 sockaddr结构体类型。
        Sockaddr_in结构体定义如下:
        struct sockaddr_in {
              short   sin_family;
              u_short sin_port;
              struct  in_addr sin_addr;
              char    sin_zero[8];
};
       其中sin_family字段必须为AF_INETSin_port为服务端口。Sin_addr是一个4字节的IP地址,
        最后的sin_zero用于填充,使得sockaddr_insockaddr结构长度相同。
+++++++++++++++++++++++++++++++++++++++++++++++
    套接字已经创建而且已经绑定的本地地址,这时我们就可以在这个‘通道’(套接字)
上监听了,看看是否有连接过来。我们使用listen()函数在这个‘通道’上完成监听功能。
Listen()函数原型如下:
int listen (SOCKET s,int backlog);
参数意义 :
S : 已经绑定但还未连接的套接字描述符
backlog : 等待连接的队列的最大长度
  (>>>>>>待续<<<<<)