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函数发送失败即可知道后端断开了,那如果没有数据传输时怎样判断?除了发探测包还有其他好的方法吗?

用qt5 socket写的服务器和客户端可以连接,但客户端不能给服务器传数据

服务器头文件/widget.h ``` #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include<QtNetwork> class QTcpServer; class QTcpSocket; namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); private slots: void readMessage(); //void DataReceived(); private: Ui::Widget *ui; QTcpServer *tcpServer; QTcpSocket *tcpSocket; QString message1; }; #endif // WIDGET_H ``` 服务器主函数/main.cpp ``` #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); } ``` 服务器源文件/widget.cpp ``` #include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); tcpServer=new QTcpServer(this); tcpServer->listen(QHostAddress::Any,6666); connect(tcpServer,SIGNAL(newConnection()),this,SLOT(readMessage())); qDebug()<<"2"; } Widget::~Widget() { delete ui; } void Widget::readMessage() { QTcpSocket *clientConnection=tcpServer->nextPendingConnection(); qDebug()<<"2"; message1=clientConnection->readAll(); qDebug()<<message1; ui->statusLabel->setText(message1); qDebug()<<"1"; } ``` 客户端头文件/widget.h ``` #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include<QtNetwork> class QTcpSocket; namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); private slots: void newConnect(); void on_pushButton_clicked(); private: Ui::Widget *ui; QTcpSocket *tcpSocket; }; #endif // WIDGET_H ``` 客户端主函数/main.cpp ``` #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); Widget w; w.show(); return a.exec(); } ``` 客户端源文件/widget.cpp ``` #include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); tcpSocket=new QTcpSocket(this); } Widget::~Widget() { delete ui; } void Widget::newConnect() { tcpSocket->abort(); tcpSocket->connectToHost("localhost",6666); qDebug()<<"631"; } void Widget::on_pushButton_clicked() { newConnect(); tcpSocket->write("2"); } ``` 通过调试发现,服务器和客户端可以连接,但是就是不能**从客户端向服务器**发送数据,qt入门级别,请指教,谢谢啦

关于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 } ``` ```

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

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

点沙成金:英特尔芯片制造全过程揭密

“亚马逊丛林里的蝴蝶扇动几下翅膀就可能引起两周后美国德州的一次飓风……” 这句人人皆知的话最初用来描述非线性系统中微小参数的变化所引起的系统极大变化。 而在更长的时间尺度内,我们所生活的这个世界就是这样一个异常复杂的非线性系统…… 水泥、穹顶、透视——关于时间与技艺的蝴蝶效应 公元前3000年,古埃及人将尼罗河中挖出的泥浆与纳特龙盐湖中的矿物盐混合,再掺入煅烧石灰石制成的石灰,由此得来了人...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

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

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

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

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

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

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

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

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

外包程序员的幸福生活

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

C++11:一些微小的变化(新的数据类型、template表达式内的空格、nullptr、std::nullptr_t)

本文介绍一些C++的两个新特性,它们虽然微小,但对你的编程十分重要 一、Template表达式内的空格 C++11标准之前建议在“在两个template表达式的闭符之间放一个空格”的要求已经过时了 例如: vector&lt;list&lt;int&gt; &gt;; //C++11之前 vector&lt;list&lt;int&gt;&gt;; //C++11 二、nullptr ...

优雅的替换if-else语句

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

深入剖析Springboot启动原理的底层源码,再也不怕面试官问了!

大家现在应该都对Springboot很熟悉,但是你对他的启动原理了解吗?

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

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

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

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

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

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

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

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

面试:第十六章:Java中级开发(16k)

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

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

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

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

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

【阿里P6面经】二本,curd两年,疯狂复习,拿下阿里offer

二本的读者,在老东家不断学习,最后逆袭

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

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

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

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

《经典算法案例》01-08:如何使用质数设计扫雷(Minesweeper)游戏

我们都玩过Windows操作系统中的经典游戏扫雷(Minesweeper),如果把质数当作一颗雷,那么,表格中红色的数字哪些是雷(质数)?您能找出多少个呢?文中用列表的方式罗列了10000以内的自然数、质数(素数),6的倍数等,方便大家观察质数的分布规律及特性,以便对算法求解有指导意义。另外,判断质数是初学算法,理解算法重要性的一个非常好的案例。

《Oracle Java SE编程自学与面试指南》最佳学习路线图(2020最新版)

正确选择比瞎努力更重要!

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

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

微软为一人收购一公司?破解索尼程序、写黑客小说,看他彪悍的程序人生!...

作者 | 伍杏玲出品 | CSDN(ID:CSDNnews)格子衬衫、常掉发、双肩包、修电脑、加班多……这些似乎成了大众给程序员的固定标签。近几年流行的“跨界风”开始刷新人们对程序员的...

终于,月薪过5万了!

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

我说我懂多线程,面试官立马给我发了offer

不小心拿了几个offer,有点烦

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

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

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

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

2020春招面试了10多家大厂,我把问烂了的数据库事务知识点总结了一下

2020年截止目前,我面试了阿里巴巴、腾讯、美团、拼多多、京东、快手等互联网大厂。我发现数据库事务在面试中出现的次数非常多。

程序员如何与产品经理优雅的干架

早前,平安产险科技一名外包程序员和一名外包产品经理干架的视频几乎在互联网圈都传遍了,因为产品提了一个需求:要求用户App的主题颜色能根据手机壳自动调整。 首先说这个需求对于应用开发工程师来说,确实是有点奇葩,当然并非不能实现。这块涉及图形图像处理,用机器学习和人工智能来提取图像颜色,这是基本图像识别过程,对于采集图像,可以提示对着镜子自拍一张,上传图片,通过大量的训练数据,来识别手机体颜色。当然并...

爬虫(101)爬点重口味的

小弟最近在学校无聊的很哪,浏览网页突然看到一张图片,都快流鼻血。。。然后小弟冥思苦想,得干一点有趣的事情python 爬虫库安装https://s.taobao.com/api?_ks...

在拼多多上班,是一种什么样的体验?我心态崩了呀!

之前有很多读者咨询我:武哥,在拼多多上班是一种什么样的体验?由于一直很忙,没抽出时间来和大家分享。上周末特地花点时间来写了一篇文章,跟大家分享一下拼多多的日常。 1. 倒时差的作息 可能很多小伙伴都听说了,拼多多加班很严重。这怎么说呢?作息上确实和其他公司有点区别,大家知道 996,那么自然也就能理解拼多多的“11 11 6”了。 所以当很多小伙伴早上出门时,他们是这样的: 我们是这样的: 当...

应聘3万的职位,有必要这么刁难我么。。。沙雕。。。

又一次被面试官带到坑里面了。面试官:springmvc用过么?我:用过啊,经常用呢面试官:springmvc中为什么需要用父子容器?我:嗯。。。没听明白你说的什么。面试官:就是contr...

太狠了,疫情期间面试,一个问题砍了我5000!

疫情期间找工作确实有点难度,想拿到满意的薪资,确实要点实力啊!面试官:Spring中的@Value用过么,介绍一下我:@Value可以标注在字段上面,可以将外部配置文件中的数据,比如可以...

自学编程的 6 个致命误区

嗨,小伙伴们大家好,我是沉默王二。本篇文章来和大家聊聊自学编程中的一些误区——这是我在 B 站上看了羊哥的一期视频后有感而发的文章。因为确实有很多读者也曾私信问过我这些方面的问题,很有代表性,所以我就结合自己的亲身体会来谈一谈,希望对小伙伴们有所启发。 01、追求时髦 所谓基础不牢,地动山摇啊。可很多小伙伴压根就没注意过这个问题,市面上出什么新鲜的技术就想去尝试,结果把自己学的乱七八糟,心灰意冷...

立即提问
相关内容推荐