《TCP IP网络编程》尹圣雨——读书小记

之前学了一些网络编程的东西,但还没有系统看过相关书籍,故先选了这本书来读,并记下一些阅读过程中觉得值得记录的东西,作为回顾之用。这里的记录只有Linux下的相关知识,没有Windows的相关操作。

第一章 理解网络编程和套接字

接电话套接字:套接字编程就像电话机。首先要安装电话机(socket函数),接着要给电话机分配号码(bind函数),还要给电话机接上电话线(listen),如果电话响了就可以接听电话了(accept函数)

第二章 套接字类型与协议设置

int socket(int domain, int type, int protocol)

1. domain:协议簇,常用的就是PF_INET(IPV4互联网协议簇)

2. type(数据传输方式):

    1. SOCK_STREAM :面向连接的套接字

    2. SOCK_DGRAM:面向消息的套接字

3. protocol(协议的最终选择):如果前面两个参数已经确定好了协议,则最后一个参数传递0即可。

TCP套接字和UDP套接字不会共用端口号,所以允许重复。

第三章 地址簇与数据序列

这里写图片描述

uint16_t, in_addr等都是POSIX(可移植操作系统接口)定义的数据类型,好处是可扩展,不管到了哪里uint16_t都是两个字节的无符号数。

sin_port和sin_addr都是以网络字节序保存
sin_zero的目的是为了让sockaddr_in和结构体sockaddr保持一致而插入的成员,必须填充为0。

这里写图片描述

对于网络中数据的传输,在传输前会自动将数据转化为网络字节序,接收的数据也会自动转化为主机字节序,不需要程序员手动转化。

in_addr_t inet_addr(const char * string):将字符串信息转化为网络字节序的整数型,如果返回值等于INADDR_NONE,则出错(1.2.3.256则会出错)

int inet_iton(const char * string, struct in_addr * addr),成功返回1,失败返回0,string转化之后的值存放在addr中。

char * inet_ntoa(struct in_addr adr):将网络字节序转化为字符串形式。

这里写图片描述

这里的memset是为了让sin_zero初始化为0。

在监听服务器上所有IP地址时,可以使用INADDR_ANY。
这里写图片描述

#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char * argv[]) {
    char * ip = "127.12.11.11";
    char * port = "4000";
    struct sockaddr_in addr;
    //这是必须的,因为最后的8位为0
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    //字符串转换为地址的第一种方法
    inet_aton(ip, &addr.sin_addr);
    //第二种方法:addr.sin_addr.s_addr = inet_addr(ip);
    //字符串转化为整数再转化为网络字节序
    addr.sin_port = htons(atoi(port));
    //地址转化为字符串
    char * str_ptr = inet_ntoa(addr.sin_addr);
    //这里要格外注意,inet_ntoa返回一个char *,而这个char *的空间是在inet_ntoa里面静态分配的,所以inet_ntoa后面的调用会覆盖上一次的调用。所以最好先复制出来
    char str_arr[20];
    strcpy(str_arr, str_ptr);
    printf(
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值