sockaddr sockaddr_in in_addr

结构
sockaddr
sockaddr_in
in_addr

函数
inet_ntoa
inet_addr
htons
htonl
ntohs
ntohl

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

sockaddr是通用IP地址的结构,sa_data中的数据含义要看sa_family说明的协议类型是什么,
sockaddr的内容是网络字节顺序(big-endian)
struct sockaddr_in
{
   short sin_family;
   unsigned short sin_port;
   struct in_addr sin_addr;
   char sin_zero[8];
};

sin_family在sockaddr可以转换成sockaddr_in来用,端点地址,必须是AF_INET。
在sockaddr的sin_addr是一个in_addr结构,来说明ip地址,
struct in_addr
{
   union
  {
      struct{u_char s_b1,s_b2, s_b3, s_b4;} S_un_b;
      struct{ u_short s_w1,s_w2; } S_un_w; 
      u_long  S_addr;
  }S_un;
};

S_un_b    Address of the host formatted as four u_chars .
S_un_w   Address of the host formatted as two u_shorts .
S_addr    Address of the host formatted as u_long

使用函数 char FAR* inet_ntoa (struct in_addr  in); 可以将in_addr结构的地址装为字符串的ip地址,形如:192.16.1.1
使用函数 unsigned long inet_addr ( const char FAR*  ip);可以将字符串形式的ip地址转换成in_addr结构形式的地址

  例子:

  int   sockfd; 
  struct   sockaddr_in   my_addr;                                  //定义一个端口地址
  sockfd   =   socket(AF_INET,   SOCK_STREAM,   0);     //创建套接字
  
  my_addr.sin_family   =   AF_INET;                              //必须是
  my_addr.sin_port   =   htons(MYPORT);                      //使用htons把计算机字节顺序转换成网络字节顺序
  my_addr.sin_addr.s_addr   =   inet_addr("192.168.0.1");  //
 
  ZeroMemory(&(my_addr.sin_zero),   8);     //最后8个必须字节为0
   
  bind(sockfd,   (struct   sockaddr   *)&my_addr,   sizeof(struct   sockaddr));

u_short htons(u_short netshort);  // h ost to n et  s hort  计算机的u_short字节顺序转换为网络的字节顺序
u_short htonl(u_short netlong); // host to net  long  计算机的u_long字节顺序转换为网络的字节顺序
u_long ntohl(u_long  netlong); // net to host long  网络的字节的u_long字节顺序转换为计算机的字节顺序
u_short ntohs(u_short netshort); // net to host short  网络的字节的u_short字节顺序转换为计算机的字节顺序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户端 在网络程序中,如果一个程序主动和外面的程序通信,那么我们把这个程序称为客户端程序。 比如我们使用ftp程序从另外一 个地方获取文件的时候,是我们的ftp程序主动同外面进行通信(获取文件), 所以这个地方我们的ftp程序就是客户端程序。 服务端 和客户端相对应的程序即为服务端程序。被动的等待外面的程序来和自己通讯的程序称为服务端程序。 比如上面的文件获取中,另外一个地方的程序就是服务端,我们从服务端获取文件过来。 [代码] [C/C++]代码 /******* 服务器程序 (server.c) ************/ #include #include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { int sockfd,new_fd; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int sin_size,portnumber; char hello[]="Hello! Are You Fine?\n"; if(argc!=2) { fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]); exit(1); } if((portnumber=atoi(argv[1]))<0) { fprintf(stderr,"Usage:%s portnumber\a\n",argv[0]); exit(1); } /* 服务器端开始建立socket描述符 */ if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { fprintf(stderr,"Socket error:%s\n\a",strerror(errno)); exit(1); } /* 服务器端填充 sockaddr结构 */ bzero(&server;_addr,sizeof(struct sockaddr_in)); server_addr.sin_family=AF_INET; server_addr.sin_addr.s_addr=htonl(INADDR_ANY); server_addr.sin_port=htons(portnumber); /* 捆绑sockfd描述符 */ if(bind(sockfd,(struct sockaddr *)(&server;_addr),sizeof(struct sockaddr))==-1) { fprintf(stderr,"Bind error:%s\n\a",strerror(errno)); exit(1); } /* 监听sockfd描述符 */ if(listen(sockfd,5)==-1) { fprintf(stderr,"Listen error:%s\n\a",strerror(errno)); exit(1); } while(1) { /* 服务器阻塞,直到客户程序建立连接 */ sin_size=sizeof(

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值