socket编程,服务器断开,程序卡死在send函数 10C

请问大神们。下面的代码有什么问题的呢?为什么服务器断开。select超时是不跑的呢。谢谢!
int cflags = fcntl(pLink->iSocketFd,F_GETFL,0);
fcntl(pLink->iSocketFd,F_SETFL, cflags|O_NONBLOCK);
fd_set rds, wrs, exs;

FD_ZERO(&rds);     // 初始化  
FD_ZERO(&wrs);  
FD_ZERO(&exs);  

FD_SET(pLink->iSocketFd, &rds);    //设置socket句柄到select的FD参数中  
FD_SET(pLink->iSocketFd, &wrs);  
FD_SET(pLink->iSocketFd, &exs);  

struct timeval timeout;

if (pLink && 0 < pLink->iSocketFd)
{
    PC_SERVER_LOG("tcp send data start: addr:%s,port:%d\n", pLink->strRemoteAddr, pLink->iRemotePort);
    timeout.tv_sec  = 3;  
        timeout.tv_usec = 0;  
        PC_SERVER_LOG("lhw_mark pLink->iSocketFd = (%d)  line @@@@@\r\n", pLink->iSocketFd);
            int retSelect = select(pLink->iSocketFd, NULL, &wrs, NULL, &timeout);

            if ( retSelect == 0 ) {  
           PC_SERVER_LOG("lhw_mark select time out  429 line \r\n");
           return ET_AT_CMD_ERROR;

            } else if ( retSelect == -1) {  
            PC_SERVER_LOG("lhw_mark select Error  433 line \r\n");
            return ET_AT_CMD_SELECT_ERROR;
               // break;  
            } else {  
            PC_SERVER_LOG("lhw_mark select Total  437 line\r\n");
               // break;  
            }  

    while (0 < nRemain)
    {
        nSend = nRemain < 1024 ? nRemain : 1024;

        PC_SERVER_LOG("lhw_mark pLink->iSocketFd = (%d)  line @@@@@\r\n", pLink->iSocketFd);
        ret = send(pLink->iSocketFd, pSendPos, nSend, 0);
        if (-1 == ret)
        {
            PC_SERVER_LOG("lhw_mark error = (%d),error() @@@@@\r\n", errno);

            PC_SERVER_LOG("[et]link:(%d),send data   line\r\n", pLink->iLinkId);
            break;
        }
        PC_SERVER_LOG("lhw_mark 3333333 ret = (%d)  line @@@@@\r\n", ret);
        PC_SERVER_LOG("lhw_mark pLink->iSocketFd = (%d)  line @@@@@\r\n", pLink->iSocketFd);
        nRemain = nRemain - nSend;
        pSendPos = pSendPos + nSend;
        PC_SERVER_LOG("[et]link:%d,send %d\r\n", pLink->iLinkId, nSend);
        pLink->stDataFlow.nTxToSocket += nSend;
        pLink->stDataFlow.nTxAckSum += ret;
    }
}

3个回答

先看你的超时是否设置成功了,然后send确实是否没有返回。

超时是成功了,send也没返回值的。

怎么能看出超时是成功的呢?
int retSelect = select(pLink->iSocketFd, NULL, &wrs, NULL, &timeout);

        if ( retSelect == 0 ) {  
       PC_SERVER_LOG("lhw_mark select time out  429 line \r\n");
       return ET_AT_CMD_ERROR;

        } 
        这里一直没有打印信息的。
        谢谢!
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
在无数据传输时服务器端怎样检测客户端已经断开

windows下的一个服务器程序,在数据传输过程中如果客户端断开了,send函数发送失败即可知道后端断开了,那如果没有数据传输时怎样判断?除了发探测包还有其他好的方法吗?

关于socket服务器收不了信息

我是socket新手,只想学着做个客户端发信息,服务器接收这条信息的程序。用的是VS2005,MFC。 在网上看了一个图文说明,照着做了,服务器就是接收不到数据。用现场的好的客户端来测试,还是不行,代码如下: ChatServerDlg。cpp中: void CChatServerDlg::SocketReset() //函数实现 { if(m_ServerSocket!=NULL) { delete m_ServerSocket; m_ServerSocket=NULL; } } void CChatServerDlg::OnClose() //函数实现 { m_ListWords.AddString(_T("服务器端断开了")); m_ListWords.SetTopIndex(m_ListWords.GetCount() - 1); m_ServerSocket->Close(); SocketReset(); //避免指针悬空 } void CChatServerDlg::OnReceive() //这个进不了 { /*char szTemp[200]; int n = m_ClientSocket->Receive(szTemp,200); szTemp[n] = '\0'; CString sTemp; sTemp.Format(_T("收到:%s"),szTemp); m_ListWords.AddString(sTemp); m_ListWords.SetTopIndex(m_ListWords.GetCount() - 1);*/ *m_archiveIn>>m_Input; m_archiveIn->Flush(); m_ListWords.AddString(_T("收到:") + m_Input); m_ListWords.SetTopIndex(m_ListWords.GetCount() - 1); } void CChatServerDlg::OnAccept() //这个进不了 { m_ServerSocket = new MySocket; m_ServerSocket->GetDlg(this); m_ListenSocket->Accept(*m_ServerSocket); m_ServerSocket->AsyncSelect(FD_READ|FD_CLOSE); m_socketfile = new CSocketFile(m_ServerSocket); m_archiveIn = new CArchive(m_socketfile,CArchive::load); m_archiveOut = new CArchive(m_socketfile,CArchive::store); m_ListWords.AddString(_T("接受了一个客户端的连接请求")); m_ListWords.SetTopIndex(m_ListWords.GetCount() - 1); } void CChatServerDlg::OnBnClickedButton1() //开始监听按钮。这个没问题 { // TODO: 在此添加控件通知处理程序代码 if(!AfxSocketInit()) //初始化套接字 { MessageBox(_T("WindowSocket initial failed!"),_T("Send"),MB_ICONSTOP); return; } m_ListenSocket = new MySocket; m_ListenSocket->GetDlg(this); BYTE nFild[4]; CString sIP,sP; UpdateData(); ServerIP.GetAddress(nFild[0],nFild[1],nFild[2],nFild[3]); sIP.Format(_T("%d.%d.%d.%d"),nFild[0],nFild[1],nFild[2],nFild[3]); sP.Format(_T("%d"),sPort); m_ListenSocket->Create(sPort,1,sIP); //创建服务端监听Socket m_ListenSocket->Listen(1); //开始监听 m_ListWords.AddString(_T("监听开始:")); m_ListWords.AddString(_T("地址") + sIP + _T(" 端口") + sP); m_ListWords.AddString(_T("等待客户端连接……")); } void CChatServerDlg::OnBnClickedButton2() //停止监听按钮。这个不管 { // TODO: 在此添加控件通知处理程序代码 if(m_ListenSocket!=NULL) { delete m_ListenSocket; m_ListenSocket = NULL; } m_ListWords.AddString(_T("停止监听")); } void CChatServerDlg::OnBnClickedButton3() //断开按钮。这个不管 { // TODO: 在此添加控件通知处理程序代码 SocketReset(); m_ListWords.AddString(_T("与客户端断开")); } void CChatServerDlg::OnBnClickedButton4() ///发送信息按钮。这个不管 { // TODO: 在此添加控件通知处理程序代码 CString strstr; m_edit2.GetWindowTextW(strstr); int ddd=CStringA(strstr).GetLength(); char a[5000]; ConvertCStringToCharArray(strstr,a); UpdateData(); m_ServerSocket->Send(a,ddd+1,0); //发信息 CString str2; str2.Format(_T("发送:%s"),strstr); m_ListWords.AddString(str2); m_ListWords.SetTopIndex(m_ListWords.GetCount() - 1); } MySocket.cpp代码如下: void MySocket::GetDlg(CChatServerDlg * dlg) //获得窗口界面的指针 { m_dlg=dlg; } void MySocket::OnClose(int nErrorCode) { // TODO: 在此添加专用代码和/或调用基类 m_dlg->OnClose(); CSocket::OnClose(nErrorCode); } void MySocket::OnReceive(int nErrorCode)// { // TODO: 在此添加专用代码和/或调用基类 m_dlg->OnReceive(); AsyncSelect(FD_CLOSE|FD_READ|FD_WRITE); CSocket::OnReceive(nErrorCode); } void MySocket::OnAccept(int nErrorCode)//这个可以进去,并且一直运行到末尾,然后就不知道运行到哪了,然后就没反应了 { // TODO: 在此添加专用代码和/或调用基类 ((CChatServerDlg *)(AfxGetApp()->m_pMainWnd))->m_ListWords.AddString(_T("接受了一个客户端的连接请求")); ((CChatServerDlg *)(AfxGetApp()->m_pMainWnd))->m_ListWords.SetTopIndex( ((CChatServerDlg *)(AfxGetApp()->m_pMainWnd))->m_ListWords.GetCount()-1); CSocket::OnAccept(nErrorCode); }

客户端断开服务端就会产生异常并断开

WIN10上开发一个服务端程序,它能监听来自多个客户端的请求并连接,其中客户端会往服务端传送文件,使用SOCKET tcp协议。现在是每次客户端发送完文件后,服务端也能正常接收完文件,但接收完后就会产生异常退出。是开的线程来运行接收函数,现在要怎样定位问题呢?exe直接退出要应该怎么抓取log呢? 接收部分代码如下: DWORD CClient::RecvDataThread(void* pParam) { CClient *pClient = (CClient*)pParam; //pointer to client int reVal; //return value char temp[MAX_NUM_BUF]; //temp value WriteToLog("RecvDataThread"); cout <<"RecvDataThread"<<endl; while(pClient->m_bConning) //connection status { // if(!pClient->m_bSendConnectionSuccess) // { // break; // } cout <<"pClient->m_bConning"<<endl; memset(temp, 0, MAX_NUM_BUF); reVal = recv(pClient->m_socket, temp, MAX_NUM_BUF, 0); //receive data //handle error return values if (SOCKET_ERROR == reVal) { int nErrCode = WSAGetLastError(); if ( WSAEWOULDBLOCK == nErrCode ) //receive data buffer is invalid { continue; //continue loop }else if (WSAENETDOWN == nErrCode ||//client close connection WSAETIMEDOUT == nErrCode || WSAECONNRESET == nErrCode ) { break; //thread exit } } //client close the connection if ( reVal == 0) { break; } //receive data if (reVal > 0) { cout <<"reVal > 0"<<endl; EnterCriticalSection(&pClient->m_cs); char *pClientIP = inet_ntoa(pClient->m_addr.sin_addr); u_short clientPort = ntohs(pClient->m_addr.sin_port); // cout<<"IP: "<<pClientIP<<"\tPort: "<<clientPort<<":"<<temp<<endl; //output and show data WriteToLog(temp); char file_name[MAX_NUM_BUF]; char *pfile = temp; // indicate path memset(file_name, 0, MAX_NUM_BUF); strncpy_s(file_name, "F:\\receive\\", strlen("F:\\receive\\")); int file_len = strlen(temp), i = 0, tem = 0; for (i = 0; i < file_len; i++) { if (strncmp(pfile + file_len - 1 -i, "\\", 1)) //if equal, return 0; else, return Positive { tem++; continue; //not equal } else // if equal, strcat path after \\ to file_name, it's exact length of path after { strncat_s(file_name, pfile + file_len - i, i); break; } } if (tem == file_len) { strncat_s(file_name, temp, strlen(temp) > 1024 ? 1024 : strlen(temp)); } FILE *fp; fopen_s(&fp, file_name, "wb"); int len = send(pClient->m_socket, "Ready to send", strlen("Ready to send") + 1, 0); memset(sendMsgLogA, 0, 1024); sprintf_s(sendMsgLogA, "%s%d", "send size: ", len ); WriteToLog(sendMsgLogA); char datalength[20]; long int length = 0; int lenRecv = recv(pClient->m_socket, datalength, 21, 0); //send file size from Client length = atol(datalength); memset(sendMsgLogA, 0, 1024); sprintf_s(sendMsgLogA, "%s%ld%s%ld", "file size: ", length, " recv size:", lenRecv); WriteToLog(sendMsgLogA); //ready to send double cent = 0.0; char receiveBuf[SIZE]; long int x = 0; while (1) { cout <<"while (1)"<<endl; x = x + SIZE; //SIZE scope is from -128 to 127 if (x < length) // ZJX { cent = (double)x*100.0 / (double)length; memset(sendMsgLogA, 0, 1024); sprintf_s(sendMsgLogA, "%s%4.2f", "have received: ", cent); WriteToLog(sendMsgLogA); //ready to send recv(pClient->m_socket, receiveBuf, SIZE + 1, 0); //recv SIZE files fwrite(receiveBuf, 1, SIZE, fp); //write SIZE files into receiveBuf, and continue to loop } else //excute the function directory while files is smaller, and loop exit { recv(pClient->m_socket, receiveBuf, length + SIZE - x + 1, 0); fwrite(receiveBuf, 1, length + SIZE - x, fp); fclose(fp); WriteToLog("file received done"); break; } } } WriteToLog("out of reVal>0"); LeaveCriticalSection(&pClient->m_cs); WriteToLog("out of LeaveCriticalSection"); memset(temp, 0, MAX_NUM_BUF); //clean up temp variables } WriteToLog("out of pClient->m_bConning"); pClient->m_bConning = FALSE; //disconnect with client return 0; //thread exit } ``` ```

设置接收超时的两种方法:select与setsockopt的问题

在udp编程中,我要调用recvfrom接收数据。我尝试使用了两种设置接收超时的办法: 1)使用select函数;2)使用setsockopt函数。 服务器和客户端的流程是这样的:客户端向服务器发送数据,并使用recvfrom等待数据(分别使用两种方法设置超时);服务器收到数据后,sleep一段时间,向客户端回复数据。 **问题在这儿:**使用select函数时,两端的超时能对得上,也就是说,如果客户端设3s超时,服务器sleep 3s以下,则客户端可以收到服务器的数据,服务器sleep 3s以上就不行了。但使用setsockopt函数时,如果客户端设置3s超时,服务器sleep **3.5s**以下,客户端都能收到服务器的数据,客户端不应该已经超时了吗?我想问这多出来的0.5s该怎么解释?

Linux 网络编程 epoll中的EPOLLIN EPOLLOUT如何触发

代码很长只截取关键部分 //服务器端 #include<sys/socket.h> #include<netinet/in.h> #include<stdio.h> #include<unistd.h> #include<errno.h> #include<string.h> #include<stdlib.h> #include<cassert> #include<sys/epoll.h> #include"locker.h" #include"threadpool.h" #include"http_conn.h" #include"http_conn.cpp" extern void addfd(int epollfd,int fd,bool one_shot); extern void removefd(int epollfd,int fd); #define MAX_FD 65536 #define MAX_EVENT_NUMBER 10000 void addsig(int sig,void(handler)(int),bool restart=true) { struct sigaction sa; memset(&sa,'\0',sizeof(sa)); sa.sa_handler=handler; if(restart) { sa.sa_flags|=SA_RESTART; } sigfillset(&sa.sa_mask); assert(sigaction(sig,&sa,NULL)!=-1); } void show_error(int connfd,const char* info) { printf("%s",info); send(connfd,info,strlen(info),0); close(connfd); } int main(int argc,char* argv[]) { if(argc<2) { printf("usage: %s ip_address port_number\n",basename(argv[0])); return 1; } const char* ip=argv[1]; int port=atoi(argv[2]); addsig(SIGPIPE,SIG_IGN); threadpool<http_conn>* pool=NULL; pool=new threadpool<http_conn>(3); http_conn* users=new http_conn[MAX_FD]; assert(users); int user_count=0; int listenfd=socket(PF_INET,SOCK_STREAM,0); assert(listenfd>=0); struct linger tmp={1,0}; setsockopt(listenfd,SOL_SOCKET,SO_LINGER,&tmp,sizeof(tmp)); int ret=0; struct sockaddr_in address; bzero(&address,sizeof(address)); address.sin_family=AF_INET; inet_pton(AF_INET,ip,&address.sin_addr); address.sin_port=htons(port); ret=bind(listenfd,(struct sockaddr*)&address,sizeof(address)); assert(ret>=0); ret=listen(listenfd,5); assert(ret>=0); epoll_event events[MAX_EVENT_NUMBER]; int epollfd=epoll_create(5); assert(epollfd!=-1); addfd(epollfd,listenfd,false); http_conn::m_epollfd=epollfd; while(1) { int number=epoll_wait(epollfd,events,MAX_EVENT_NUMBER,-1); printf("number is %d\n",number); if((number<0)&&(errno!=EINTR)) { printf("epoll failure\n"); break; } for(int i=0;i<number;i++) { int sockfd=events[i].data.fd; if(sockfd==listenfd) { struct sockaddr_in client_address; socklen_t client_addrlength=sizeof(client_address); int connfd=accept(listenfd,(struct sockaddr*)&client_address,&client_addrlength); if(connfd<0) { printf("errno is: %d\n",errno); continue; } if(http_conn::m_user_count>=MAX_FD) { show_error(connfd,"Internal sever busy"); continue; } printf("running the init(connfd,client_address)"\n); users[connfd].init(connfd,client_address); } else if(events[i].events&(EPOLLRDHUP|EPOLLHUP|EPOLLERR)) { users[sockfd].close_conn(); } else if(events[i].events&EPOLLIN) { if(users[sockfd].read()) { pool->append(users+sockfd); } else { users[sockfd].close_conn(); } } else if(events[i].events&EPOLLOUT) { if(!users[sockfd].write()) { users[sockfd].close_conn(); } } } } close(epollfd); close(listenfd); delete [] users; delete pool; return 0; } 以上是服务器端的主程序 思路是epoll_wait接收到连接就为连接创建一个users存储然后等待后续的操作 但后面EPOLLIN 和EPOLLOUT永远都没法触发 不清楚该怎么触发 另一端写了服务器压力测试程序 和以上代码类似 就是循环创建socket对象然后connect()服务器 但我本意想两端互相发送数据 可connect()后服务器收到创建一个user 继续循环等待 但压力测试程序也在创建完对象后陷入循环等待服务器端的操作 请问该如何触发EPOLLIN和EPOLLOUT信号 以下是压力测试程序关键代码 #include<stdlib.h> #include<stdio.h> #include<assert.h> #include<unistd.h> #include<sys/types.h> #include<sys/epoll.h> #include<fcntl.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<string.h> static const char* request = "GET http://localhost/index.html HTTP/1.1\r\nConnection: keep-alive\r\n\r\nxxxxxxxxxx"; int setnonblocking(int fd) { int old_option=fcntl(fd,F_GETFL); int new_option=old_option|O_NONBLOCK; fcntl(fd,F_SETFL,new_option); return old_option; } void addfd(int epollfd,int fd) { epoll_event event; event.data.fd=fd; event.events=EPOLLIN|EPOLLET|EPOLLRDHUP; epoll_ctl(epollfd,EPOLL_CTL_ADD,fd,&event); setnonblocking(fd); } bool write_nbytes(int sockfd,const char* buffer,int len) { int byters_write=0; printf("write out %d bytes to socket %d\n",len,sockfd); while(1) { bytes_write=send(sockfd,buffer,len,0); if(bytes_write==-1) { return false; } else if(bytes_write==0) { return false; } len-=bytes_write; buffer=buffer+bytes_write; if(len<=0) { return true; } } } bool read_once(int sockfd,char* buffer,int len) { int bytes_read=0; memset(buffer,'\0',len); bytes_read=recv(sockfd,buffer,len,0); if(bytes_read==-1) { return false; } else if(bytes_read==0) { return false; } printf("read in %d bytes from socket %d with content: %s\n",bytes_read,sockfd,buffer); return true; } void start_conn(int epoll_fd,int num,const char* ip,int port) { int ret=0; struct sockaddr_in address; bzero(&address,sizeof(address)); address.sin_family=AF_INET; inet_pton(AF_INET,ip,&address.sin_addr); address.sin_port=htons(port); for(int i=0;i<num;++i) { sllep(1); int sockfd=socket(PF_INET,SOCK_STREAM,0); printf("create 1 sock\n"); if(sockfd<0) { continue; } if(connect(sockfd,(struct sockaddr*)&address,sizeof(address))==0) { printf("build connection %d\n",i); addfd(epoll_fd,sockfd); } } } void close_conn(int epoll_fd,int sockfd) { epoll_ctl(epoll_fd,EPOLL_CTL_DEL,sockfd,0); close(sockfd); } int main(int argc,char* argv[]) { assert(argc==4); int epoll_fd=epoll_create(100); start_conn(epoll_fd,atoi(argv[3]),argv[1],atoi(argv[2])); epoll_event events[10000]; char buffer[2048]; while(1) { int fds=epoll_wait(epoll_fd,events,10000,2000); for(int i=0;i<fds;i++) { int sockfd=events[i].data.fd; if(event[i].events&EPOLLIN) { if(!read_once(sockfd,buffer,2048)); { close_conn(epoll_fd,sockfd); } struct epoll_event event; event.events=EPOLLOUT|EPOLLET|EPOLLERR; event.data.fd=sockfd; epoll_ctl(epoll_fd,EPOLL_CTL_MOD,sockfd,&event); } else if(events[i].events&EPOLLOUT) { if(!write_nbytes(sockfd,request,strlen(request))) { close_conn(epoll_fd,sockfd); } struct epoll_event event; event.events=EPOLLIN|EPOLLET|EPOLLERR; event.data.fd=sockfd; epoll_ctl(epoll_fd,EPOLL_CTL_MOD,sockfd,&event); } else if(events[i].events&EPOLLERR) { close_conn(epoll_fd,sockfd); } } } }

套接字程序,可以和本机的服务器互联,不能连接别的服务器,error10057,求大神帮忙!

下面是代码: ``` /* TCPClient.cpp -- 用于传递struct */ #include <stdlib.h> #include <stdio.h> #include <winsock2.h> #include <string.h> #include <time.h> #include <windows.h> #include <process.h> #include <math.h> #define BUFLEN 2000 // 缓冲区大小 #define WSVERS MAKEWORD(2, 0) // 指明版本2.0 #pragma comment(lib,"ws2_32.lib") // 指明winsock 2.0 Llibrary /*------------------------------------------------------------------------ * main - TCP client for DAYTIME service *------------------------------------------------------------------------*/ SOCKET sock, sockets[100] = { NULL }; /* socket descriptor */ // int cc; /* recv character count */ char *packet = NULL; /* buffer for one line of text */ char *pts, *input; HANDLE hThread; unsigned threadID; unsigned int __stdcall Chat(PVOID PM) { time_t now; (void)time(&now); pts = ctime(&now); char buf[2000]; while (1) { int cc = recv(sock, buf, BUFLEN, 0); //cc为接收的字符数 if (cc == SOCKET_ERROR || cc == 0) { printf("Error: %d ", GetLastError()); printf("与服务器断开连接!\n"); (void)closesocket(sock); break; } else if (cc > 0) { buf[cc] = '\0'; printf("%s\n", buf); } } return 0; } int main(int argc, char *argv[]) { time_t now; (void)time(&now); pts = ctime(&now); //char *host = "192.168.220.1"; /* server IP to connect */ //char *host = "192.168.220.1"; char *host = "202.116.76.22"; char *service = "5050"; /* server port to connect */ struct sockaddr_in sin; /* an Internet endpoint address */ WSADATA wsadata; WSAStartup(WSVERS, &wsadata); /* 启动某版本Socket的DLL */ memset(&sin, 0, sizeof(sin)); sin.sin_family = AF_INET; sin.sin_port = htons((u_short)atoi(service)); //atoi:把ascii转化为int. htons:主机序(host)转化为网络序(network), s--short sin.sin_addr.s_addr = inet_addr(host); //如果host为域名,需要先用函数gethostbyname把域名转化为IP地址 sock = socket(PF_INET, SOCK_STREAM, 0); hThread = (HANDLE)_beginthreadex(NULL, 0, Chat, NULL, 0, &threadID); printf(" LET'S CHAT(CLIENT)\n"); connect(sock, (struct sockaddr *)&sin, sizeof(sin)); while (1) { printf("请输入您要发送的信息:\n"); char buf1[2000]; gets_s(buf1); if (!strcmp(buf1, "exit")) goto end; (void)send(sock, buf1, sizeof(buf1), 0); (void)time(&now); pts = ctime(&now); printf("发送成功!\n当前时间:%s\n", pts); } end: CloseHandle(hThread); closesocket(sock); WSACleanup(); /* 卸载某版本的DLL */ printf("按回车键继续..."); getchar(); return 0; /* exit */ } ``` 下面是服务器代码: ``` /* TCPServer.cpp - main */ #include <stdlib.h> #include <stdio.h> #include <winsock2.h> #include <time.h> #include "conio.h" #include<windows.h> #include<process.h> #include<math.h> #define QLEN 5 #define WSVERS MAKEWORD(2, 0) #define BUFLEN 2000 #pragma comment(lib,"ws2_32.lib") //使用winsock 2.2 library /*------------------------------------------------------------------------ * main - Iterative TCP server for TIME service *------------------------------------------------------------------------ */ SOCKET msock, ssock; SOCKET sockets[100] = { NULL }; int cc; char *pts; time_t now; char buf[2000]; //buffer char *input; HANDLE hThread1, hThread[100] = { NULL }; unsigned int threadID, ThreadID[100], number; struct sockaddr_in fsin; struct sockaddr_in Sin; unsigned int __stdcall Chat(PVOID PM) { char buf1[2000] = { NULL }; char buf2[2000] = { NULL }; char buf3[2000] = { NULL }; char buf4[2000] = { NULL }; /*char buf1[2000]; char buf2[2000]; char buf3[2000]; char buf4[2000]; */ (void)time(&now); pts = ctime(&now); sockets[number] = ssock; SOCKET sock = ssock; ThreadID[number] = threadID; unsigned int threadid = threadID; sprintf(buf1, "线程号:[%d] 当前时间:%s", threadid, pts); (void)send(sock, buf1, sizeof(buf1), 0); sprintf(buf2, "线程号:[%d] 客户IP:[%d] 端口:[%d] enter!\n", threadid, inet_ntoa(Sin.sin_addr), fsin.sin_port); printf("%s", buf2); printf("数据已传送到所有用户!\n"); for (int i = 0; i <= number; i++) { if (sockets[i] != NULL&& sockets[i] != sock) { (void)send(sockets[i], buf2, sizeof(buf2), 0); printf("发送至线程号[%d]成功! \n", ThreadID[i]); } } printf("\n"); flag1: cc = recv(sock, buf3, BUFLEN, 0); if (cc == SOCKET_ERROR || cc == 0) { (void)time(&now); pts = ctime(&now); sprintf(buf3, "线程号:[%d] 客户IP:[%d] 端口:[%d] leave !\n当前时间:%s", threadid, inet_ntoa(Sin.sin_addr), fsin.sin_port, pts); sock = NULL; sockets[number] = NULL; printf("%s", buf3); printf("数据已传送到所有用户!\n"); for (int i = 0; i <= number; i++) { if (sockets[i] != NULL && sockets[i] != sock) { (void)send(sockets[i], buf3, sizeof(buf3), 0); printf("发送至线程号[%d]成功 !\n", ThreadID[i]); } } printf("\n"); } else if (cc > 0) { (void)time(&now); pts = ctime(&now); sprintf(buf4, "线程号:[%d] IP:[%d] 端口:[%d] \n消息内容:%s;\n当前时间:%s", threadid, inet_ntoa(Sin.sin_addr), fsin.sin_port, buf3, pts); printf("%s", buf4); printf("数据已传送到所有用户!\n"); for (int i = 0; i <= number; i++) { if (sockets[i] != NULL&&sockets[i] != sock) { (void)send(sockets[i], buf4, sizeof(buf4), 0); printf("发送至线程号[%d]成功!\n", ThreadID[i]); } } printf("\n"); goto flag1; } (void)closesocket(sock); return 0; } void main(int argc, char *argv[]) { int alen; /* from-address length*/ WSADATA wsadata; char *service = "5050"; WSAStartup(WSVERS, &wsadata); //加载 winsock 2.2 library msock = socket(PF_INET, SOCK_STREAM, 0); //生成套接字。TCP协议号=6, UDP协议号=17 memset(&Sin, 0, sizeof(Sin)); Sin.sin_family = AF_INET; Sin.sin_addr.s_addr = INADDR_ANY; //指定绑定接口的IP地址。INADDR_ANY表示绑定(监听)所有的接口。 Sin.sin_port = htons((u_short)atoi(service)); //atoi--把ascii转化为int,htons - 主机序(host)转化为网络序(network), s(short) bind(msock, (struct sockaddr *)&Sin, sizeof(Sin)); // 绑定端口号(和IP地址) listen(msock, 5); //队列长度为5 printf(" LET'S CHAT (SERVER) \n"); (void)time(&now); pts = ctime(&now); printf("当前时间:%s", pts); number = -1; while (1) { //检测是否有按键 alen = sizeof(struct sockaddr); ssock = accept(msock, (struct sockaddr *)&fsin, &alen); number++; hThread[number] = (HANDLE)_beginthreadex(NULL, 0, Chat, NULL, 0, &threadID); } (void)closesocket(msock); WSACleanup(); //卸载载 winsock 2.2 library } ```

请问按TCP协议,用soket发送这样的数据,应该按照什么格式?

![图片说明](https://img-ask.csdn.net/upload/201606/15/1465960698_103502.jpg) 如图所示,每行数据都是一个控制电文。比如我想打开设备3,就发送图中所示的 01 05 00 02 FF 00 2D FA,这些都是十六进制数,用scoket发送。这个设备用的是虚拟串口,服务器端是硬件解包,我是做上位机(客户端)的。 以打开设备3为例,我尝试了发送 BYTE buff[]={0x01,0x05,0x00,0x02,0xFF,0x00,0x2D,0xFA}; send(sClient,(LPCSTR)buff,8,0) 但是设备3没有打开,我用一个叫net tools的小工具作为服务器端测试,显示没有接受到任何数据,但是我觉得这样是符合send函数的使用方法的啊,怎么会没反应的。。。 我又尝试了发送 char buff[]="01 05 00 02 FF 00 2D FA ",设备3还是没有打开,用net tools接收数据,显示接收到01 05 00 02 FF 00 2D FA. 我不明白的地方是,send 函数到底应该怎么发送十六进制的字符串呢?我觉得我第二次尝试的办法发送的不是十六进制数啊,它应该会根据ascii码解释为其他形式的十六进制数吧。ps:这个设备还有其他形式的电文 如wx2010+0x0A这样的形式,都是按 它们的ASCII码解的。 我是新手,刚接触这些,我用C++编写代码,但是我对string类了解不是很深刻,请问是应该用string类型发送吗?希望有高手可以帮我解答一下,最好可以给我推荐一些相关的书籍或者资料,非常感谢!!如果能有个例子的话,就更好了。

VS2017,MFC,TCP通信,客户端无法连接调试助手

#1.自己所创建的客户端无法连接调试助手。 自己创建的客户端可以和自己创建的服务器端通信,调试助手连不了自己创建的服务器,自己创建的客户端也连不了调试助手。完全不知道问题出在哪了,, 两个客户端可以同时运行,端口和IP使用情况如下: ![图片说明](https://img-ask.csdn.net/upload/201901/17/1547695891_291269.png) #2.客户端核心代码如下: ##“连接”按钮的时间处理程序。 void CGeoDlg::OnBnClickedButton1() { // TODO: 在此添加控件通知处理程序代码 char ipaddress[35]; char port[8]; m_ipaddr.GetWindowText(ipaddress,30); cli.sin_addr.s_addr = inet_addr(ipaddress); cli.sin_family = AF_INET; cli.sin_port = m_ter.GetWindowText(port,8); //htons(5000); //创建socket clisock = socket(AF_INET, SOCK_STREAM, 0); //启动线程 ee = 1; AfxBeginThread(thread, 0); } ##线程AfxBeginThread()代码如下 UINT thread(LPVOID v) { char buff[100]; char array[25][30] = { "155.245.160.151", "155.245.160.152", "155.245.160.153", "155.245.160.154", "155.245.160.155", "155.245.160.156", "155.245.160.157", "155.245.160.158", "155.245.160.159", "155.245.160.160", "155.245.160.161", "155.245.160.162", "155.245.160.163", "155.245.160.164", "155.245.160.165", "155.245.160.166", "155.245.160.167", "155.245.160.168", "155.245.160.169", "155.245.160.170", "155.245.160.171", "155.245.160.172", "155.245.160.173", "155.245.160.174", "155.245.160.171" }; /*CSize size; size.cx = 0; size.cy = 30;*/ int s = 1, addcount = 0; CGeoDlg *dlg = (CGeoDlg*)AfxGetApp()->GetMainWnd(); dlg->m_connect.EnableWindow(FALSE); dlg->m_disconnect.EnableWindow(TRUE); //连接到服务器 while (connect(dlg->clisock, (sockaddr*)&(dlg->cli), sizeof(dlg->cli)) && dlg->ee != 0) { dlg->m_edit.SetWindowText("等待....."); //空循环 for (int i = 0; i <= 65000; i++) for (int j = 0; j <= 200; j++); if (addcount == 25) addcount = 0; dlg->cli.sin_addr.s_addr = inet_addr(array[addcount++]); } if (dlg->ee == 1) dlg->m_edit.SetWindowText( "连接成功"); //dlg->m_button1.EnableWindow(TRUE); dlg->SetForegroundWindow(); //循环获得数据 /*while (s != SOCKET_ERROR && dlg->ee != 0) { //调用recv函数接收数据 s = recv(dlg->clisock, buff, 100, 0); dlg->SetForegroundWindow(); if (s != SOCKET_ERROR && dlg->ee != 0) dlg->m_list.InsertItem(dlg->count++, buff); dlg->m_list.Scroll(size); }*/ //发送断开命令 send(dlg->clisock, "Disconnected", 100, 0); //dlg->m_button1.EnableWindow(FALSE); dlg->m_connect.EnableWindow(TRUE); dlg->m_disconnect.EnableWindow(FALSE); closesocket(dlg->clisock); AfxEndThread(0); return 0; } #3.完全不知到问题在哪 非计算机类专业,当时也没认真学,现在急着解决问题,实在不知道该怎么办了,,,

TCP 非阻塞套接字 发送文件数据会丢失

用以下函数将套接字设置为非阻塞套接字 bool setSockNoBlock(SOCKET s) { bool flg=true; if (::ioctlsocket(s, FIONBIO, (unsigned long *)&flg)==0) { cout<<"socket"<<s<<"已设置为非阻塞模式!"<<endl; return true; } return false; } 发送文件代码: bool sendFile(SOCKET s,char *fileName) { CWGFILE wgSendFile; char buf[WG_MAX_TCPBUF]; ZeroMemory(buf,WG_MAX_TCPBUF); int len=0; int fileLen=0; int count=0; double timeCount; CTimer t; if (wgSendFile.WG_FileOpen(fileName,WG_FILE_READ)) { t.Start(); while((len=wgSendFile.WG_FileRead(buf))>0) { fileLen+=len; send(s,buf,len,0); /*Sleep(1);*/ // cout<<count<<":"<<len<<" "; count++; if (fileLen == wgSendFile.WG_FileLen()) { timeCount = t.End(); cout<<"发送时间:"<<(double)(timeCount/1000.0)<<"S"<<endl; cout<<"发送速度:"<<(double)(fileLen/1024.0/1024.0)/(timeCount/1000.0)<<"M/S"<<endl; return wgSendFile.WG_FileClose(), true; } ZeroMemory(buf,WG_MAX_TCPBUF); } } return false; } 接收数据方代码: do { nRet = recv(sockClient,buf,WG_MAX_TCPBUF,0); if (nRet>0) { len+=nRet; wgRecvFile.WG_FileWrite(buf,nRet); ZeroMemory(buf,WG_MAX_TCPBUF); //cout<<count<<":"<<nRet<<" "; count ++; if (len == 941473792 )//本应该接收的数据长度 { cout<<"\n接受终于完了!"<<endl; break; } } if (nRet==0) { cout<<"\n服务器断开了,共接收数据:"<<len<<endl; break; } } while (nRet!=0);

关于java聊天室,求助

问题: 服务器端退出,线程却还在运行 报错: java.net.SocketException: Socket closed at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:152) at java.net.SocketInputStream.read(SocketInputStream.java:122) at java.net.SocketInputStream.read(SocketInputStream.java:210) at java.io.DataInputStream.readUnsignedShort(DataInputStream.java:337) at java.io.DataInputStream.readUTF(DataInputStream.java:589) at java.io.DataInputStream.readUTF(DataInputStream.java:564) at talkingRoom.Servicer$1.run(Servicer.java:127) *********客户端************************ import java.awt.*; import java.net.*; import java.awt.event.*; import java.io.*; import javax.swing.*; @SuppressWarnings("serial") public class Desktop extends JFrame implements ActionListener { @SuppressWarnings("unused") private class WindowCloser extends WindowAdapter { public void windowClosing(WindowEvent we) { System.exit(0); } } private Socket cs = null; private JPanel p = new JPanel(); private JTextArea output = new JTextArea(); private JTextField input = new JTextField(); private DataOutputStream dos; private DataInputStream dis; private JButton b1 = new JButton("进入"); private JButton b2 = new JButton("退出"); private JLabel fuwuqis = new JLabel("服务器:"); private JTextField fuwuqi = new JTextField("127.0.0.1"); private JLabel duankous = new JLabel("端口:"); private JTextField duankou = new JTextField("8888"); private JLabel nichengs = new JLabel("昵称:"); private JTextField nicheng = new JTextField("游客1"); private JButton b3 = new JButton("发送"); private String talking; private boolean started = false; private boolean bConnected = false; //UI界面(不需要再修改) Desktop() { p.setLayout(new BorderLayout()); JPanel p1 = new JPanel(); JPanel p2 = new JPanel(); p1.add(b1); b1.addActionListener(this); p1.add(b2); b2.addActionListener(this); p1.add(fuwuqis); p1.add(fuwuqi); p1.add(duankous); p1.add(duankou); p1.add(nichengs); p1.add(nicheng); p2.setLayout(new BorderLayout()); p2.add(input, BorderLayout.CENTER); p2.add(b3, BorderLayout.EAST); b3.addActionListener(this); p.add(p1, BorderLayout.NORTH); p.add(p2, BorderLayout.SOUTH); p.add(output, BorderLayout.CENTER); buttonclose(); this.setTitle("聊天室for客户端"); this.add(p); this.setSize(500, 300); this.setVisible(true); } public void buttonclose() { b1.setEnabled(true); b2.setEnabled(false); b3.setEnabled(false); input.setEditable(false); fuwuqi.setEditable(true); duankou.setEditable(true); nicheng.setEditable(true); } public void buttonopen() { b1.setEnabled(false); b2.setEnabled(true); b3.setEnabled(true); input.setEditable(true); fuwuqi.setEditable(false); duankou.setEditable(false); nicheng.setEditable(false); } //连接函数,流与Socket所在 public void connect() { try { cs = new Socket(fuwuqi.getText(), Integer.parseInt(duankou.getText())); System.out.print("加入连接"); dos = new DataOutputStream(cs.getOutputStream()); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } //断开函数,流与Socket所在 public void disconnect() { try { bConnected = false; dos.writeUTF("$%$"); dis.close(); dos.close(); System.out.println("disdos.close"); cs.close(); System.out.println("cs.close"); output.append("退出成功\n"); buttonclose(); } catch (IOException e) { e.printStackTrace(); } } //发送流函数 public void send() { try { if(talking == null) { dos.writeUTF(""); }else { dos.writeUTF(talking); } dos.flush(); } catch (IOException e1) { e1.printStackTrace(); } } //接收流函数 public void receive() { try { started = true; bConnected = true; dis = new DataInputStream(cs.getInputStream()); new Thread() { public void run() { System.out.println("开始接收"); while (bConnected) { String talking = ""; try { talking = dis.readUTF(); output.append("\n\r" + "主机" + " : " + talking); if("$%$".equalsIgnoreCase(talking)){ disconnect(); } } catch (IOException e) { e.printStackTrace(); } } // try { // dis.close(); // } catch (IOException e) { // e.printStackTrace(); // } } }.start(); } catch (IOException e1) { e1.printStackTrace(); } } public void actionPerformed(ActionEvent e) { String S = e.getActionCommand(); if ("发送".equalsIgnoreCase(S)) { talking = input.getText().trim(); String snicheng = nicheng.getText().trim(); output.append("\n\r" + snicheng + " : " + talking); input.setText(""); try { dos.writeUTF(snicheng); } catch (IOException e1) { e1.printStackTrace(); } send(); } else if ("进入".equalsIgnoreCase(S)) { connect(); receive(); output.append("进入成功\n 服务器:" + fuwuqi.getText() + "\t端口:" + duankou.getText() + "\t昵称:" + nicheng.getText() + "\n"); buttonopen(); } else if ("退出".equalsIgnoreCase(S)) { disconnect(); } } public static void main(String args[]) { new Desktop(); } } ***********服务器******************************** import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; import javax.swing.*; @SuppressWarnings("serial") public class Servicer extends JFrame implements ActionListener { @SuppressWarnings("unused") private class WindowCloser extends WindowAdapter { public void windowClosing(WindowEvent we) { System.exit(0); } } private ServerSocket ss = null; private Socket s; private JPanel p = new JPanel(); private JTextArea output = new JTextArea(); private JTextField input = new JTextField(); private DataOutputStream dos; private DataInputStream dis; private JButton b1 = new JButton("启动"); private JButton b2 = new JButton("退出"); private JButton b3 = new JButton("发送"); private String talking, nicheng; private boolean started = true; private boolean bConnected = false; // UI界面(不需要再修改) Servicer() { p.setLayout(new BorderLayout()); JPanel p1 = new JPanel(); JPanel p2 = new JPanel(); p1.add(b1); b1.addActionListener(this); p1.add(b2); b2.addActionListener(this); b3.addActionListener(this); p2.setLayout(new BorderLayout()); p2.add(input, BorderLayout.CENTER); p2.add(b3, BorderLayout.EAST); p.add(p1, BorderLayout.NORTH); p.add(p2, BorderLayout.SOUTH); p.add(output, BorderLayout.CENTER); b2.setEnabled(false); b1.setEnabled(true); b3.setEnabled(false); input.setEditable(false); output.setEditable(false); this.setTitle("聊天室for服务端"); this.add(p); this.setSize(500, 300); this.setVisible(true); } public void buttonclose() { b1.setEnabled(true); b2.setEnabled(false); b3.setEnabled(false); input.setEditable(false); } public void buttonopen() { b1.setEnabled(false); b2.setEnabled(true); b3.setEnabled(true); input.setEditable(true); } public void disconnect() { started = false; bConnected = false; try { dos.writeUTF("$%$"); dos.close(); dis.close(); s.close(); System.out.println("Servicer dos.close"); ss.close(); System.out.println("Servicer cs.close"); } catch (IOException e) { e.printStackTrace(); } } public void start() { try { ss = new ServerSocket(8888); } catch (IOException e) { e.printStackTrace(); } try { started = true; //while(started){ s = ss.accept(); output.append("新加入,已连接"); buttonopen(); bConnected = true; dos = new DataOutputStream(s.getOutputStream()); dis = new DataInputStream(s.getInputStream()); link(); //} } catch (IOException e1) { e1.printStackTrace(); } } public void send() { talking = input.getText().trim(); try { if(talking == null) { dos.writeUTF(""); } else { dos.writeUTF(talking); } dos.flush(); } catch (IOException e1) { e1.printStackTrace(); } } public void link() { new Thread(){ public void run() { String nicheng = null; try { nicheng = dis.readUTF(); } catch (IOException e1) { output.append("\n\r用户名获取异常"); e1.printStackTrace(); } while (bConnected) { String talking = ""; try { talking = dis.readUTF(); } catch (IOException e) { e.printStackTrace(); } if("$%$".equalsIgnoreCase(talking)){ disconnect(); } output.append("\n\r" + nicheng + " : " + talking); } // try { // dis.close(); // } catch (IOException e) { // e.printStackTrace(); // } } }.start(); } public void actionPerformed(ActionEvent e) { String S = e.getActionCommand(); String takeing = input.getText().toString(); if ("启动".equalsIgnoreCase(S)) { start(); } else if ("退出".equalsIgnoreCase(S)) { disconnect(); output.append("退出成功"); } else if ("发送".equalsIgnoreCase(S)) { send(); output.append("\n\r" + "主机" + " : " + takeing); input.setText(""); } } public static void main(String args[]) { new Servicer(); } }

boost异步通信,async_read_some始终接收不到数据

我写了最简单boost异步通信例子,async_read_some始终接收不到数据。接收数据长度始终0,打印empty。甚至客户端断开连接后,仍打印empty,服务端对连接断开无反应。 boost版本为1_69。客户端代码,发送数据功能。服务端代码,async_read_some接收数据功能,如下: ``` class clients { public: clients(std::string str_address,int nport,int id_val) :m_ep(boost::asio::ip::address::from_string(str_address.c_str()), nport), _id(id_val) { start(); } void run() { m_io.run(); } void start() { boost::shared_ptr<boost::asio::ip::tcp::socket>sock(new boost::asio::ip::tcp::socket(m_io)); sock->async_connect(m_ep,boost::bind(&clients::conn_handler,this,boost::asio::placeholders::error,sock)); } void conn_handler(const boost::system::error_code& ec,boost::shared_ptr<boost::asio::ip::tcp::socket> sock) { if(ec) { std::cout << "id: " << _id << " connect wrong" << std::endl; return; } std::cout << "id: " << _id << " connect right to address:" << sock->remote_endpoint().address() << std::endl; sendtimer_=std::make_shared<boost::asio::deadline_timer>(m_io); sendtimer_->expires_from_now(boost::posix_time::milliseconds(500)); sendtimer_->async_wait(boost::bind(&clients::do_write,this,sock)); } void do_write(boost::shared_ptr<boost::asio::ip::tcp::socket> sock) { char sz_send[512]={0}; sprintf(sz_send,"%d_hello",_id); m_buf.clear(); for(int i=0; i<strlen(sz_send); i++) { m_buf.push_back(sz_send[i]); } sock->async_write_some(boost::asio::buffer(m_buf),boost::bind(&clients::write_handler,this,boost::asio::placeholders::error,sock)); } void write_handler(const boost::system::error_code& ec,boost::shared_ptr<boost::asio::ip::tcp::socket> sock) { if(ec) { std::cout << "id: " << _id <<" connect disconnect" << std::endl; } else { sendtimer_->expires_from_now(boost::posix_time::milliseconds(500)); sendtimer_->async_wait(boost::bind(&clients::do_write,this,sock)); } } private: boost::asio::io_service m_io; boost::asio::ip::tcp::endpoint m_ep; int _id; std::vector<char> m_buf; std::shared_ptr<boost::asio::deadline_timer> sendtimer_; }; int main(int argc, char** argv) { int id_val = 0; if(argc>1) { char* ch_val = argv[1]; id_val = atoi(ch_val); } int nport = TARGET_VALUE_PORT; std::string str_address = TARGET_VALUE_IP; std::cout << "id: " << id_val << " client start" << std::endl; clients cl(str_address, nport, id_val); cl.run(); std::cout << "id: " << id_val << " client end" << std::endl; return 0; } ``` ``` class servers { public: servers(boost::asio::io_service& io_ser, int nport): m_acceptor(io_ser, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), nport)) { accept(); } void accept() { std::cout << "prepare accept" << std::endl; boost::shared_ptr<boost::asio::ip::tcp::socket> sock( new boost::asio::ip::tcp::socket(m_acceptor.get_io_service()) ); m_acceptor.async_accept(*sock, boost::bind(&servers::accept_handler, this, boost::asio::placeholders::error, sock)); } void accept_handler(const boost::system::error_code& ec, boost::shared_ptr<boost::asio::ip::tcp::socket> sock) { if(ec) { return; } std::cout<< sock->remote_endpoint().address() << std::endl; sock->async_read_some(boost::asio::buffer(m_buf), boost::bind(&servers::read_handler, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred, sock)); accept(); } void read_handler(const boost::system::error_code& ec, std::size_t bytes_transferred, boost::shared_ptr<boost::asio::ip::tcp::socket> sock) { if(ec) { std::cout << "error" << std::endl; return; } if(bytes_transferred==0) { std::cout << "empty" << std::endl; } else { std::string tmpstr(m_buf.begin(), m_buf.end()); if(!tmpstr.empty()) { std::cout << "Recv Data" << tmpstr << std::endl; } m_buf.clear(); } sock->async_read_some(boost::asio::buffer(m_buf), boost::bind(&servers::read_handler, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred, sock)); } private: boost::asio::ip::tcp::acceptor m_acceptor; std::vector<char> m_buf; }; int main(int argc, char** argv) { boost::asio::io_service io_service; int nport = LISTEN_VALUE_PORT; servers srv(io_service, nport); io_service.run(); return 0; } ```

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

springboot+jwt实现token登陆权限认证

一 前言 此篇文章的内容也是学习不久,终于到周末有时间码一篇文章分享知识追寻者的粉丝们,学完本篇文章,读者将对token类的登陆认证流程有个全面的了解,可以动态搭建自己的登陆认证过程;对小项目而已是个轻量级的认证机制,符合开发需求;更多精彩原创内容关注公主号知识追寻者,读者的肯定,就是对作者的创作的最大支持; 二 jwt实现登陆认证流程 用户使用账号和面发出post请求 服务器接受到请求后使用私...

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

总结了 150 余个神奇网站,你不来瞅瞅吗?

原博客再更新,可能就没了,之后将持续更新本篇博客。

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

程序员写出这样的代码,能不挨骂吗?

当你换槽填坑时,面对一个新的环境。能够快速熟练,上手实现业务需求是关键。但是,哪些因素会影响你快速上手呢?是原有代码写的不够好?还是注释写的不够好?昨夜...

外包程序员的幸福生活

今天给你们讲述一个外包程序员的幸福生活。男主是Z哥,不是在外包公司上班的那种,是一名自由职业者,接外包项目自己干。接下来讲的都是真人真事。 先给大家介绍一下男主,Z哥,老程序员,是我十多年前的老同事,技术大牛,当过CTO,也创过业。因为我俩都爱好喝酒、踢球,再加上住的距离不算远,所以一直也断断续续的联系着,我对Z哥的状况也有大概了解。 Z哥几年前创业失败,后来他开始干起了外包,利用自己的技术能...

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷

阿里巴巴全球数学竞赛( Alibaba Global Mathematics Competition)由马云发起,由中国科学技术协会、阿里巴巴基金会、阿里巴巴达摩院共同举办。大赛不设报名门槛,全世界爱好数学的人都可参与,不论是否出身数学专业、是否投身数学研究。 2020年阿里巴巴达摩院邀请北京大学、剑桥大学、浙江大学等高校的顶尖数学教师组建了出题组。中科院院士、美国艺术与科学院院士、北京国际数学...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

早上躺尸,晚上干活:硅谷科技公司这么流行迟到?

硅谷科技公司上班时间OPEN早已不是什么新鲜事,早九晚五是常态,但有很多企业由于不打卡,员工们10点、11点才“姗姗来迟”的情况也屡见不鲜。 这种灵活的考勤制度为人羡慕,甚至近年来,国内某些互联网企业也纷纷效仿。不过,硅谷普遍弹性的上班制度是怎么由来的呢?这种“流行性迟到”真的有那么轻松、悠哉吗? 《动态规划专题班》 课程试听内容: 动态规划的解题要领 动态规划三大类 求最值/计数/可行性 常...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

终于懂了TCP和UDP协议区别

终于懂了TCP和UDP协议区别

Python爬虫,高清美图我全都要(彼岸桌面壁纸)

爬取彼岸桌面网站较为简单,用到了requests、lxml、Beautiful Soup4

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

Java岗开发3年,公司临时抽查算法,离职后这几题我记一辈子

前几天我们公司做了一件蠢事,非常非常愚蠢的事情。我原以为从学校出来之后,除了找工作有测试外,不会有任何与考试有关的事儿。 但是,天有不测风云,公司技术总监、人事总监两位大佬突然降临到我们事业线,叫上我老大,给我们组织了一场别开生面的“考试”。 那是一个风和日丽的下午,我翘着二郎腿,左手端着一杯卡布奇诺,右手抓着我的罗技鼠标,滚动着轮轴,穿梭在头条热点之间。 “淡黄的长裙~蓬松的头发...

大胆预测下未来5年的Web开发

在2019年的ReactiveConf 上,《Elm in Action》的作者Richard Feldman对未来5年Web开发的发展做了预测,很有意思,分享给大家。如果你有机会从头...

大牛都会用的IDEA调试技巧!!!

导读 前天面试了一个985高校的实习生,问了他平时用什么开发工具,他想也没想的说IDEA,于是我抛砖引玉的问了一下IDEA的调试用过吧,你说说怎么设置断点...

都前后端分离了,咱就别做页面跳转了!统统 JSON 交互

文章目录1. 无状态登录1.1 什么是有状态1.2 什么是无状态1.3 如何实现无状态1.4 各自优缺点2. 登录交互2.1 前后端分离的数据交互2.2 登录成功2.3 登录失败3. 未认证处理方案4. 注销登录 这是本系列的第四篇,有小伙伴找不到之前文章,松哥给大家列一个索引出来: 挖一个大坑,Spring Security 开搞! 松哥手把手带你入门 Spring Security,别再问密...

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

C 语言编程 — 堆栈与内存管理

目录 文章目录目录前文列表堆、栈内存管理动态分配内存重新调整内存的大小和释放内存 前文列表 《程序编译流程与 GCC 编译器》 《C 语言编程 — 基本语法》 《C 语言编程 — 基本数据类型》 《C 语言编程 — 变量与常量》 《C 语言编程 — 运算符》 《C 语言编程 — 逻辑控制语句》 《C 语言编程 — 函数》 《C 语言编程 — 高级数据类型 — 指针》 《C 语言编程 — 高级数据类...

实时更新:计算机编程语言排行榜—TIOBE世界编程语言排行榜(2020年6月份最新版)

内容导航: 1、TIOBE排行榜 2、总榜(2020年6月份) 3、本月前三名 3.1、C 3.2、Java 3.3、Python 4、学习路线图 5、参考地址 1、TIOBE排行榜 TIOBE排行榜是根据全世界互联网上有经验的程序员、课程和第三方厂商的数量,并使用搜索引擎(如Google、Bing、Yahoo!)以及Wikipedia、Amazon、YouTube统计出排名数据。

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

自从喜欢上了B站这12个UP主,我越来越觉得自己是个废柴了!

不怕告诉你,我自从喜欢上了这12个UP主,哔哩哔哩成为了我手机上最耗电的软件,几乎每天都会看,可是吧,看的越多,我就越觉得自己是个废柴,唉,老天不公啊,不信你看看…… 间接性踌躇满志,持续性混吃等死,都是因为你们……但是,自己的学习力在慢慢变强,这是不容忽视的,推荐给你们! 都说B站是个宝,可是有人不会挖啊,没事,今天咱挖好的送你一箩筐,首先啊,我在B站上最喜欢看这个家伙的视频了,为啥 ,咱撇...

代码注释如此沙雕,会玩还是你们程序员!

某站后端代码被“开源”,同时刷遍全网的,还有代码里的那些神注释。 我们这才知道,原来程序员个个都是段子手;这么多年来,我们也走过了他们的无数套路… 首先,产品经理,是永远永远吐槽不完的!网友的评论也非常扎心,说看这些代码就像在阅读程序员的日记,每一页都写满了对产品经理的恨。 然后,也要发出直击灵魂的质问:你是尊贵的付费大会员吗? 这不禁让人想起之前某音乐app的穷逼Vip,果然,穷逼在哪里都是...

立即提问
相关内容推荐