linux网络编程Internet Socket地址,套接字,和函数

文章内容节选《linux/UNIX 系统网络编程》

Internet domain socket地址有两种:IPv4 IPv6

IPv4被存储在结构体中, 该结构体在 netinet/in.h 中进行定义

cd usr/include/netinet/in.h
struct in_addr
{in_addr_t s_addr;    //32位IPv4地址
}struct sockaddr_in
{sa_family_t     sin_family;  //地址族in_port_t       sin_port;    //16位TCP/UDP端口号struct in_addr  sin_addr;    //32位IP地址unsigned char   __pad[X];     //不用这个
};

sin_family

每种协议族适用的地址族均不同.如IPv4使用4字节地址族,IPv6使用16字节地址族.sa_family是协议簇通常大多用的是都是AF_INET,表示tcpip协议。

用法

struct sockaddr_in server_address;
server_address.sin_family=AF_INET;
AF_INET(又称 PF_INET)是 IPv4 网络协议的套接字类型
AF_INET6 则是 IPv6 的

sin_port

以网络字节序保存16位端口号
为了使网络程序具有可移植性,使同样的C代码在大端和小段计算机上编译后都能正常运行,可以调用以下库函数做网络字节序和主机字节序的转换。

#include <arpa/inet.h>
uint16_t htons(uint16_t hostshort);
h表示Host,n表示Network,l表示32为长整数,s表示16位短整数 
如果主机是小端字节序,这些函数将参数做相应的大小端转换后返回 
如果主机是大端字节序,这些函数不做转换,将参数直接返回

用法:

int main(int argc, char* argv[])
{
//输入./a.out 192.168.42.1 9000
addr.sin_port = htons(atoi(argv[2]));
}

sin_addr

用法

server_address.sin_addr.s_addr=inet_addr("127.0.0.1");

以网络字节序保存32位IP地址信息.

socket套接字:

socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket就是该模式的一个实现,
socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭).
说白了Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。

套接字描述符

其实就是一个整数,我们最熟悉的句柄是0、1、2三个,0是标准输入,1是标准输出,2是标准错误输出。0、1、2是整数表示的,对应的FILE *结构的表示就是stdin、stdout、stderr

文件描述符对象FILE *
0标准输入Standard Inputstdin
1标准输出Standard Outputstdout
2标准错误Standard Errorstderr

基于TCP/IP的服务器端/客户端函数调用关系

这里写图片描述

TCP客户端的默认函数调用顺序

  • socket()创建套接字
  • connect()请求连接
  • read()/write()交换数据
  • close()断开连接

TCP服务器端的默认函数调用顺序

  • socket()创建套接字
  • bind()分配套接字地址
  • listen()等待连接请求状态
  • accept()允许连接
  • read()/write()数据交换
  • close()断开连接

函数

创建socket套接字(TCP/UDP,客户端+服务器)

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

绑定端口号(TCP/UDP,服务器)

int bind(int socket,const struct sockaddr *address,socklen_t address_len);

开始监听socket(TCP,服务器)

int listen(int socket,int backlog);

接收请求(TCP,服务器)

int accept(int socket,struct sockaddr *address,socklen_t *address_len);

建立连接(TCP,客户端)

int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈socket网络编程函数参数(一)

socket函数解析 概念: 每个进程的进程空间里都有一个socket描述符表。套接字描述符表属于一个进程&#xff0c;而socket地址结构位于操作系统的内核缓冲。 函数原型 #include <sys/socket.h>int socket(int domain, int type, int protocol);函数参数 family参数 默…

C++ const 与 extern

C语言中&#xff0c; const修饰的全局变量是外部链接属性&#xff0c;比如在 a.c文件中有 const int m_a 10; 在b.c中想用这个全局变量&#xff0c; 在b.c中这样 extern const int m_a; 就可以使用a.c中的m_a C 语言中&#xff0c; const修饰的全局变量是内部链接属性&#x…

浅谈socket网络编程函数参数(二)

bind()函数 bind()函数把一个地址族中的特定地址赋给socket。 例如对应AF_INET、AF_INET6就是把一个ipv4或ipv6地址和端口号组合赋给socket。 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);参数解析 sockfd&#xff1a;即socket描述字&#xff0c…

对引用的理解3

对数组的引用&#xff0c; 相关语法 int main() { //引用于法// type &引用名 原名//数组的引用//1) 先定义一个数组int array[10];int (&refArray)[10] array;for (int i 0; i < 10; i) {array[i] i;}for (int i 0; i < 10; i) {cout << refArray[i…

运算符与,|与||的区别

|和&是位运算&#xff0c;运算结果是二进制数。 &&,||是逻辑运算&#xff0c;运算结果是真&#xff0c;或者假。 6&3110&0110102 6|3110|0111117&, &&和||计算时注意&#xff0c; 题目&#xff1a;条件1&&条件2&&条件3 如…

C++ 对引用的理解4

引用的注意事项 // 引用注意事项&#xff0c; 不能返回局部变量的引用 int & test3() { //因为局部变量出了函数体外 就会被销毁int a 10;return a; }// 引用注意事项&#xff0c; 返回值如果是引用&#xff0c; 那么函数可以作为左值进行运算 int & test4() {static…

关于argc和argv的输出

代码 #include <stdio.h>int main(int argc ,char * argv[]) {printf("argc ->%d\n",argc);for(int i 0; i < argc;i){printf("%s\n",argv[i]);}return 0; } 输出结果 [koulocalhost 8_6网络计算器]$ ./a.out 192.168.1.1 9000 argc ->…

C++ 对引用的理解5

常量引用 int main() { // int &m 10; // 错误&#xff0c; 引用必须引一块合法的内存空间&#xff08;什么是合法的内存空间&#xff0c; 这个10在程序中有内存吗&#xff1f;&#xff09;const int &m 10; //加入const后&#xff0c;语法就通过了&#xff0c;编译…

为什么计算机起始时间是1970年1月1日

1969年8月&#xff0c;贝尔实验室的程序员肯汤普逊利用妻儿离开一个月的机会&#xff0c;开始着手创造一个全新的革命性的操作系统&#xff0c;他使用B编译语言在老旧的PDP-7机器上开发出了Unix的一个版本。随后&#xff0c;汤普逊和同事丹尼斯里奇改进了B语言&#xff0c;开发…

C++ 使用extern C简单使用

先说一下函数重载&#xff0c; C 之所以会进行函数重载&#xff0c; 是因为对函数名进行二次修饰(重新命名) 在C文件中写好的程序&#xff0c; C引入过来&#xff0c;却没法使用提示 无法连接的外部符号&#xff0c;那是因为C按照C的函数命名机制来寻找函数的实现. 第一种情况&…

IP数据包格式netinet/ip.h

转载地址https://www.cnblogs.com/embedded-linux/p/4986449.html 头文件netinet/ip.h中定义ip&#xff1a; struct ip{#if __BYTE_ORDER __LITTLE_ENDIANunsigned int ip_hl:4; /* header length */unsigned int ip_v:4; /* version */#endif#if __BYTE_ORDER __BIG_ENDIA…

c 结构体的简单封装1

先看C语言的 借助结构体 struct Person{char name[64];int age; }; void PersonEat(struct Person *p) {printf("%s在吃饭", p->name); } void test() {struct Person p;strcpy(p.name, "隔壁老王");PersonEat(&p); }

C++ 构造函数分类以及调用

#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std;//1、分类 //按照参数进行分类 有参构造函数 无参构造函数&#xff08;默认构造函数&#xff09; //按照类型进行分类 普通构造函数 拷贝构造函数 class Person { public://默认构造Per…

内存泄漏Valgrind

#内存泄漏Valgrind valgrind --toolmemcheck --leak-checkfull [Your progame option]; https://cloud.tencent.com/developer/article/1006199 https://www.cnblogs.com/zhoudayang/p/6110360.html https://www.cnblogs.com/napoleon_liu/articles/2001802.html https://…

C++ 拷贝构造函数的使用场景

#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std;class Person { public:Person(){cout << "默认构造函数调用" << endl;}Person(int a){m_Age a;cout << "有参构造函数调用" << endl;}Person(co…

大数据多路归并算法

https://blog.csdn.net/wongson/article/details/49209903 先把一个大的数据分成若干小份&#xff0c;然后对这些小份文件进行排序。排序好之后对这些小份文件进行如下处理。 我们举个简单的例子&#xff1a; 文件1&#xff1a;3,6,9 文件2&#xff1a;2,4,8 文件3&#xff…

C++ 深浅拷贝 01

1.C中成员对象如果指向了堆内存的空间&#xff0c;如果这时候使用了系统提供的拷贝构造函数&#xff08;默认浅拷贝&#xff09;&#xff0c;会造成内存重复释放的问题&#xff0c;导致程序down掉&#xff0c;解决办法修改默认的拷贝构造函数&#xff0c;也给新的对象需要堆内存…

文件描述符和fcntl及阻塞非阻塞

Linux 文件描述符和重定向 https://www.cnblogs.com/chenmh/p/5382044.html fcntl函数的用法总结 https://www.cnblogs.com/zxc2man/p/7649240.html 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型 https://www.cnblogs.com/chaser24/p/6112071.html

C++拷贝构造函数的调用时机

#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std;class Person { public:Person(){cout << "默认构造函数调用" << endl;}Person(int a){m_Age a;cout << "有参构造函数调用" << endl;}Person(co…