Linux下面的C开发---Socket编程


来说Linux的网络编程。

      首先说几个常用的网络工具
      Ping  很著名的工具了,测试网络是否正常全靠这个小玩意了。捎带说一句,ping的底层是ICMP协议。并非TCP/IP协议。
     netstat 查看当前系统中开启的所有服务状态,我们写完的网络程序运行的时候,可以用这个工具在终端里面看一下状态。
     ifconfig 查看系统的网络配置信息,比如IP地址,子网掩码,网关,主机名等等。
     然后我们再说说网络的基本概念
     在计算机网络中有一个很重要的概念就是主机地址,数据的传输完全依靠主机地址来路由。像经常写的192.168.0.34只是一个IP地址,这个地址是容易被人类所识别的。但不是计算机所采用的编码方式。计算机采用的是一个网络字节方式,现在我们开看看IP地址的转换。
            inet_addr   //把字符串转换为整数(网络字节序)
            inet_aton        //把字符串转换为struct in_addr;(网络字结序)
            #inet_network//把字符串转换为整数(本地字节序)
            inet_ntoa        //把结构体转换为字符串
            htons     将一个无符号短整型数值转换为网络字节序
            htonl      将一个无符号长整型数值转换为网络字节序
            ntohs     将网络字节序转换成短整数
            ntohl      将网络字节序转换成长整数
现在上代码吧 。先看UDP编程模型。
int main(){
    int fd;
    struct sockaddr_in ad;
    struct sockaddr_in ad_snd;
    int len;
    int r;

   fd=socket(AF_INET,SOCK_DGRAM,17);
   if(fd==-1){
       printf("Init Sock Faile!\n");
       exit(0); 
    }
   printf("Socket Success\n");
  
   ad.sin_family=AF_INET;
   ad.sin_port=htons(9999);
   ad.sin_addr.s_addr=inet_addr("192.168.0.34");
 
  r=bind(fd,(struct sockaddr*)&ad,sizeof(ad));
  if(r==-1){
     printf("Bind Faile\n");
     exit(0);
  }
  char buf[100];
 
  while(1){
              len=sizeof(ad_snd);
              recvfrom(fd,&buf,sizeof(buf),0,(struct sockaddr*)&ad_snd,&len);
              //这里应该判断读取的状态,如果正常则输出数据
              //一下的输出略去....
                
   }

}


上面的代码就是一个UDP编程,它接受到数据后将发送方的IP地址存放到一个sockaddr_in 结构体中,然后就可以输出这个结构体的信息。也就可以知道是谁发来的数据了。因为UDP只能用在对等模型中,所以这就是一个最大的弊病。

好了,真困。 顺便说句,YLMF的OS跟Ubuntu真的太像了,简直就是一个模子出来的。中国的山寨太强大了!
不过使用这个LINUX作开发也挺舒服,至少工具都全了。不用再东奔西跑找包了。

相关内容