套接字使用recvfrom函数时为什么10014或者10039 20C

不知道什么问题
只创建了一个用于接收的套接字,在新的线程里接收的时候并不阻塞并且WSAGETLASTERROR返回10039

在主界面线程中接收的时候返回10014

传了一下度盘
https://pan.baidu.com/s/1qZcwd4K
MFC界面下的工程,错的糊里糊涂也不知道是发生了啥

4个回答

10039:请求的地址在一个套接字中从操作中忽略。
10014:系统检测到在一个调用中尝试使用指针参数时的无效指针地址。
使用errlook.exe查找错误代码。

10039: Destination address required.
在套接字上一个操作所必须的地址被遗漏。例如,如果sendto()函数被调用且远程地址为ADDR_ANY时,此错误被返回。
10014:Bad address.
系统检测到调用试图使用的一个指针参数指向的是一个非法指针地址。如果应用程序传递一个非法的指针值,或缓冲区长度太小,此错误发生。例如,参数为结构sockaddr,但参数的长度小于sizeof(struct sockaddr)

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
udp通讯问题,用了两个recvfrom函数,响应慢
dsp开发多核主板,嵌入sysbios操作系统,与两路网络终端通讯,同时用了两个recvfrom函数,当外部终端发命令时,主板响应时间超慢,达到2秒左右,不知何故,请高手指点,谢谢
C++ 中的sendTo和recvFrom函数问题
请看代码,addrClient不赋值recvfrom依然可以收到另一个电脑发送的数据;sendto也能发送数据到另一个电脑,为什么????? ``` WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested=MAKEWORD(2,2); err = WSAStartup(wVersionRequested, &wsaData); if (err != 0) { return; } if (LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2) { WSACleanup(); return; } SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); SOCKADDR_IN addrSrv; // addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.1.253"); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); SOCKADDR_IN addrClient;//addrClient不赋值依然可以收到和发送数据,为什么????? // memset(&addrClient, 0, sizeof(addrClient)); // addrClient.sin_addr.S_un.S_addr=inet_addr("192.168.1.46"); // addrClient.sin_family=AF_INET; // addrClient.sin_port=htons(8080); int len=sizeof(SOCKADDR); char recvBuf[100]; int count = recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len); sendto(sockSrv,"nullptr", strlen("nullptr")+1, 0, (SOCKADDR*)&addrClient,len); for(int i = 0; i < count; i++) printf("%d\n",recvBuf[i]); closesocket(sockSrv); WSACleanup(); ```
c++,socket编程实现简易聊天系统,客户端一直连不上服务端,connect返回错误10014
客户端 ``` //建立线程 DWORD WINAPI ConnectThreadFunc(LPVOID pParam) { //初始化 WSAData wsData; if (!AfxSocketInit(&wsData)) { AfxMessageBox(_T("Socket 库初始化出错!")); return false; } CMFCApplication1View *pChatClient = (CMFCApplication1View*)pParam; ASSERT(pChatClient != NULL); //新建一个socket pChatClient->ConnectSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (INVALID_SOCKET==pChatClient->ConnectSock ) { AfxMessageBox(_T("创建socket失败!")); return FALSE; } AfxMessageBox(_T("成功创建socket")); //获取端口 CString ServeIp; pChatClient->GetDlgItemText(IDC_SERVEID_INPUT, ServeIp); //取服务端的IP地址 int SPort = pChatClient->GetDlgItemInt(IDC_SERVEPORT_INPUT); //获取端口 if (SPort <= 0 || SPort > 65535) { AfxMessageBox(_T("请输入合法的端口:1-65535")); goto _End; } AfxMessageBox(_T("端口合法")); //将IP转换 char AddrIp[16] = { 0 }; //窄字节 USES_CONVERSION; strcpy_s(AddrIp, 16, T2A(ServeIp)); // T2A:宏,进行字符串的转换 //将服务器的信息放入通用套接字中 sockaddr_in server; server.sin_family = AF_INET; server.sin_port = htons(SPort); server.sin_addr.s_addr = inet_addr("192.168.73.1"); //客户端连接服务端 //将server传给connect if ( SOCKET_ERROR == connect(pChatClient->ConnectSock, (struct sockaddr*)&server, sizeof(struct sockaddrr*)) ) { /* char ErrorInfo[256] = { 0 }; //创建数组存储错误信息 sprintf_s(ErrorInfo, "Creat Faile : %d", GetLastError()); //把错误信息写入数组 AfxMessageBox((CString)ErrorInfo); */ AfxMessageBox(_T("连接失败!")); goto _End; } pChatClient->MsgShow(_T("服务器连接成功!")); while (TRUE) { if (SOCKERT_Select(pChatClient->ConnectSock,100,TRUE)) { char szBuf[MAX_BUF_SIZE] = { '0' }; //缓冲区 int iRet = recv(pChatClient->ConnectSock, szBuf, MAX_BUF_SIZE, 0); //recv()用来接收远程主机通过套接字sockfd发送来的数据, //并把这些数据保存到数组buf中 if (iRet > 0) { pChatClient->MsgShow((CString)szBuf); } else { pChatClient->MsgShow(_T("连接异常,请重新连接!")); break; } } Sleep(100); } _End: closesocket(pChatClient->ConnectSock); return TRUE; } ``` 服务端 ``` SOCKET ComSock; //用于发送消息 //查看客户端是否发来消息,并快速返回 BOOL SOCKERT_Select(SOCKET Socket, int TimeOut, BOOL bRead) { fd_set fdset; //通知执行了select()的进程哪一socket或文件发生了可读或可写事件 //long类型的数组,每一个数组元素都能与一打开的文件句柄建立联系 timeval tv; //判断是否超时,用于select()函数 FD_ZERO(&fdset); //清空集合中所有的元素 FD_SET(Socket, &fdset); //设置hSocket,使集合包含hSocket,即建立联系 TimeOut = TimeOut > 1000 ? 1000 : TimeOut; tv.tv_sec = 0; //秒数 tv.tv_usec = TimeOut; //微秒数 int iRet = 0; if (bRead) { //select()测试指定的fd可读?可写?有异常条件待处理? //即对socket操作 iRet = select(0, &fdset, NULL, NULL, &tv); } //读 else { iRet = select(0, NULL, &fdset, NULL, &tv); } //写 if (iRet <= 0) { //返回错误时 return FALSE; } else if (FD_ISSET(Socket, &fdset)) {//返回处于就绪状态并且已经包含在fd_set结构中的描述字总数 return TRUE; } return FALSE; //返回零时(超时返回零) } //通过线程来开启服务器,因为accept是阻塞的 //线程函数 DWORD WINAPI LisenThreadFunc(LPVOID pParam) { //LPVOID :32位的无类型的指针,在使用的时候再强制转换成需要的类型 CMFCApplication1View *pChatClient = (CMFCApplication1View*)pParam; //强制转换 ASSERT(pChatClient != NULL); //保证指针不为空 //断言函数,表达式为假则退出程序,为真继续执行 //用socket函数创建一个socket,用于监听 //成功则返回一个socket pChatClient->ListenSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (pChatClient->ListenSock == INVALID_SOCKET) { AfxMessageBox(_T("创建socket失败!")); return 0; } //绑定,将 ListenSock 绑定在本地的一个ip和端口上 //1、动态获取用户输入的端口 int Port = pChatClient->GetDlgItemInt(IDC_LISTENPORT_INPUT); if (Port <= 0 || Port > 65535) { AfxMessageBox(_T("请输入合适的端口:1-65535")); goto _End; } //2、建立通用套接字 sockaddr_in service; //一种通用的套接字地址。用来建立所需信息,最后使用类型转换 //一般用于bind、connect、recvfrom、sendto等函数的参数 service.sin_family = AF_INET; //协议族 service.sin_addr.s_addr = inet_addr("127.0.0.1"); //获取本机所有可能得到的ip地址 service.sin_port = htons(Port); //传递端口 //htons:将主机字节顺序转换为网络字节顺序 //3、利用bind进行绑定 if (bind(pChatClient->ListenSock, (sockaddr*)&service, sizeof(sockaddr_in)) == SOCKET_ERROR) { AfxMessageBox(_T("绑定失败!")); goto _End; } AfxMessageBox(_T("绑定成功!")); //监听 if (listen(pChatClient->ListenSock, 4) == SOCKET_ERROR) { AfxMessageBox(_T("监听失败!")); goto _End; } //服务器已搭建完毕,开始进行消息监测 while (TRUE) { if (SOCKERT_Select(pChatClient->ListenSock, 1000, TRUE)) {//若有消息 sockaddr_in ClientSocket; int len = sizeof(sockaddr_in); //返回客户端(即对方)的IP地址和端口 SOCKET ComSock = accept(pChatClient->ListenSock, (struct sockaddr*)&ClientSocket, &len); if (ComSock == INVALID_SOCKET) { //若没有收到信息 continue; } //当要进行信息交互时,再建一个新线程来进行信息交互 // CMFCApplication1View *ClientCopy; HANDLE iTtem; iTtem = CreateThread(NULL, 0, ClientThreadProc, pChatClient, CREATE_SUSPENDED, NULL); pChatClient->comThread = iTtem; ResumeThread(iTtem); //恢复线程的执行 } Sleep(100); } _End: closesocket(pChatClient->ListenSock); //强制关闭socket return TRUE; } ``` 由于最近刚学socket,实在不知道怎么改了,请各位大神帮我康康,谢谢大家!(呜呜呜我是新手么的c币)
不同端口号加入到同一组播地址,关闭套接字时为什么会有影响?
有两个设备,使用udp组播的方式进行通讯,服务器端建立了两个udp连接,端口号不同,但是加入的是同一组播地址。当我关闭其中一个udp套接字时,为什么会影响另一个udp的连接? ``` 线程a: int rtp_server_socket; struct sockaddr_in server_addr, client_addr; socklen_t clielen_addr_length; clielen_addr_length = sizeof(client_addr); ReSocket: report_succeed = 1; //struct tcp_info info; bzero(&server_addr, sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(A_PORT); server_addr.sin_addr.s_addr=htonl(INADDR_ANY); //create a stream socket rtp_server_socket = socket(AF_INET, SOCK_DGRAM, 0); //UDP printf("Create Socket OK \n"); //bind bind(rtp_server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) printf("bind socket ok \n"); //set Multicast loop int loop = 1; //1: on , 0: off setsockopt(rtp_server_socket,IPPROTO_IP,IP_MULTICAST_LOOP,&loop,sizeof(loop)); struct ip_mreq mreq; mreq.imr_multiaddr.s_addr = inet_addr(multicast); mreq.imr_interface.s_addr = htonl(INADDR_ANY); //add multicast group setsockopt(rtp_server_socket, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)); int reuse = 1; setsockopt(rtp_server_socket, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse)); while (1) { Recv: if (0 == report_succeed) { close(rtp_server_socket); goto ReSocket; } recvfrom(rtp_server_socket, buf, BUFFER_SIZE, 0, (struct sockaddr_in *) &client_addr, &clielen_addr_length); ``` ``` 线程b和上面的一样只是绑定的端口不一样 ``` 当我关闭线程b的套接字时,线程a的recvfrom()函数会堵塞一会,没有数据接收,请问这是为什么?
linux的xterm开启的终端里使用原始套接字发送数据包出错,求助
xterm下原始套接字可以接收数据包,但是发送数据包时出错,怎么解决? 错误是【error 101】network is unreachable. 代码如下: proto = socket.getprotobyname('tcp') # only tcp sock = socket.socket( socket.AF_INET, socket.SOCK_RAW, proto ) packet_base = sock.recvfrom(1024)[0] s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP) s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) s.sendto(packet_base, ('123.123.123.123' , 12312))
Python多进程问题的报错问题
小弟想通过多进程实现客户端给服务器发送信息,服务器同时接收多个信息。但是会收到以下报错: OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 看网上说是进程停止又重启造成的结果 小弟贴下自己的代码,麻烦大家看下 ``` import multiprocessing from socket import import time server_name='172.20.53.211' port_number1=12002 port_number2=12003 def process_one(): server_socket1 = socket(AF_INET, SOCK_DGRAM) server_socket1.bind(('', port_number1)) data_receive1, client_address = server_socket1.recvfrom(1024) server_socket1.close() print(data_receive1,1) def process_two(): server_socket2 = socket(AF_INET, SOCK_DGRAM) server_socket2.bind(('', port_number2)) data_receive2, client_address = server_socket2.recvfrom(1024) server_socket2.close() print(data_receive2,2) p1=multiprocessing.Process(target=process_one()) p1.start() p2=multiprocessing.Process(target=process_two()) p2.start() ``` 以上是服务器端的代码 以下是客户端发送代码 ``` from socket import * import time server_name='172.20.53.211' port_number1=12002 port_number2=12003 client_socket = socket(AF_INET, SOCK_DGRAM) f1=open('1.txt','rb') fcontent=f1.read() client_socket.sendto(fcontent,(server_name, port_number1)) time.sleep(0.2) client_socket.sendto('a'.encode('UTF-8'),(server_name, port_number2)) client_socket.close() ``` 求大佬指出哪里错了,谢谢
tracert程序编译成功运行后,无法正常发送接收包,输出结果只有123456789101112131415161718192021222324252627282930,不显示详细情况,单步运行后发现接收发送包的部分没执行
![图片说明](https://img-ask.csdn.net/upload/201911/30/1575117089_191288.jpg) #include <iostream> #include <winsock2.h> #include <ws2tcpip.h> using namespace std; #pragma comment(lib, "Ws2_32.lib") //IP报头 typedef struct IP_HEADER { unsigned char hdr_len:4; //4位头部长度 unsigned char version:4; //4位版本号 unsigned char tos; //8位服务类型 unsigned short total_len; //16位总长度 unsigned short identifier; //16位标识符 unsigned short frag_and_flags; //3位标志加13位片偏移 unsigned char ttl; //8位生存时间 unsigned char protocol; //8位上层协议号 unsigned short checksum; //16位校验和 unsigned long sourceIP; //32位源IP地址 unsigned long destIP; //32位目的IP地址 } IP_HEADER; //ICMP报头 typedef struct ICMP_HEADER { BYTE type; //8位类型字段 BYTE code; //8位代码字段 USHORT cksum; //16位校验和 USHORT id; //16位标识符 USHORT seq; //16位序列号 } ICMP_HEADER; //报文解码结构 typedef struct DECODE_RESULT { USHORT usSeqNo; //序列号 DWORD dwRoundTripTime; //往返时间 in_addr dwIPaddr; //返回报文的IP地址 }DECODE_RESULT; //计算网际校验和函数 USHORT checksum( USHORT *pBuf, int iSize ) { unsigned long cksum = 0; while( iSize > 1 ) { cksum += *pBuf++; iSize -= sizeof(USHORT); } if( iSize )//如果 iSize 为正,即为奇数个字节 { cksum += *(UCHAR *)pBuf; //则在末尾补上一个字节,使之有偶数个字节 } cksum = ( cksum >> 16 ) + ( cksum&0xffff ); cksum += ( cksum >> 16 ); return (USHORT)( ~cksum ); } //对数据包进行解码 BOOL DecodeIcmpResponse(char * pBuf, int iPacketSize, DECODE_RESULT &DecodeResult, BYTE ICMP_ECHO_REPLY, BYTE ICMP_TIMEOUT) { //检查数据报大小的合法性 IP_HEADER* pIpHdr = ( IP_HEADER* )pBuf; int iIpHdrLen = pIpHdr->hdr_len * 4; //ip报头的长度是以4字节为单位的 //若数据包大小 小于 IP报头 + ICMP报头,则数据报大小不合法 if ( iPacketSize < ( int )( iIpHdrLen + sizeof( ICMP_HEADER ) ) ) return FALSE; //根据ICMP报文类型提取ID字段和序列号字段 ICMP_HEADER *pIcmpHdr = ( ICMP_HEADER * )( pBuf + iIpHdrLen );//ICMP报头 = 接收到的缓冲数据 + IP报头 USHORT usID, usSquNo; if( pIcmpHdr->type == ICMP_ECHO_REPLY ) //ICMP回显应答报文 { usID = pIcmpHdr->id; //报文ID usSquNo = pIcmpHdr->seq; //报文序列号 } else if( pIcmpHdr->type == ICMP_TIMEOUT )//ICMP超时差错报文 { char * pInnerIpHdr = pBuf + iIpHdrLen + sizeof( ICMP_HEADER ); //载荷中的IP头 int iInnerIPHdrLen = ( ( IP_HEADER * )pInnerIpHdr )->hdr_len * 4; //载荷中的IP头长 ICMP_HEADER * pInnerIcmpHdr = ( ICMP_HEADER * )( pInnerIpHdr + iInnerIPHdrLen );//载荷中的ICMP头 usID = pInnerIcmpHdr->id; //报文ID usSquNo = pInnerIcmpHdr->seq; //序列号 } else { return false; } //检查ID和序列号以确定收到期待数据报 if( usID != ( USHORT )GetCurrentProcessId() || usSquNo != DecodeResult.usSeqNo ) { return false; } //记录IP地址并计算往返时间 DecodeResult.dwIPaddr.s_addr = pIpHdr->sourceIP; DecodeResult.dwRoundTripTime = GetTickCount() - DecodeResult.dwRoundTripTime; //处理正确收到的ICMP数据报 if ( pIcmpHdr->type == ICMP_ECHO_REPLY || pIcmpHdr->type == ICMP_TIMEOUT ) { //输出往返时间信息 if(DecodeResult.dwRoundTripTime) cout<<" "<<DecodeResult.dwRoundTripTime<<"ms"<<flush; else cout<<" "<<"<1ms"<<flush; } return true; } void main() { //初始化Windows sockets网络环境 WSADATA wsa; WSAStartup( MAKEWORD(2,2), &wsa ); char IpAddress[255]; cout<<"请输入一个IP地址或域名:"; cin>>IpAddress; //得到IP地址 u_long ulDestIP = inet_addr( IpAddress ); //转换不成功时按域名解析 if( ulDestIP == INADDR_NONE ) { hostent * pHostent = gethostbyname( IpAddress ); if( pHostent ) { ulDestIP = ( *( in_addr* )pHostent->h_addr).s_addr; } else { cout<<"输入的IP地址或域名无效!"<<endl; WSACleanup(); return; } } cout<<"Tracing roote to "<<IpAddress<<" with a maximum of 30 hops.\n"<<endl; //填充目的端socket地址 sockaddr_in destSockAddr; ZeroMemory( &destSockAddr, sizeof( sockaddr_in ) ); destSockAddr.sin_family = AF_INET; destSockAddr.sin_addr.s_addr = ulDestIP; //创建原始套接字 SOCKET sockRaw = WSASocket( AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0, WSA_FLAG_OVERLAPPED ); //超时时间 int iTimeout = 3000; //设置接收超时时间 setsockopt( sockRaw, SOL_SOCKET, SO_RCVTIMEO, (char *)&iTimeout, sizeof( iTimeout ) ); //设置发送超时时间 setsockopt(sockRaw,SOL_SOCKET,SO_SNDTIMEO,(char *)&iTimeout,sizeof(iTimeout)); //构造ICMP回显请求消息,并以TTL递增的顺序发送报文 //ICMP类型字段 const BYTE ICMP_ECHO_REQUEST = 8; //请求回显 const BYTE ICMP_ECHO_REPLY = 0; //回显应答 const BYTE ICMP_TIMEOUT = 11; //传输超时 //其他常量定义 const int DEF_ICMP_DATA_SIZE = 32; //ICMP报文默认数据字段长度 const int MAX_ICMP_PACKET_SIZE = 1024; //ICMP报文最大长度(包括报头) const DWORD DEF_ICMP_TIMEOUT = 3000; //回显应答超时时间 const int DEF_MAX_HOP = 30; //最大跳站数 //填充ICMP报文中每次发送时不变的字段 char IcmpSendBuf[ sizeof( ICMP_HEADER ) + DEF_ICMP_DATA_SIZE ];//发送缓冲区 memset( IcmpSendBuf, 0, sizeof( IcmpSendBuf ) ); //初始化发送缓冲区 char IcmpRecvBuf[ MAX_ICMP_PACKET_SIZE ]; //接收缓冲区 memset( IcmpRecvBuf, 0, sizeof( IcmpRecvBuf ) ); //初始化接收缓冲区 ICMP_HEADER * pIcmpHeader = ( ICMP_HEADER* )IcmpSendBuf; pIcmpHeader->type = ICMP_ECHO_REQUEST; //类型为请求回显 pIcmpHeader->code = 0; //代码字段为0 pIcmpHeader->id = (USHORT)GetCurrentProcessId(); //ID字段为当前进程号 memset( IcmpSendBuf + sizeof( ICMP_HEADER ), 'E', DEF_ICMP_DATA_SIZE );//数据字段 USHORT usSeqNo = 0; //ICMP报文序列号 int iTTL = 1; //TTL初始值为1 BOOL bReachDestHost = FALSE; //循环退出标志 int iMaxHot = DEF_MAX_HOP; //循环的最大次数 DECODE_RESULT DecodeResult; //传递给报文解码函数的结构化参数 while( !bReachDestHost && iMaxHot-- ) { //设置IP报头的TTL字段 setsockopt( sockRaw, IPPROTO_IP, IP_TTL, (char *)&iTTL, sizeof(iTTL) ); cout<<iTTL<<flush; //输出当前序号,flush表示将缓冲区的内容马上送进cout,把输出缓冲区刷新 //填充ICMP报文中每次发送变化的字段 ((ICMP_HEADER *)IcmpSendBuf)->cksum = 0; //校验和先置为0 ((ICMP_HEADER *)IcmpSendBuf)->seq = htons(usSeqNo++); //填充序列号 ((ICMP_HEADER *)IcmpSendBuf)->cksum = checksum( ( USHORT * )IcmpSendBuf, sizeof( ICMP_HEADER ) + DEF_ICMP_DATA_SIZE ); //计算校验和 //记录序列号和当前时间 DecodeResult.usSeqNo = ( ( ICMP_HEADER* )IcmpSendBuf )->seq; //当前序号 DecodeResult.dwRoundTripTime = GetTickCount(); //当前时间 //发送TCP回显请求信息 sendto( sockRaw, IcmpSendBuf, sizeof(IcmpSendBuf), 0, (sockaddr*)&destSockAddr, sizeof(destSockAddr) ); //接收ICMP差错报文并进行解析处理 sockaddr_in from; //对端socket地址 int iFromLen = sizeof(from);//地址结构大小 int iReadDataLen; //接收数据长度 while(1) { //接收数据 iReadDataLen = recvfrom( sockRaw, IcmpRecvBuf, MAX_ICMP_PACKET_SIZE, 0, (sockaddr*)&from, &iFromLen ); if( iReadDataLen != SOCKET_ERROR )//有数据到达 { //对数据包进行解码 if(DecodeIcmpResponse( IcmpRecvBuf, iReadDataLen, DecodeResult, ICMP_ECHO_REPLY, ICMP_TIMEOUT ) ) { //到达目的地,退出循环 if( DecodeResult.dwIPaddr.s_addr == destSockAddr.sin_addr.s_addr ) bReachDestHost = true; //输出IP地址 cout<<'\t'<<inet_ntoa( DecodeResult.dwIPaddr )<<endl; break; } } else if( WSAGetLastError() == WSAETIMEDOUT ) //接收超时,输出*号 { cout<<" *"<<'\t'<<"Request timed out."<<endl; break; } else { break; } } iTTL++; //递增TTL值 } }
TCP、UDP通信:recv和recvfrom同时阻塞
当客户端登录时,创建一个线程接收服务器的消息(比如,密码错误时,服务器会发送消息告知客户端密码错误)。 DWORD Client_Thread() { .... recv(); //接收服务器的消息,如密码是否正确,或者某一个客户端的地址和端口号等 .... } 服务器为每一个客户端创建一个线程(该线程可以判断密码是否正确)。 DWORD Server_Thread() { ... recv(); //接收客户端的消息,如账号和密码,请求朋友的地址和端口号 ... ... send(); //发送相关信息给客户端,如朋友的地址和端口号 ... } 现在的情况是,客户端如果想跟他的其中一个好友聊天,那么就向服务器发送消息, 要求服务器返回该好友的ip地址和端口号,同时客户端又新建一个线程接收好友的信息。 DWORD Chat_Thread() { while(1) { revcfrom(); //接收好友的信息 } } 客户端发送消息给好友使用UDP协议。 void Send() { ... sendto(); //发送信息给好友 } 现在的问题是,客户端的Cient_Thread线程函数中的recv和Chat_Thread线程函数中的recvfrom同时处于阻塞状态。 当朋友发送信息时,recv收到了信息,而recvfrom没有收到。 我想要的是recvfrom收到,recv不接收。有什么办法可以实现这样的功能吗?或者怎样改?谢谢!!!!
python原始套接字的问题
代码如下: ``` import socket addr='localhost' serversocket=socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_IP) serversocket.bind((addr,0)) serversocket.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) serversocket.ioctl(socket.SIO_RCVALL,socket.RCVALL_OFF) print(serversocket.recvfrom(4096)) ``` ping自己,但是这里什么都不显示。 ![图片说明](https://img-ask.csdn.net/upload/201604/12/1460471711_936438.png) 由这图看到,ping自己就什么都没显示,求大神指点指点
udp原始套接字绑定0.0.0.0
我在服务器端用原始套接字发包给客户端程序。出现了以下问题: 1. 如果客户端和服务端都绑定ip地址为0.0.0.0,虽然包能在客户端的机器上被wireshark抓到,但是不能被客户端程序收到。 2. 如果客户端绑定真实的ip地址,服务器端绑定0.0.0.0, 在有些无线网络环境下,包能够被客户端的wireshark抓到,但是不能客户端程序收到 3. 如果服务器端绑定真实ip地址,无论客户端绑定是0.0.0.0还是真实ip地址,都能正常收到包。 我的代码如下` 客户端: int _tmain(int argc, _TCHAR* argv[]) { SOCKET udpSock; WSADATA wsa; if(WSAStartup(MAKEWORD(2,2),&wsa)){ return 0; } udpSock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); if(udpSock == INVALID_SOCKET){ return 0; } SOCKADDR_IN localAddr; localAddr.sin_family = AF_INET; localAddr.sin_port = htons(8622); //localAddr.sin_addr.s_addr = INADDR_ANY; //localAddr.sin_addr.s_addr = inet_addr("192.168.191.5"); localAddr.sin_addr.s_addr = inet_addr("10.6.192.112"); int opt = 1; ::setsockopt( udpSock, IPPROTO_UDP, 19,(char*) &opt, sizeof ( opt ) ); int aa = 8192; ::setsockopt(udpSock,SOL_SOCKET,SO_SNDBUF,(char*)&aa,sizeof(aa)); if(bind(udpSock,(sockaddr*)&localAddr,sizeof(localAddr)) != 0){ return 0; } sockaddr_in RecvAddr; RecvAddr.sin_family = AF_INET; RecvAddr.sin_port = htons(8821); RecvAddr.sin_addr.s_addr = inet_addr("10.6.192.111"); char sendBuf[2048]; strcpy(sendBuf,"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\0"); BYTE recvBuf[4096]; int recvLen = 0; SOCKADDR_IN tmpAddr; int tmpRecvLen; tmpRecvLen = sizeof(tmpAddr); int i = 0; while(true) { int len2 = sendto(udpSock, sendBuf, strlen(sendBuf), 0, (SOCKADDR *) &RecvAddr, sizeof(RecvAddr)); printf("start recv"); Sleep(100); ZeroMemory(recvBuf,4096); recvLen = recvfrom(udpSock,(char *)recvBuf,4096,0,(SOCKADDR *)&tmpAddr,&tmpRecvLen); printf("recvLen = %d\n",recvLen); if(recvLen > 0) { recvLen = 0; printf("%s ",recvBuf); printf("\n"); } } closesocket(udpSock); return 0; } 服务器代码: #include<stdio.h> //for printf #include<string.h> //memset #include<sys/socket.h> //for socket ofcourse #include<stdlib.h> //for exit(0); #include<errno.h> //For errno - the error number #include<netinet/udp.h> //Provides declarations for udp header #include<netinet/ip.h> //Provides declarations for ip header #include <unistd.h> #include <arpa/inet.h> /* 96 bit (12 bytes) pseudo header needed for udp header checksum calculation */ struct pseudo_header { u_int32_t source_address; u_int32_t dest_address; u_int8_t placeholder; u_int8_t protocol; u_int16_t udp_length; }; /* Generic checksum calculation function */ unsigned short csum(unsigned short *ptr,int nbytes) { register long sum; unsigned short oddbyte; register short answer; sum=0; while(nbytes>1) { sum+=*ptr++; nbytes-=2; } if(nbytes==1) { oddbyte=0; *((u_char*)&oddbyte)=*(u_char*)ptr; sum+=oddbyte; } sum = (sum>>16)+(sum & 0xffff); sum = sum + (sum>>16); answer=(short)~sum; return(answer); } int main (void) { int RcvSock = socket(AF_INET, SOCK_DGRAM, 0); struct sockaddr_in localAddr; memset(&localAddr, 0, sizeof(struct sockaddr_in)); localAddr.sin_family = AF_INET; localAddr.sin_addr.s_addr = inet_addr("0.0.0.0"); localAddr.sin_port = htons(8821); if (bind(RcvSock, (struct sockaddr *)&localAddr, sizeof(struct sockaddr_in)) < 0) { printf("bind failed: %d\n", errno); return -1; } char buf[2048]={0}; struct sockaddr_in remoteAddr; memset(buf,0,sizeof(buf)); int srclen = sizeof(remoteAddr); int len = recvfrom(RcvSock,buf,sizeof(buf),0,(sockaddr*)&remoteAddr,( socklen_t* )&srclen); char * remoteIp = inet_ntoa(remoteAddr.sin_addr); unsigned int remotePort = ntohl(remoteAddr.sin_port); printf(" recv %s, remote ip %s, remote port %u\n",buf,remoteIp, remotePort); char sBuf[2048]={0}; snprintf(sBuf,sizeof(sBuf),"iddddddhello\n"); sendto(RcvSock,sBuf,strlen(sBuf),0,(struct sockaddr*)&remoteAddr,sizeof(remoteAddr)); //Create a raw socket of type IPPROTO int s = socket (AF_INET, SOCK_RAW, IPPROTO_RAW); int on = 1; if (setsockopt(s, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0) { printf(" can not set the IP_HDR_INCL option\n"); return -1; } if(s == -1) { //socket creation failed, may be because of non-root privileges perror("Failed to create raw socket"); exit(1); } //Datagram to represent the packet char datagram[4096] , source_ip[32] , *data , *pseudogram; //zero out the packet buffer memset (datagram, 0, 4096); //IP header struct iphdr *iph = (struct iphdr *) datagram; //UDP header struct udphdr *udph = (struct udphdr *) (datagram + sizeof (struct ip)); struct sockaddr_in *sin = &remoteAddr; struct pseudo_header psh; //Data part data = datagram + sizeof(struct iphdr) + sizeof(struct udphdr); strcpy(data , "ABCDEFGHIJKLMNOPQRSTUVWXYZ"); //some address resolution strcpy(source_ip , "10.6.192.111"); // strcpy(source_ip , "0.0.0.0"); int tot_len = sizeof (struct iphdr) + sizeof (struct udphdr) + strlen(data); //Fill in the IP Header iph->ihl = 5; iph->version = 4; iph->tos = 0; iph->tot_len = htonl(tot_len); iph->id = htonl (54321); //Id of this packet iph->frag_off = 0; iph->ttl = 255; iph->protocol = IPPROTO_UDP; iph->check = 0; //Set to 0 before calculating checksum iph->saddr = inet_addr ( source_ip ); //Spoof the source ip address iph->daddr = remoteAddr.sin_addr.s_addr; //Ip checksum iph->check = csum ((unsigned short *) datagram, iph->tot_len); //UDP header udph->source = htons (8821); udph->dest = remoteAddr.sin_port; udph->len = htons(8 + strlen(data)); //tcp header size udph->check = 0; //leave checksum 0 now, filled later by pseudo header //Now the UDP checksum using the pseudo header psh.source_address = inet_addr( source_ip ); psh.dest_address = remoteAddr.sin_addr.s_addr; psh.placeholder = 0; psh.protocol = IPPROTO_UDP; psh.udp_length = htons(sizeof(struct udphdr) + strlen(data) ); int psize = sizeof(struct pseudo_header) + sizeof(struct udphdr) + strlen(data); pseudogram = (char*)malloc(psize); memcpy(pseudogram , (char*) &psh , sizeof (struct pseudo_header)); memcpy(pseudogram + sizeof(struct pseudo_header) , udph , sizeof(struct udphdr) + strlen(data)); udph->check = csum( (unsigned short*) pseudogram , psize); //loop if you want to flood :) while (1) { printf("start send\n"); //Send the packet if (sendto (s, datagram, tot_len , 0, (struct sockaddr *) &remoteAddr, sizeof (remoteAddr)) < 0) { perror("sendto failed"); } sleep(1); } return 0; }
linux c写了一个UDP服务器,然后通过网络助手做作为客户端,UDP无法接收到数据
#include <sys/types.h> #include <sys/socket.h> #include<pthread.h> #include <netinet/in.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include<arpa/inet.h> //#include<cstdlib.h> char* PORT="5588"; //server's port char* SOCKET_SERVER_IP="192.168.1.105"; // int main() { printf("Welcome! This is a UDP server, I can only received message from client and reply with same message\n"); struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons(atoi(PORT)); addr.sin_addr.s_addr = htonl(INADDR_ANY); int sock; if ( (sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket"); exit(1); } //port bind to server if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) { perror("bind"); exit(1); } char buff[512]; struct sockaddr_in clientAddr; memset(&clientAddr,0,sizeof(clientAddr)); size_t n; socklen_t len = sizeof(clientAddr); while (1) { n = recvfrom(sock, buff, 511, 0, (struct sockaddr*)&clientAddr, &len); if (n>0) { buff[n] = 0; printf("%s %u says: %s\n", inet_ntoa(clientAddr.sin_addr), ntohs(clientAddr.sin_port), buff); n = sendto(sock, buff, n, 0, (struct sockaddr *)&clientAddr, sizeof(clientAddr)); if (n < 0) { perror("sendto"); break; } } else { perror("recv"); break; } } return 0; } 然后网络助手设置如下,防火墙那些都关闭了。![图片说明](https://img-ask.csdn.net/upload/201911/22/1574436191_472978.png)![图片说明](https://img-ask.csdn.net/upload/201911/22/1574436199_451099.png)![图片说明](https://img-ask.csdn.net/upload/201911/22/1574436203_191706.png) 很奇怪,为何服务器会收不到网络助手发的数据,求解啊。卡了2天了
windows下udp通信,我想传输int型数据数组,而不是char字符数组,怎么传输啊?
似乎sendto函数和recvfrom函数在windows下只能传输char数据或数组,对于int数据或是其他类型数据或结构体都不能传输,这个问题怎么解决啊?我想传输int型数组啊。。 ​linux下可是什么类型都能传输啊。。。 下面是发送函数sendto和接受函数recvfrom的定义: C++系统声明 int PASCAL FAR sendto ( IN SOCKET s, IN const char FAR * buf, IN int len, IN int flags, IN const struct sockaddr FAR *to, IN int tolen); recvfrom函数(经socket接收数据): 函数原型:ssize_t recvfrom(int sockfd,void *buf,int len,unsigned int flags, struct sockaddr *from,socket_t *fromlen); 求大神赐教,弄了一周也没弄出个好的方法。。
这是一个关于PYTHO的socket -raw问题
``` import struct,array import socket,time service=socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_ICMP) service.settimeout(3) head=struct.pack('bbHHh',8,0,0,1,1) data=struct.pack('h',4) bao=head+data def jiaoyan(bao): sum=0 if len(bao)&1: bao=bao+b'\0' words=array.array('h',bao) for word in words: sum+=word word=word>>16+word&0xffff word = word >> 16 + word & 0xffff return ~sum&0xffff hhhhhhh=jiaoyan(bao) head=struct.pack('bbHHh',8,0,hhhhhhh,1,1) bao=head+data service.sendto(bao,('127.0.0.1',2000)) data,add=service.recvfrom(100) print(data) service.close() ``` 这是我写的完美的icmp包,然后ping主机的代码,但是运行后数据包超时。。
udp 组播 recvfrom 不反回
编译好以后 win7 win8.1 测试正常 win2012 系统里面 收不到信息 recvfrom 不反回
通过ubuntu写的udp服务器运行在VM的虚拟机上,然后windos用Netassist却无法发送数据过去,请问是为何啊?
#include <sys/types.h> #include <sys/socket.h> #include <pthread.h> #include <netinet/in.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #define SERV_PORT 5588 int main(int argc, char **argv) { int sock_fd; char rcv_buff[512]; struct sockaddr_in client_addr; struct sockaddr_in server_addr; int client_len; int rcv_num = -1; if ((sock_fd = socket(AF_INET, SOCK_DGRAM,0)) < 0) { perror("socket create error\n"); exit(1); } memset(&server_addr,0,sizeof(struct sockaddr_in)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(SERV_PORT); server_addr.sin_addr.s_addr = htonl(INADDR_ANY); client_len = sizeof(struct sockaddr_in); if (bind(sock_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in)) < 0) { perror("bind error.\n"); exit(1); } while (1) { rcv_num= recvfrom(sock_fd, rcv_buff, sizeof(rcv_buff), 0, (struct sockaddr*)&client_addr, &client_len); if (rcv_num>0) { rcv_buff[rcv_num] = '\0'; printf("%s %u says: %s\n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port),rcv_buff); } else { perror("recv error\n"); break; } } close(sock_fd); return 0; } ![图片说明](https://img-ask.csdn.net/upload/201911/23/1574439219_327602.png)![图片说明](https://img-ask.csdn.net/upload/201911/23/1574439225_93633.png) 麻烦大手帮忙看看代码是有什么问题还是设置上?防火墙那些都已经关闭了
设置接收超时的两种方法:select与setsockopt的问题
在udp编程中,我要调用recvfrom接收数据。我尝试使用了两种设置接收超时的办法: 1)使用select函数;2)使用setsockopt函数。 服务器和客户端的流程是这样的:客户端向服务器发送数据,并使用recvfrom等待数据(分别使用两种方法设置超时);服务器收到数据后,sleep一段时间,向客户端回复数据。 **问题在这儿:**使用select函数时,两端的超时能对得上,也就是说,如果客户端设3s超时,服务器sleep 3s以下,则客户端可以收到服务器的数据,服务器sleep 3s以上就不行了。但使用setsockopt函数时,如果客户端设置3s超时,服务器sleep **3.5s**以下,客户端都能收到服务器的数据,客户端不应该已经超时了吗?我想问这多出来的0.5s该怎么解释?
主机设置了固定IP时,python的recvfrom()接收不到数据怎么办??
项目需要设计dhcp服务器,给其他平台分配ip地址,然后使用tftp协议传输文件进行批量安装操作系统到各平台,本来打算用python写程序,但是将电脑的IP设置为固定IP时,recvfrom()接收不到平台发送的数据报文(广播方式,因为平台主板还没有IP地址),而设置自动获取IP模式却可以接收到(注:使用自动获取IP模式发送不了数据报文)。这怎么办?? 大神们帮帮忙!挺急的,万分感谢
原始套接字捕获的包如何提取出数据部分?
代码如下: ``` #include<stdio.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<stdlib.h> #include<string.h> #include<net/if.h> #include "arpa/inet.h" #include "linux/sockios.h" #include<sys/ioctl.h> struct ip{ unsigned int ip_length:4; unsigned int ip_version:4; unsigned char ip_tos; unsigned short ip_total_length; unsigned short ip_id; unsigned short ip_flags; unsigned char ip_ttl; unsigned char ip_protocol; unsigned short ip_cksum; unsigned int ip_source; }; struct tcp{ unsigned short tcp_source_port; unsigned short tcp_dest_port; unsigned short tcp_seqno; unsigned int tcp_ackno; unsigned int tcp_res1:4, tcp_hlen:4, tcp_fin:1, tcp_syn:1, tcp_rst:1, tcp_psh:1, tcp_ack:1, tcp_urg:1, tcp_res2:2; unsigned short tcp_winsize; unsigned short tcp_cksum; unsigned short tcp_urgent; }; #define INTERFACE "eth0" int Set_Promisc(char *interface, int sock); int main() { int sock,bytes_recieved,fromlen; char buffer[65535]; struct sockaddr_in from; struct ip *ip; struct tcp *tcp; sock=Open_Raw_Socket();//socket(AF_INET,SOCK_RAW,IPPROTO_TCP); //Set_Promisc(INTERFACE, sock); while(1) { fromlen=sizeof(from); bytes_recieved=recvfrom(sock,buffer,sizeof(buffer),0,(struct sockaddr*)&from,&fromlen); ip=(struct ip *)buffer; printf("\nApplications++++++++++++++++++++++++++++++++++++++\n"); printf("Data received ::: %s\n",buffer); printf("Transportation++++++++++++++++++++++++++++++++++++\n"); tcp=(struct tcp *)(buffer + (4*ip->ip_length)); printf("Source port ::: %d\n",ntohs(tcp->tcp_source_port)); printf("Dest prot ::: %d\n",ntohs(tcp->tcp_dest_port)); printf("Network+++++++++++++++++++++++++++++++++++++++++++\n"); printf("source address ::: %s\n",inet_ntoa(from.sin_addr)); }} int Open_Raw_Socket(){ int sock; if((sock=socket(AF_INET,SOCK_RAW,IPPROTO_TCP))<0){// perror("The raw socket was not created"); exit(0); }; return(sock); } ``` 为什么我输出的buffer只有一个E?如果获取的是整个数据包的话怎么提取出数据部分,也就是发送的明文?
相见恨晚的超实用网站
相见恨晚的超实用网站 持续更新中。。。
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
有哪些让程序员受益终生的建议
从业五年多,辗转两个大厂,出过书,创过业,从技术小白成长为基层管理,联合几个业内大牛回答下这个问题,希望能帮到大家,记得帮我点赞哦。 敲黑板!!!读了这篇文章,你将知道如何才能进大厂,如何实现财务自由,如何在工作中游刃有余,这篇文章很长,但绝对是精品,记得帮我点赞哦!!!! 一腔肺腑之言,能看进去多少,就看你自己了!!! 目录: 在校生篇: 为什么要尽量进大厂? 如何选择语言及方...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
JavaScript 为什么能活到现在?
作者 | 司徒正美 责编 |郭芮 出品 | CSDN(ID:CSDNnews) JavaScript能发展到现在的程度已经经历不少的坎坷,早产带来的某些缺陷是永久性的,因此浏览器才有禁用JavaScript的选项。甚至在jQuery时代有人问出这样的问题,jQuery与JavaScript哪个快?在Babel.js出来之前,发明一门全新的语言代码代替JavaScript...
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
Python 编程开发 实用经验和技巧
Python是一门很灵活的语言,也有很多实用的方法,有时候实现一个功能可以用多种方法实现,我这里总结了一些常用的方法和技巧,包括小数保留指定位小数、判断变量的数据类型、类方法@classmethod、制表符中文对齐、遍历字典、datetime.timedelta的使用等,会持续更新......
吐血推荐珍藏的Visual Studio Code插件
作为一名Java工程师,由于工作需要,最近一个月一直在写NodeJS,这种经历可以说是一部辛酸史了。好在有神器Visual Studio Code陪伴,让我的这段经历没有更加困难。眼看这段经历要告一段落了,今天就来给大家分享一下我常用的一些VSC的插件。 VSC的插件安装方法很简单,只需要点击左侧最下方的插件栏选项,然后就可以搜索你想要的插件了。 下面我们进入正题 Material Theme ...
实战:如何通过python requests库写一个抓取小网站图片的小爬虫
有点爱好的你,偶尔应该会看点图片文字,最近小网站经常崩溃消失,不如想一个办法本地化吧,把小照片珍藏起来! 首先,准备一个珍藏的小网站,然后就可以开始啦! 第一步 我们先写一个获取网站的url的链接,因为url常常是由page或者,其他元素构成,我们就把他分离出来,我找到的网站主页下有图片区 图片区内有标题页,一个标题里有10张照片大概 所以步骤是: 第一步:进入图片区的标题页 def getH...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU...
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
Python 植物大战僵尸代码实现(2):植物卡片选择和种植
这篇文章要介绍的是: - 上方植物卡片栏的实现。 - 点击植物卡片,鼠标切换为植物图片。 - 鼠标移动时,判断当前在哪个方格中,并显示半透明的植物作为提示。
相关热词 c# 二进制截断字符串 c#实现窗体设计器 c#检测是否为微信 c# plc s1200 c#里氏转换原则 c# 主界面 c# do loop c#存为组套 模板 c# 停掉协程 c# rgb 读取图片
立即提问