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

bind()函数

bind()函数把一个地址族中的特定地址赋给socket。
例如对应AF_INET、AF_INET6就是把一个ipv4或ipv6地址和端口号组合赋给socket。

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

参数解析

  • sockfd:即socket描述字,它是通过socket()函数创建了,唯一标识一个socket。bind()函数就是将给这个描述字绑定一个名字。
  • addr:一个const struct sockaddr *指针,指向要绑定给sockfd的协议地址。这个地址结构根据地址创建socket时的地址协议族的不同而不同,
    ipv4对应的是:
    解析:https://blog.csdn.net/csdn_kou/article/details/81452166
 struct sockaddr_in {sa_family_t    sin_family; /* address family: AF_INET */in_port_t      sin_port;   /* port in network byte order */struct in_addr sin_addr;   /* internet address */
};/* Internet address. */
struct in_addr {uint32_t       s_addr;     /* address in network byte order */
};

addrlen:对应的是地址的长度。

listen()

如果作为一个服务器,在调用socket()、bind()之后就会调用listen()来监听这个socket,如果客户端这时调用connect()发出连接请求,服务器端就会接收到这个请求。

int listen(int sockfd, int backlog);
  • listen函数的第一个参数即为要监听的socket描述字,第二个参数为相应socket可以排队的最大连接个数。
  • socket()函数创建的socket默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求。

connect()函数

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • connect函数的第一个参数即为客户端的socket描述字
  • 第二参数为服务器的socket地址
  • 第三个参数为socket地址的长度。
  • 客户端通过调用connect函数来建立与TCP服务器的连接。

accept()函数

概念

TCP服务器端依次调用socket()、bind()、listen()之后,就会监听指定的socket地址了。TCP客户端依次调用socket()、connect()之后就向TCP服务器发送了一个连接请求。TCP服务器监听到这个请求之后,就会调用accept()函数取接收请求,这样连接就建立好了。之后就可以开始网络I/O操作了,即类同于普通文件的读写I/O操作。

关键点

*accept()会创建一个新的socket,并且正是这个新的socket会与执行connect()的对象socket进行连接。

返回值

accept()的返回结果是已经连接的socket文件描述符
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen); //返回连接connect_fd

用法

        int newfd = -1;struct sockaddr_in cli_addr;newfd = accept(lst_fd, (struct sockaddr*)&cli_addr, &len);if (newfd < 0) {perror("accept error");continue;}
---------------------------------------------------------------socklen_t len = sizeof(struct sockaddr_in);int lst_fd = -1;lst_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);if (lst_fd < 0) {perror("socket error");return -1;}
  • 参数sockfd就是上面解释中的监听套接字,这个套接字用来监听一个端口,当有一个客户与服务器连接时,它使用这个一个端口号,而此时这个端口号正与这个套接字关联。当然客户不知道套接字这些细节,它只知道一个地址和一个端口号。
  • 参数addr
    这是一个结果参数,它用来接受一个返回值,这返回值指定客户端的地址,当然这个地址是通过某个地址结构来描述的,用户应该知道这一个什么样的地址结构。如果对客户的地址不感兴趣,那么可以把这个值设置为NULL。
  • 参数len
    如同大家所认为的,它也是结果的参数,用来接受上述addr的结构的大小的,它指明addr结构所占有的字节个数。同样的,它也可以被设置为NULL。

close()函数

在服务器与客户端建立连接之后,会进行一些读写操作,完成了读写操作就要关闭相应的socket描述字

#include <unistd.h>
int close(int fd);

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

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

相关文章

对引用的理解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…

守护进程nohup的用法

使./a.out后台运行 nohup ./a.out & exit // 如果你使用的bash客户端或者是screen窗口&#xff0c;直接关闭窗口那么该进程也会终止&#xff0c;所以要用exit关于nohup重定向 在使用nohup命令的时候&#xff0c;经常由于输出nohup.out的路径没有写入权限&#xff0c;而无…

C++ 不懂的地方 记录01

C 中初始化列表&#xff0c; 的详细使用&#xff1f;没有默认构造函数的类类型&#xff0c;因为使用初始化列表可以不必调用默认构造函数来初始化&#xff0c;而是直接调用拷贝构造函数初始化 这句话不是很理解 //手机类 class Phone { public:Phone(string pName){cout <&…

简答面向数据报,面向字节流

先来一个例子 用UDP传输100个字节的数据: 面向数据报 如果发送端调用一次sendto, 发送100个字节, 那么接收端也必须调用对应的一次recvfrom, 接收100个字节; 而不能循环调用10次recvfrom, 每次接收10个字节; 面向字节流 由于缓冲区的存在, TCP程序的读和写不需要一一匹配…