浅谈socket TCP编程中connect的一些坑_C 语言

1.服务端listen成功后,系统就自动接收客户端请求了

man listen:

其中有一段

The  behavior of the backlog argument on TCP sockets changed with Linux
       2.2.  Now it specifies the  queue  length  for  completely  established
       sockets  waiting  to  be  accepted, instead of the number of incomplete
       connection requests.  The maximum length of the  queue  for  incomplete
       sockets  can be set using /proc/sys/net/ipv4/tcp_max_syn_backlog.  When
       syncookies are enabled there is no logical maximum length and this set‐
       ting is ignored.  See tcp(7) for more information.

也就是说,listen成功后,系统会自动接受bocklog个客户端请求,并不需要服务端accept,就算服务端没有accept,客户端connect仍然返回成功。accept仅仅是从backlog队列中取出一个已经建立了完整TCP连接的套接字。

2.一个fd   socket了connect后,不能再次connect

再次connect,会报错:Transport endpoint is already connected

此时想要再次connect,必须重置fd..

连接建立后socket的状态被置为SS_ISCONNECTED,因此在调用close重置此socket状态之前,会报错。。

时间: 2024-08-04 00:26:52

浅谈socket TCP编程中connect的一些坑_C 语言的相关文章

浅谈Java多线程编程中Boolean常量的同步问题_java

在JAVA中通过synchronized语句可以实现多线程并发.使用同步代码块,JVM保证同一时间只有一个线程可以拥有某一对象的锁.锁机制实现了多个线程安全地对临界资源进行访问.   同步代码写法如下:   代码1: Object obj = new Object(); ... synchronized(obj) { //TODO: 访问临界资源 } JAVA的多线程总是充满陷阱,如果我们用Boolean作为被同步的对象,可能会出现以下两种情况:   一. 以为对一个对象加锁,实际同步的是不同对

浅谈stringstream 的.str()正确用法和清空操作_C 语言

streamstring在调用str()时,会返回临时的string对象.而因为是临时的对象,所以它在整个表达式结束后将会被析构. 如果需要进一步操作string对象,先把其值赋给一个string变量后再操作. stringstream ss("012345678901234567890123456789012345678901234567890123456789"); //错误用法 const char* cstr2 = ss.str().c_str(); //正确用法 const

详解C语言编程中预处理器的用法_C 语言

预处理最大的标志便是大写,虽然这不是标准,但请你在使用的时候大写,为了自己,也为了后人. 预处理器在一般看来,用得最多的还是宏,这里总结一下预处理器的用法. #include <stdio.h> #define MACRO_OF_MINE #ifdef MACRO_OF_MINE #else #endif 上述五个预处理是最常看见的,第一个代表着包含一个头文件,可以理解为没有它很多功能都无法使用,例如C语言并没有把输入输入纳入标准当中,而是使用库函数来提供,所以只有包含了stdio.h这个头文

浅谈Windows系统下C语言编程中Glib库的使用_C 语言

在这个C的变成世界里,有许多实用的库,其中最有名的且最通用(跨多个平台的实现包括Windows,要知道很多实用的编程库都不提供Windows的实现)就是GLib这个库,其中就有实现线程的部分. glib库是Linux平台下最常用的C语言函数库,它具有很好的可移植性和实用性. glib是Gtk +库和Gnome的基础.glib可以在多个平台下使用,比如Linux.Unix.Windows等.glib为许多标准的.常用的C语言结构提供了相应的替代物. 如果在程序中要使用到glib库中的函数,则应该包

浅谈C语言编程中的布尔bool数据类型_C 语言

我们知道在C++里有专门的bool类型,用来表示真或假.但是在C语言里没有这样的类型(至少我是一直这么认为的),表达式的值0为假,非0为真.所以条件判断语句( if(-).while(-) )非常灵活,甚至一个指针类型都可以是条件表达式. 为了使程序更清晰,我们常常会给出如下的宏定义: typedef int BOOL; #define TRUE 1 #define FALSE 0 这是最常见的写法,能被任何C语言编译器认可. 今天我在一段程序里看见这么一行 #include ,这个陌生的头文件

C++设计模式编程中的观察者模式使用示例_C 语言

概述:最近中国股市起起伏伏,当然了起伏就用商机,小明发现商机后果断想入市,买入了中国证券,他想在电脑客户端上,网页上,手机上,iPad上都可以查看到该证券的实时行情,这种情况下我们应该怎么设计我们的软件呢?我们可以这样:小明的所有客户端上都订阅中国证券这个股票,只要股票一有变化,所有的客户端都会被通知到并且被自动更新. 这就是我们的观察者模式,她定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新. 类图: 可以看出,在这个观察者模式的实现里有

详解C++编程中数组的基本用法_C 语言

可以使用数组下标操作符 ([ ]) 访问数组的各个元素. 如果在无下标表达式中使用一维数组,组名计算为指向该数组中的第一个元素的指针. // using_arrays.cpp int main() { char chArray[10]; char *pch = chArray; // Evaluates to a pointer to the first element. char ch = chArray[0]; // Evaluates to the value of the first e

实例讲解C++编程中lambda表达式的使用_C 语言

函数对象与Lambdas你编写代码时,尤其是使用 STL 算法时,可能会使用函数指针和函数对象来解决问题和执行计算.函数指针和函数对象各有利弊.例如,函数指针具有最低的语法开销,但不保持范围内的状态,函数对象可保持状态,但需要类定义的语法开销. lambda 结合了函数指针和函数对象的优点并避免其缺点.lambda 与函数对象相似的是灵活并且可以保持状态,但不同的是其简洁的语法不需要显式类定义. 使用lambda,相比等效的函数对象代码,您可以写出不太复杂并且不容易出错的代码. 下面的示例比较l

解析C++编程中的#include和条件编译_C 语言

文件包含的作用 所谓"文件包含"处理是指一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中.C++提供了#include命令用来实现"文件包含"的操作.如在file1.cpp中有以下#include命令: #include ″file2.cpp″ 它的作用见图示意. "文件包含"命令是很有用的,它可以节省程序设计人员的重复劳动. #include命令的应用很广泛,绝大多数C++程序中都包括#include命令.现在,