Linux下的简单socket编程示例

API中用到的结构体

#1. struct sockaddr
struct sockaddr {
    u_char  sa_len;

    u_short sa_family;     // address family, AF_xxx

    char    sa_data[14];   // 14 bytes of protocol address

};
sockaddr包含两部分内容:
1. 短整型sa_family定义了地址家族类型,这个类型会用于socket()函数
2. 14字节的sa_data数组预留保存本身的地址
注意:
1.原本没有sa_len
2. 根据sa_family的不同类型,sa_data里存放的可能是IP地址也可能是socket端点(socket endpoint)
3. 为了处理这个结构体,另一个结构体常常被用到sockaddr_in(in是internal的意思)
#2. struct sockaddr_in
struct sockaddr_in {
    u_char  sin_len;

    u_short sin_family;        // Address family

    u_short sin_port;          // Port number

    struct  in_addr sin_addr;  // Internet or IP address

    char    sin_zero[8];       // Same size as struct sockaddr

};
1. sin_family和sockaddr中的sa_family一样
2. sin_port是端口号
3. sin_zero是保留段,一般全部置0
4. sin_addr和sin_port必须是符合网络字节流顺便的编码
API中常用的方法
#1. int socket(int domain, int type, int protocol);
1. domain应该设置为AF_INET,和sockaddr_in中一致
2. type告诉系统内核是那一种socket,比如SOCK_STREAM or SOCK_DGRAM
3. protocal一般是0,或者使用getprotobyname()方法获取
4. 这个方法的返回值是一个socket 辨识字(socket descriptor),可用来接下来的系统调用int bind(int sockfd, struct sockaddr *my_addr, int addrlen);

#2. int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
1. sockfd就是上个方法中放回的辨识字
2. addrlen可以用sizeof(struct sockaddr)
#3. int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
#4. int listen(int sockfd, int backlog);

 

1. backlog 确定等待连接队列的长度

2. 应该在使用listen之前调用bind方法,否则系统将会使用一个随机端口

 

#5. int accept(int sockfd, struct sockaddr *addr, int *addrlen);

 

#6. ssize_t write(int fd, const void *buf, size_t count);

 

#7. ssize_t read(int fd, void *buf, size_t count);

 

 

 

 

#8. int close(int sockfd);

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值