linux网络编程(1)

     首先说明为什么需要学习linux的网络编程 ,linux的最大的优势就是网络,并且现在是网络的时代,掌握linux的网络编程对于自己的技能事关重要。除此之外,互联网的一些大企业百度,新浪,163,淘宝这些都是网络中的服务器。

那么linux下的网络编程 ,首先要明白什么是socket套接字。Socket是介于应用层和复杂的TCP/IP协议层之间的一种接口,我们直接用这个接口进行开发就可以了。Socket使用问价关闭打开的思想,也需要关闭。

函数原型如下:

 int  socket(int protofamily, int type, int protocol);//返回sockfd

sockfd描述符。

 socket函数对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字,而socket()用于创建一个socket描述符(socket descriptor),它唯一标识一个socket。这个socket描述字跟文件描述字一样,后续的操作都有用到它,把它作为参数,通过它来进行一些读写操作。

      正如可以给fopen的传入不同参数值,以打开不同的文件。

     创建socket的时候,也可以指定不同的参数创建不同的socket描述符,socket函数的三个参数分别为:

l protofamily:即协议域,又称为协议族(family)。

     常用的协议族有,AF_INET(IPV4)AF_INET6(IPV6)AF_LOCAL(或称AF_UNIXUnixsocket)、AF_ROUTE等等。协议族决定了socket的地址类型,在通信中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。

l type:指定socket类型。常用的socket类型有,SOCK_STREAMSOCK_DGRAMSOCK_RAWSOCK_PACKETSOCK_SEQPACKET等等。

l protocol:故名思意,就是指定协议。常用的协议有,IPPROTO_TCPIPPTOTO_UDPIPPROTO_SCTPIPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议()。

注意:并不是上面的typeprotocol可以随意组合的,如SOCK_STREAM不可以跟IPPROTO_UDP组合。当protocol0时,会自动选择type类型对应的默认协议。

当我们调用socket创建一个socket时,返回的socket描述字它存在于协议族(address familyAF_XXX)空间中,但没有一个具体的地址。如果想要给它赋值一个地址,就必须调用bind()函数,否则就当调用connect()listen()时系统会自动随机分配一个端口。

 

通过上边的描述我们就知道,当我们创建一个TCP socket的时就可以这么写

control_sock = socket(AF_INET,SOCK_STREAM,0);   蓝色部分表示是TCP,要注意区分。

    

 

此外在TCP server的编程中 需要调用bind()函数。


调用此函数的目的在于将结构体的参数值绑定到本地的设置上。

 

如下示例

 /* 服务器端填充 sockaddr结构 */ 

    bzero(&server_addr,sizeof(struct sockaddr_in)); // 初始化,0

    server_addr.sin_family=AF_INET; // Internet

    server_addr.sin_addr.s_addr=htonl(INADDR_ANY); //INADDR_ANY 表示可以接收任意IP地址的数据,即绑定到所有的IP

      server_addr.sin_port=htons(portnumber); // (将本机器上的short数据转化为网络上的short数据)端口号

    

    /* 捆绑sockfd描述符到IP地址 */ 

    if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1) 

    { 

        fprintf(stderr,"Bind error:%s\n\a",strerror(errno)); 

        exit(1); 

    } 

红色部分需要解释一下

INADDR_ANY选项
    网络编程中常用到bind函数,需要绑定IP地址,这时可以设置INADDR_ANY
    INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或所有地址任意地址。也就是表示本机的所有IP,因为有些机子不止一块网卡,多网卡的情况下,这个就表示所有网卡ip地址的意思。
    比如一台电脑有3块网卡,分别连接三个网络,那么这台电脑就有3ip地址了,如果某个应用程序需要监听某个端口,那他要监听哪个网卡地址的端口呢?如果绑定某个具体的ip地址,你只能监听你所设置的ip地址所在的网卡的端口,其它两块网卡无法监听端口,如果我需要三个网卡都监听,那就需要绑定3ip,也就等于需要管理3
套接字进行数据交换,这样岂不是很繁琐?
    所以你只需绑定INADDR_ANY,管理一个套接字就行,不管数据是从哪个网卡过来的,
只要是绑定的端口号过来的数据,都可以接收到。

 

当客户端编程时,便不再使用INADDR_ANY选项必须指明要连接哪个服务器IP

 

 

 

 

 

sitemap