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编程的主要内容,如果未能解决你的问题,请参考以下文章