`
freesoftman
  • 浏览: 313249 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Linux编程 sockaddr_in sockaddr in_addr详解。

阅读更多
 
#include<stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define SERVPORT 3333
#define MAXDATASIZE 100 /*每次最大数据传输量 */
main(int argc, char *argv[]){
  int sockfd, recvbytes;
  char buf[MAXDATASIZE];
  struct hostent *host;
  struct sockaddr_in serv_addr;
  if (argc < 2) {
fprintf(stderr,"Please enter the server's hostname!\n");
exit(1);
}
  if((host=gethostbyname(argv[1]))==NULL) {
herror("gethostbyname出错!");
exit(1);
}
  if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
perror("socket创建出错!");
exit(1);
}
  serv_addr.sin_family=AF_INET;
  serv_addr.sin_port=htons(SERVPORT);
  serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
  bzero(&(serv_addr.sin_zero),8);
  if (connect(sockfd, (struct sockaddr *)&serv_addr, \
   sizeof(struct sockaddr)) == -1) {
perror("connect出错!");
exit(1);
}
  if ((recvbytes=recv(sockfd, buf, MAXDATASIZE, 0)) ==-1) {
perror("recv出错!");
exit(1);
}
  buf[recvbytes] = '\0';
  printf("Received: %s",buf);
  close(sockfd);
}

 

 

今天了解了一下socket编程。按照网上的例子写了个Client/Server的简单例子!

 

在写代码过程中,有几个问题很让我费解!

 

如上代码,是一个客户段程序,其中通过方法gethostbyname进行域名于IP的转换。返回一个hostend的结构体。如下:

 struct hostent {
    char *h_name; /* 主机的官方域名 */
   char **h_aliases; /* 一个以NULL结尾的主机别名数组 */
   int h_addrtype; /* 返回的地址类型,在Internet环境下为AF-INET */
   int h_length; /* 地址的字节长度 */
   char **h_addr_list; /* 一个以0结尾的数组,包含该主机的所有地址*/
};
#define h_addr h_addr_list[0] /*在h-addr-list中的第一个地址*/

sockaddr_in结构体:

struct sockaddr_in {
     short int sin_family; // Address family
     unsigned short int sin_port; // Port number
     struct in_addr sin_addr; // Internet address
     unsigned char sin_zero[8]; // Same size as struct sockaddr
};

 

sockaddr结构体:

struct sockaddr {
      unsigned short sa_family; // address family, AF_xxx
      char sa_data[14]; // 14 bytes of protocol address
};

 

in_addr结构体:

struct in_addr {
      unsigned long s_addr; // that’s a 32-bit long, or 4 bytes
};

 

 

 

在填充sockaddr_in结构体时:serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
sockaddr_in与sockaddr都是16个字节,只是sockaddr的表现形式更形象,对象化而已。而in_addr结构体就是一个long型

 

可以猜测h_addr_list是一个4字节网络字节序的in_addr,只是使用char*来表示,h_addr与struct in_addr其实形式是一样的。然后将host->h_addr强转成struct in_addr格式的指针,最后取值。(哈哈,这个就是C比Java强悍的地方,指针可真是一把双面刃).

分享到:
评论

相关推荐

    Linux C中sockaddr和sockaddr_in的区别

    主要介绍了Linux C中sockaddr和sockaddr_in的区别的相关资料,需要的朋友可以参考下

    linux 发送原始数据包

    memset(&socket_msg-&gt;addr, 0, sizeof(struct sockaddr_ll)); if(-1 == (socket_msg-&gt;sd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP)))){ //创建套接字 SOCK_RAW为原始套接字 return -2; } socket_...

    VB-API.rar_API_api vb versionEx_vb api_vb api sockaddr_in

    VB的函数大全,从网上下载的,VB调用API的函数,希望各位能有用

    网络文件传输程序

    struct sockaddr_in server_addr; struct sockaddr_in client_addr; char buff[BUFSIZ]; char fname[255]; //用于存放文件名 FILE * fp; server_addr.sin_family = AF_INET; server_addr.sin_port = htons...

    apache启动报错:httpd: apr_sockaddr_info_get() failed

    重启apache:service httpd restart虽然重启成功,但却给出如下的提示信息:httpd: apr_sockaddr_info_get() failed for hoteelhttpd: Could not reliably determine the server’s fully qualified domain name, ...

    Linux网络编程 Socket UDP形式(包括服务器端和接收端)

    struct sockaddr_in my_addr; //服务器网络地址结构体 struct sockaddr_in their_addr; //客户端网络地址结构体 int sin_size; if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1) { perror("socket"); exit(1);...

    利用socket实现通信

    struct sockaddr_in local; struct sockaddr_in from; int fromlen =sizeof(from); local.sin_family=AF_INET; local.sin_port=htons(1000); ///监听端口 local.sin_addr.s_addr=INADDR_ANY; ///本机

    Socket编程

    Struct sockaddr_in{ Uint8_t sin_len;//IPv4 为固定的16 字节长度 Sa_family_t sin_family; //地址簇类型,为AF_INET In_port_t sin_port; //16 位端口号,网络字节序 Struct in_addr sin_addr; // 32 位IP 地址 ...

    linux网络编程(编程初步)

    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...

    telnet_clinet.zip

    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]);...

    从本机的3000端口接收日志

    struct sockaddr_in addrSendMinitor; memset(&addrSendMinitor,0,sizeof(sockaddr_in)); addrSendMinitor.sin_family = AF_INET; addrSendMinitor.sin_addr.s_addr = inet_addr("127.0.0.1");// 从配置文件获取...

    linux课程基本原理

    linux课程资源in_size=sizeof(struct sockaddr_in); if((new_fd=accept(sockfd,(struct sockaddr *)(&client;_addr),&sin;_size))==-1) { fprintf(stderr,"Accept error:%s\n\a",strerror(errno)); exit(1); } ...

    Socket编程 c语言 (最新 带例程 可直接编译运行)

    struct sockaddr_in remote_addr; /* 客户端地址信息 */ if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror( "socket创建出错!"); exit(1); } my_addr.sin_family=AF_INET; my_addr.sin_port=...

    网络编程函数(练习与实例)

    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...

    C++网络数据发送与接收

    sockaddr_in clientService; clientService.sin_family = AF_INET; clientService.sin_addr.s_addr = inet_addr( "127.0.0.1" ); clientService.sin_port = htons( 8000 ); if ( connect( client, (SOCKADDR*...

    套接字编程

    SOCKADDR_IN Server_Addr; if ((ret = WSAStartup(MAKEWORD(2,2), &wsadata)) != 0) { printf("WSAStartup failed with error %d\n", ret); return; } if ((Listen_Socket = socket(AF_INET, SOCK_STREAM,...

    linux网络编程学习笔记

    struct in_addr sin_addr; unsigned char sin_zero[8]; 我们主要使用 Internet所以 sin_family 一般为 AF_INET,sin_addr设置为 INADDR_ANY 表 示可以 和任何的主机通信,sin_port 是我们要监听的端口号.sin_zero[8...

    JAVA局域网飞鸽传书软件设计与实现

    struct in_addr sin_addr; har sin_zero[8]; }; 应用程序可以使用inet_addr函数将一个小数点分隔的十进制IP地址字符串转化成由32位二进制数表示的IP地址。inet_ntoa函数将一个网络字节顺序的32位IP地址转化...

    UDP.rar_IPPROTO_UDP_UDP监听_WSAStartup_sock_DGRAM

    SOCKADDR_IN ReceiverAddr //接收端的地址信息 char ReceiveBuf[1024] //接收数据缓冲区大小 int BufLength //缓冲区长度 SOCKADDR_IN SenderAddr //发送数据端地址信息 int SenderAddrSize = sizeof...

    socket网络编程

    struct sockaddr_in attr = { .sin_family = AF_INET, .sin_port = htons(NET_PORT), .sin_addr = { .s_addr = inet_addr(IP_ADDR), }, }; if(bind(serv_sockfd, (struct sockaddr*)&attr, sizeof(attr...

Global site tag (gtag.js) - Google Analytics