sock编程

Posted HelloCsz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sock编程相关的知识,希望对你有一定的参考价值。

1.port 1-65535(0保留)

2.UDP发送消息最大(65507字节)

3.ipv4

struct sockaddr//netinet/in.h
{
    sa_family_t sa_family;
    char sa_data[14];
};
struct in_addr
{
    uint32_t s_addr;
};
struct sockaddr_in
{
    sa_family_t sin_family;
    in_port_t sin_port;
    struct in_addr sin_addr;
    char sin_zero[8];
};

sockaddr_in只是sockaddr结构中数据详细视图,在用到sockaddr的地方都将sockaddr_in 转为sockaddr

4.inet_pton(AF_INET,const char* ip,void *dst)//arpa/inet.h

将ip地址(字符串)转为指定二进制(AF_INET),保持在第三个参数中,失败返回0(无效ip地址)/负数(错误)

5.sockaddr_in.sin_port= htons(int port) //netinet/in.h

将端口(整数)转为网络字节

6.ssize_t send(socket,void* msg,size_t msgLen,int flag)//sys/socket.h

默认行为阻塞到发送所有数据为止,flag=0为默认行为,失败返回-1

7.ssize_t recv(socket,void* buf,size_t bufLen,int flag) //sys/socket.h

recv默认阻塞到至少传输一些字符(一般为一个字符),flag= 0为默认行为,失败返回-1,返回值为0指示另一端关闭tcp链接,bufLen应加1为null做预留空间

8.int getaddrinfo(const char *hoststr,const char* servicestr,const struct addrinfo* hints,struct addrinfo **result) //netdb.h

可进行域名解析,且不需要将ip或者port转为网络字节(需要转换的整形变量),成功返回0,失败返回非0;可用来将ip或者port转为网络字节(addrinfo.ai_addr)

可用来获取本机ip,将addrinfo.ai_flag= AI_PASSIVE

9.send/sendto 区别

send()调用返回时,只知道数据已经复制进缓冲区中进行传输,数据还可能会或者不会实际地进行传输(缓冲区为重传做准备)

sendto()调用返回时,就已经把消息传递给底层信道以进行传输

10.recvfrom()

假设接收n个字节,而消息为m个字节,当n<m时,剩余的字节将被悄悄地抛弃,而不会向接收程序指示

recvfrom()标志位设MSG_PEEK可预读第一个数据块

11.字节排序

大端:从高位开始传递;小端:从低位开始传递;

网络字节:大端字节顺序;

主机字节排序可能是大端也可能是小端,两主机之间应协调好

12.setsockopt()

设置缓冲区的大小即使成功也不一定设置成功,它只是提示系统,用户所期望的值

13.

多个进程拥有同一个socket句柄,若其中一个close,其他不做任何操作则socket并不会关闭(可能是引用计数)

进程:复制父进程全部状态(内存,栈,文件/套接字描述符等)

线程:共享与父进程相同的地址空间(代码/数据)

以上是关于sock编程的主要内容,如果未能解决你的问题,请参考以下文章

Python--网络编程-----socket代码实例--聊天软件升级版

VSCode自定义代码片段——JS中的面向对象编程

VSCode自定义代码片段9——JS中的面向对象编程

使用 Pygments 检测代码片段的编程语言

面向面试编程代码片段之GC

如何在 Django Summernote 中显示编程片段的代码块?