socket

Linux环境中使用socket进行UDP和TCP多线程通信无法关闭socket

大城市里の小女人 提交于 2020-03-06 09:00:50
在Linux下,使用QT编程网络通信,为提高通信效率,使用原始socket进行网络编程,在QT线程中经常出现线程无法退出,原因来源于socket无法关闭。 线程处理如下: void communicationClass::run() { // 开启数据处理线程 #ifdef Q_OS_LINUX //配置服务器信息 bzero(&m_sServer_addr, sizeof(m_sServer_addr)); m_sServer_addr.sin_family = AF_INET; //设置为IPV4通信 m_sServer_addr.sin_addr.s_addr = htonl(INADDR_ANY); //设置目的ip m_sServer_addr.sin_addr.s_addr = inet_addr(m_strSendIP.toStdString().c_str()); //设置目的端口去链接服务器 m_sServer_addr.sin_port = htons(m_ui16Port); //配置本地信息 bzero(&m_sLocal_addr, sizeof(m_sLocal_addr)); m_sLocal_addr.sin_family = AF_INET; //设置为IPV4通信 //loc_addr.sin_addr.s_addr = htonl(INADDR

bind函数重难点分析

倖福魔咒の 提交于 2020-03-06 08:53:08
struct sockaddr_in bindaddr ; bindaddr . sin_family = AF_INET ; bindaddr . sin_addr . s_addr = htonl ( INADDR_ANY ) ; bindaddr . sin_port = htons ( 3000 ) ; if ( bind ( listenfd , ( struct sockaddr * ) & bindaddr , sizeof ( bindaddr ) ) == - 1 ) { std :: cout << "bind listen socket error." << std :: endl ; return - 1 ; } 其中 bind 的地址我们使用了一个宏叫 INADDR_ANY ,关于这个宏的解释如下: If an application does not care what local address is assigned, specify the constant value INADDR_ANY for an IPv4 local address or the constant value in6addr_any for an IPv6 local address in the sa_data member of the name parameter.

day26作业

淺唱寂寞╮ 提交于 2020-03-06 05:54:15
1.整理TCP三次握手、四次挥手图 2.基于TCP开发一款远程CMD程序 客户端连接服务器后,可以向服务器发送命令 服务器收到命令后执行,无论执行是否成功,无论执行几遍,都将执行结果返回给客户端 注意: 执行系统指令使用subprocess模块完成. # 服务端.py import socket import subprocess sever = socket.socket() sever.bind(('127.0.0.1',1111)) sever.listen(5) while True: conn,addr = sever.accept() while True: try: data = conn.recv(1024).decode('utf8') if data =='q': break res = subprocess.Popen(data,shell=True,stderr=subprocess.PIPE,stdout=subprocess.PIPE) data1 = res.stdout.read() data2 = res.stderr.read() conn.send(data1+data2) except Exception as e: print(e) conn.close() # 客户端,py import socket client = socket

网络通信中tcp多客户端连接

痴心易碎 提交于 2020-03-06 04:39:59
  网络编程中的tcp实例太多了,自己也写了好几次(羞愧),今天在想一对一的TCP知道怎么写了,可是一对多的怎么办呢?服务器是如何知道要给那个发送数据呢?做开发的同学应该经常听说uid这个属性。可以为什么通过UID就知道要发送的数据是给正确的用户的呢?   不怎么忙的时候。仔细的了解了一下TCP的几个API和其中的参数。下面来看一下这几个API和参数: 描述:当创建socket套接字后,该套接字并没有鱼本机地址和端口等信息相连接,而bind函数将完成这些工作 包含的头文件 <sys/types.h> <sys/socket.h> 原型:int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen); 返回值: 0:成功 1:失败 返回的错误码 EACCES:地址受到保护,用户非超级用户。 EADDRINUSE:指定的地址已经在使用。 EBADF:sockfd参数为非法的文件描述符。 EINVAL:socket已经和地址绑定。 ENOTSOCK:参数sockfd为文件描述符 描述:listen函数使用主动连接套接口变为被连接套接口,是的一个进程能够接受其他请求,使之成为一个服务器进程。总之TCP服务器中LISTEN函数将进程变为一个服务器进程,将主动变成了被动 包含头文件 #include<sys

Linux TCP server系列(4)-浅谈listen与大并发TCP连接

牧云@^-^@ 提交于 2020-03-06 04:39:37
背景: 服务器在调用 listen 和 accept 后,就会阻塞在 accept 函数上, accpet 函数返回后循环调用 accept 函数等待客户的 TCP 连接。如果这时候又大量的用户并发发起 connect 连接,那么在 listen 有队列上限 ( 最大可接受 TCP 的连接数 ) 的情况下,有多少个 connect 会成功了。试验证明,当连接数远远高于 listen 的可连接数上限时,客户端的大部分 TCP 请求会被抛弃,只有当 listen 监听队列空闲或者放弃某个连接时,才可以接收新的连接,那么我们应该如何来避免这种情况出现? 分析: (一)客户端 客户端运行初期完成所设定的一定量的 socket 创建和相应的处理线程的创建 ,然后使用 条件变量来完成线程同步 ,直到最后一个线程创建完成,才 向所有线程发出广播通知,让所有线程并发调用 connect ,连接成功则关闭连接,失败则返回,如下代码所示。 socket 创建和线程创建: int testCount=300; // 并发用户数 /* 每个进程需要自己独立的栈空间, linux 下默认栈大小是 10M ,在 32 位的机子上一个进程需要 4G 的内存空间,去掉自己的栈空间全局程序段空间,一般只有 3G 内存可以用,创建线程时就需要从这 3G 的空间中分配 10M 出来,所以最多可以分配 300 个线程

Socket之listen() receive()

柔情痞子 提交于 2020-03-06 04:35:30
socket.listen([backlog])    相比listen方法,它俩就好理解多了,一个是Client用于连接Server的方法,一个是Server用于接收Client的连接申请的方法。   但事实上accept方法一次只能接收一个Client的连接申请,而Client则是多个的,这样Socket会设计一个队列来存储Client的连接申请则是理所当然的。于是accept便从这个队列里提取首位成员处理即可。以下是示意图:   如此便很清晰了,backlog参数的含义便是这个队列的最大值,也就是同时受理连接申请的最大值。关于backlog该设置为多少,从 Skynet 得到的参考为32。如果满了便需要Client重新connect。以上listen方法之谜便解开了。 send和receive函数都可以接受一个类型为SocketFlag的参数,此参数有如下6种取值: ------------------------------------------------------------------- DontRout 不用内部路由表发送数据 MaxIOVectorLength 给用于发送和接收数据的WSABUF结构提供一个标准值 None 对这次调用不使用标志 OutOfBand 处理带外的(out-of-band)数据 Partial 部分地发出或接收消息 Peek

accept函数

纵饮孤独 提交于 2020-03-06 04:34:49
文件包含 #include <sys/socket.h> 原型 SOCKET PASCAL FAR accept( SOCKET s, struct sockaddr FAR* addr,int FAR* addrlen); 参数 s:套接口描述字,该套接口在 listen() 后监听连接。 addr:(可选)指针,指向一缓冲区,其中接收为通讯层所知的连接实体的地址。Addr参数的实际格式由套接口创建时所产生的地址族确定。 addrlen:(可选)指针,输入参数,配合addr一起使用,指向存有addr地址长度的整型数。 返回值 成功返回一个新的套接字描述符,失败返回-1。 本 函数 从 s的等待连接队列中抽取第一个连接,创建一个与s同类的新的套接口并返回句柄。如果队列中无等待连接,且套接口为阻塞方式,则accept()阻塞调用进 程直至新的连接出现。如果套接口为非阻塞方式且队列中无等待连接,则accept()返回一错误代码。已接受连接的套接口不能用于接受新的连接,原套接口 仍保持开放。 addr参数为一个返回参数,其中填写的是为通讯层所知的连接实体地址。addr参数的实际格式由通讯时产生的地址 族确定。addrlen参数也是一个返回参数,在调用时初始化为addr所指的地址空间;在调用结束时它包含了实际返回的地址的长度(用字节数表示)。该 函数与SOCK

网络的一些基本函数

你。 提交于 2020-03-06 04:33:59
WSA是windows socket API简称 1 在delphi用这些API时,应先先明 WSAStartup();//初始 WSACleanup;//注销 后面介绍一些简单函数的使用 我也是学了再写,说错的地方指明,这既是自己的笔记 也是大家的参考 2、socket函数 用于生成socket(soket Descriptor) [声明] SOCKET socket(int af,int type,int protocol); [参数] af - 地址家族(通常使用:AF_INET) type - socket的种类 SOCK_STREAM : 用于TCP协议 SOCK_DGRAM : 用于UDP协议 protocol - 所使用的协议 [返回值] 当函数成功调用时返回一个新的SOCKET(Socket Descriptor) 失败时返回INVALID_SOCKET. 3、inet_addr函数 把好象"xxx.xxx.xxx.xxx"的10进制的IP地址转换为32位整数表示方法 [声明] unsigned long inet_addr ( const char FAR *cp ); [参数] cp - 指向用"xxx.xxx.xxx.xxx"的10进制来表示的IP地址字符串的指针 [返回值] 当函数成功调用时返回用32位整数表示的IP地址(按网络字节排列顺序)

Winsock解析

左心房为你撑大大i 提交于 2020-03-06 04:33:33
一、基本知识 1、 Winsock,一种标准API ,一种网络 编程 接口,用于两个或多个应用程序(或进程)之间通过网络进行数据通信。具有两个版本: Winsock 1: Windows CE平台支持。 头文件:WinSock.h 库:wsock32.lib Winsock 2: 部分平台如Windows CE貌似不支持。通过前缀WSA可以区别于Winsock 1版本。个别函数如WSAStartup、WSACleanup、WSARecvEx、WSAGetLastError都属于Winsock 1.1规范的函数; 头文件:WinSock2.h 库:ws2_32.lib mswsock.h用于编程扩展,使用时必须链接mswsock.dll。 2、网络协议: IP (Internet Protocol) 网际协议,无连接协议; TCP (Transmission Control Protocol) 传输控制协议; UDP (User Datagram Protocol) 用户数据协议; FTP (File Transfer Protocol) 文件传输协议; HTTP (Hypertext Transfer Protocol) 超文本传输协议; 3、字节存储顺序: big_endian:大端存储,存储顺序从高位到低位,地址指向最高有效字节。在网络中将IP和端口指定为多字节时使用大端存储

winsocket <研究了一天的成果>

我的未来我决定 提交于 2020-03-06 04:32:49
首先,这都是套路( ▼-▼ ) 头文件 #include <WinSock.h> #include <Winsock2.h> 用这个,这个是升级版 各个函数解释 1、 WSAStartup: 初始化套接字环境,本函数必须是应用程序或DLL调用的第一个Windows Sockets函数.它允许应用程序或DLL指明Windows Sockets API的版本号及获得特定Windows Sockets实现的细节.应用程序或DLL只能在一次成功的WSAStartup()调用之后才能调用进一步的Windows Sockets API函数. int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData); 实际用例 //begin 初始化网络环境 int err = WSAStartup(MAKEWORD(2, 2), &wsaData); if ( err != 0) { printf("WSAStartup failed with error: %d\n", err); return -1; }//end 2、 WSACleanup: 清理套接字环境,和上面的WSAStartup相反,该函数是在程序不在对任何Windows Sockets函数调用后,用其来清理套接字环境的 int WSACleanup (void); 3、