tcp协议里服务器如何向客户端发数据

客户端向服务器发送数据没问题,但是服务器却无法向客户端发数据图片

c++

5个回答

你服务器端保存的客户端的套接字是否正确。有没有保存下来

u013709214
紫色密林 不能直接用sendto去指定客户端吗
大约 3 年之前 回复

看不清代码。
客户端有监听吗?

hehexiaoxia
hehexiaoxia 至少客户端要写接收的代码吧,不然服务器发了客户端也接不到啊。
大约 3 年之前 回复
u013709214
紫色密林 客户端也要有监听?不是在服务器端写监听的吗?
大约 3 年之前 回复

如果是Java的可以去我博客看看,有两篇关于tcp和socket的。

客户端和服务器都要写收发

图片上的代码看不清楚,能否把代码打一下?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C#服务端请求客户端数据
我想在客户端安装一个服务后,能够向客户端请求数据,返回数据给服务器,这样用什么协议要好,socket行吗?服务端怎么发起这个请求,麻烦各位大神帮帮忙? 我不清楚的地方,如果用socket,保存客户端连接后,我要请求客户端数据,只能是客户端请求服务端,而我换成服务端请求客户端好像只能是客户端请求后服务端回复。 如果是UDP的话好定义请求和回复问题吗?
tcp协议问题,请大神指导
服务器使用tcp协议给客户端发送了3092字节的数据,我在客户端使用一个3092字节的结构体进行接收,为什么有时候一次性接收的 不到3092字节,也就是需要分两次接收才能接收完整,比如第一次接收2000,第二次再接收1092字节,按照ip分包,MTU=1500,超过1500字节他就会在ip层分包,但是他会在接收端组包,再交付给上一层,所以按道理不会出现这种问题,有哪一位大神能指导一下么?万分感激。。。
C# 一台客户端连接多台服务器端进行数据传输需要注意什么?
一台客户端连接多台服务器端进行数据传输,要求多台服务器在接收到客户端指令后,在同一个时刻将数据上传。 测试中,一台客户端一台服务器的数据传输已经实现。与多台服务器连接我采用的是线程池,但是测试的时候出现一个问题,就是只上来一台服务器上的数据,而其他的服务器的数据没有上来,这个原因是什么?跟端口有关系么?我们采用的协议为Modbus tcp和FTP。
Qt5网络tcp协议,服务器发送文件,客户端接收文件,为什么客户端接收的文件大小是0kb
客户端: #include "client.h" #include "ui_client.h" #include <QDataStream> Client::Client(QWidget *parent) : QMainWindow(parent), ui(new Ui::Client) { ui->setupUi(this); //初始化创建的socket对象 msocket = new QTcpSocket(); recvsize = 0; filesize = 0; //连接服务器 QString ip = "192.168.199.93"; msocket->connectToHost(ip,6789); //连接固定的服务器 //接收服务器发来的数据 connect(msocket,SIGNAL(readyRead()),this,SLOT(read_data())); //当链接服务器成功的时候会发送connected信号,并向服务器发送接收到的文件名和文件大小 //connect(msocket, SIGNAL(connected()),this, SLOT(send_filename_size())); //成功接收一段数据会信号通知 connect(msocket,SIGNAL(bytesRead(qint64)),this, SLOT(send_file_content())); } Client::~Client() { delete ui; } //接收数据槽函数 void Client::read_data() { if(filesize == 0) //先接收文件名和文件大小 { //创建流对象与套接字绑定 QDataStream stream(msocket); QString name; stream.setVersion(QDataStream::Qt_5_4); stream>>filesize>>name; qDebug()<<filesize<<name; //设置进度条最大值 ui->progressBar->setMaximum(filesize); ui->progressBar->setValue(0); file.setFileName(name); int flag = file.open(QIODevice::WriteOnly); } else //接收内容 { if(recvsize < filesize) { qDebug()<<"1"; QByteArray array = msocket->readAll(); file.write(array); recvsize += array.size(); //设置进度条 ui->progressBar->setValue(recvsize); } if(recvsize == filesize) { file.close(); filesize = 0; recvsize = 0; msocket->close(); } } } 服务器: #include "server.h" #include "ui_server.h" #include <QDataStream> //数据流 Server::Server(QWidget *parent) : QMainWindow(parent), ui(new Ui::Server) { ui->setupUi(this); //初始化服务器对象 mserver = new QTcpServer(); //初始化客户端 msocket = new QTcpSocket(); //监听,需要ip地址和端口号 mserver->listen(QHostAddress::Any,6789); //定义固定的端口号 //关联新的客户端链接信号 connect(mserver,SIGNAL(newConnection()),this,SLOT(new_client())); } Server::~Server() { delete ui; } void Server::new_client() //证明有客户端已经连接成功 { qDebug()<<"新客户端链接"; msocket = mserver->nextPendingConnection(); msocket->write("hello"); } void Server::on_pushButton_2_clicked() //浏览文件按钮 { QString filepath = QFileDialog::getOpenFileName(this); ui->filepathEdit->setText(filepath); } void Server::on_pushButton_clicked() //发送按钮 { //先发送文件名和文件大小以及通知 //2.发送文件名, 文件大小 QString filepath = ui->filepathEdit->text(); QFileInfo info(filepath); //a.获取文件名 QString name = info.fileName(); //b.获取文件大小 quint64 size = info.size(); qDebug()<<name<<size; //输出文件名和文件大小 QByteArray array; //定义个数据流绑定array QDataStream stream(&array,QIODevice::WriteOnly); stream.setVersion(QDataStream::Qt_5_4); //把数据通过流形式存入到array中 stream<<size<<name; //打开文件 file.setFileName(filepath); bool flag = file.open(QIODevice::ReadOnly); if(!flag) { qDebug()<<"open fail"; return ; } //把发送字节数清空0 sendsize = 0; //设置进度条的最大值 ui->progressBar->setMaximum(size); //发送文件大小,文件名 msocket->write(array);//当对方收到数据后msocket会发送已经发送了多字节数据的信号 //成功发送一段数据会信号通知 connect(msocket,SIGNAL(bytesWritten(qint64)),this, SLOT(send_file_content())); } void Server::send_file_content() { //发送文件内容 if(file.isOpen()) //文件打开了,发送文件内容 { QByteArray array = file.read(SIZE); msocket->write(array); sendsize += array.size(); ui->progressBar->setValue(sendsize); qDebug()<<sendsize; if(file.atEnd()) { //关闭文件 file.close(); } } }
客户端和服务端通过建立socket通信,协议是tcp/ip
有一个问题咨询:一个客户端和一个服务端通过tcp/ip连接(之间建立socket通信),在不断网的情况下,服务端关闭,客户端报警,重新开启服务器,客户端能够重新连接上服务端,但是如果拔掉网线,客户端就连接不上服务端了,但从服务端发送过来的数据还是可以读到,可是从客户端发送的数据不能到达服务端,这是为什么???
TCP IP协议客户端在全志R16 开发板上的时候丢失数据
1.服务器采用多线程客户端数据处理 void build_server() { int server_fd = 0,client_fd = 0; struct sockaddr_in address; memset(&address,0,sizeof(address)); server_fd = socket(AF_INET,1,0); address.sin_family = AF_INET; address.sin_port = htons(8998); address.sin_addr.s_addr = INADDR_ANY; if(bind(server_fd,(struct sockaddr*)&address,sizeof(address))<0) { perror("service bind error"); exit(1); } if(listen(server_fd,1024) < 0) { perror("service listen error"); exit(1); } #if 1 while(1) { printf("正在链接.......\n"); client_fd = accept(server_fd,NULL,NULL); usleep(10000); if(client_fd < 0) { printf("退出\n"); return; }else{ #endif pthread_t thread; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED); pthread_create(&thread,&attr,speech_request,(void*)client_fd); } } return ; } 线程处理如下: struct post_content { int contType; int contLength; char buff[2048]; }; struct post_content recvData = {0}; while(1) { memset(&recvData,0,sizeof(struct post_content)); retVal = recv(clientFd,&recvData,sizeof(struct post_content),0); ................................ 客户端请求发送 struct post_content 大小的数据 2056字节 ,, 问题: 当客户端请求跑在PC unbuntu 下面时候,服务器接收数据是正常的, 当客户端跑在全志R16 的开发板上的时候,板子上发送 struct post_content 大小的数据 ,服务器 一次只能接收到 1000多或者几百多字节数据,现在的做法是手动将数据拷贝到 struct post_content 大小。不太理解为什么TCP IP 会丢失数据
C# 单客户端 多服务器同时收发数据
需要用C#编写TCP协议的客户端接收两个服务器传过来的文件。使用了两个Socket连接两个服务器,每一个socket都有一个单独的接收线程recmsg,多线程+阻塞模式。 现在的问题是两个服务器有可能会在同一时刻向客户端发送文件,客户端同一IP地址下从不同端口同时接收到了文件。这种情况下是否会出现冲突的情况,客户端无法判断优先从哪个端口接收数据? 如果会有冲突,那么应该采用何种方式解决这种客户端同时接收到文件的情况? 部分代码如下 private void Form1_Load(object sender, EventArgs e) { socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("192.168.2.100"), 7890); socketClient.Connect(ipe); threadClient = new Thread(RecMsg); threadClient.IsBackground = true; threadClient.Start(); Message.AppendText("已经与服务端100建立连接,可以开始通信...\r\n"); socketClient2 = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPEndPoint ipe2 = new IPEndPoint(IPAddress.Parse("192.168.2.110"), 7890); socketClient2.Connect(ipe2); threadClient2 = new Thread(RecMs); threadClient2.IsBackground = true; threadClient2.Start(); Message.AppendText("已经与服务端110建立连接,可以开始通信...\r\n"); }
服务端与安卓客户端实时数据传输该怎么弄啊?!
要做一个示波器,服务端不断给客户端发送数据,客户端就将其实时展示出来。要基于TCP协议的。 要用什么技术啊?Socket?Tomcat?求大神!着急啊!
sql2008数据库隔一段时间客户端连接不上
服务器系统为WIN sever2008的服务器上装了sql2000,sql2008,sql2008R2,客户端连接的数据库为sql2008R2,隔一段时间后客户端就连不进服务器的数据库了,ping服务器是通的。sql2008R2的服务都开启着,服务器协议TCP/ip也开着。找不到原因为什么连不上数据库。求解,谢谢!!!
套接字编程,使用TCP协议编写服务器程序——绑定错误10038
![图片说明](https://img-ask.csdn.net/upload/201604/07/1459993897_818283.png) 不明白为什么会发生这个错误,求大神指点!具体代码如下 ``` #pragma comment(lib,"ws2_32.lib")//第二版本32位的把lib文件添加到项目中windows套接字的动态链接库 #include<stdio.h> #include<stdlib.h> #include<WinSock2.h> void main(void) { WSADATA wsaData; //定义一个data,data用来初始化windows套接字socket(***---这是第一步---***) SOCKET ListeningSocket; //定义一个套接字 SOCKET NewConnection; //定义一个客户端套接字 SOCKADDR_IN ServerAddr; //创建服务端地址 SOCKADDR_IN ClientAddr; //创建客户端地址 int ClientAddrLen; //声明客户端地址长度 int Ret; //检查初始化是否成功,接受了多少个字节 int Port=5150; char DataBuffer[1024]; if((Ret=WSAStartup(MAKEWORD(2,2),&wsaData))!=0) { printf("WSAStartup failed with error %d\n",Ret);//初始化失败返回错误信息 system("pause"); return; } if((ListeningSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)==INVALID_SOCKET)) //使用if判断是否创建成功 { printf("socket failed with error %d\n",WSAGetLastError);//使用WSAGetLastError得到错误信息 WSACleanup();//结束前清理 system("pause"); return; } ServerAddr.sin_family=AF_INET; ServerAddr.sin_port=htons(Port); ServerAddr.sin_addr.S_un.S_addr=htonl(INADDR_ANY); if((bind(ListeningSocket,(SOCKADDR*)&ServerAddr,sizeof(ServerAddr)))==SOCKET_ERROR) { printf("bind failed with error %d\n",WSAGetLastError()); closesocket(ListeningSocket); WSACleanup(); system("pause"); return; } if((listen(ListeningSocket,5))==SOCKET_ERROR) { printf("listen failed with error %d\n",WSAGetLastError()); closesocket(ListeningSocket); WSACleanup(); system("pause"); return; } printf("We are waiting a connection on port %d.\n",Port); printf("Listen(正在监听)...\n"); if((NewConnection=accept(ListeningSocket,(SOCKADDR*)&ClientAddr,&ClientAddrLen))==INVALID_SOCKET) //在此定义一个客户端的套接字,接收后会得到一个客户端的套接字 { printf("ACCEPT FAILED WITH ERROR %d\n",WSAGetLastError()); closesocket(ListeningSocket); WSACleanup(); system("pause"); return; } printf("We successfully got a connectiong from %s:%d\n",inet_ntoa(ClientAddr.sin_addr),ntohs(ClientAddr.sin_port)); if((Ret =recv(NewConnection,DataBuffer,sizeof(DataBuffer),0))==SOCKET_ERROR) { printf("recv failed with error %d\n",WSAGetLastError()); closesocket(NewConnection); WSACleanup(); system("pause"); return; } //此时已成功接收到客户端发送来的数据,将其显示出来 printf("We successfully received %d bytes.\n",Ret); DataBuffer[Ret]='\0';//结尾加上\0表示字符串结束 printf("%s\n",DataBuffer); printf("Ww are now going to close the client connectiong.\n"); closesocket(NewConnection); WSACleanup(); system("pause"); } ```
arm板作为tcp客户端无法连接网络摄像头,报错误代码111
1.问题背景 需要将arm用网线连接网络摄像头对其进行控制。厂商只提供了CGI接口,且由于系统是裁剪过的curl这些也用不了,所以尝试使用tcp协议直接封装成http。 2.问题现象 用tcp工具,pc作为客户端连接摄像头,发送可以直接接收到有效返回。但是arm板与tcp测试工具或者摄像头都连不上,报111 客户端代码如下 ``` static protocol_err_t protocol_CameraCommand(PROTOCOL *this) { unsigned short port = 8000; // 服务器的端口号 char *server_ip = "192.168.13.11"; // 服务器ip地址 int sockfd = socket(AF_INET, SOCK_STREAM, 0);// 创建TCP套接字 if(sockfd < 0) { protocol_SendString(this,"socket failed\n"); return PROTOCOL_ERR_FAIL; } struct sockaddr_in server_addr; //定义服务器信息结构体 bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); inet_pton(AF_INET, server_ip, &server_addr.sin_addr); int err_log = connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)); // 主动连接服务器 if(err_log != 0) { sprintf(this->sendBuffer, "connect error: %s(errno: %d)\n",strerror(errno),errno); protocol_SendString(this, this->sendBuffer); close(sockfd); return PROTOCOL_ERR_FAIL; } char str1[1024] = ""; sprintf(str1, "%s\r\n","GET /cgi-bin/date_cgi?action=get&user=admin&pwd=admin HTTP/1.1"); //服务端接收数据处理文件地址,并带参数 sprintf(str1, "%s%s\r\n",str1,"Accept: text/html, application/xhtml+xml, image/jxr, */*"); sprintf(str1, "%s%s\r\n",str1,"Accept-Language: zh-CN"); sprintf(str1, "%s%s\r\n",str1,"User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"); sprintf(str1, "%s%s\r\n",str1,"Accept-Encoding: gzip, deflate"); sprintf(str1, "%s%s\r\n",str1,"Host: 192.168.13.11"); //服务器地址 sprintf(str1, "%s%s\r\n",str1,"Connection: Keep-Alive"); //sprintf(str1,"%s%s\r\n",str1,"Cookie: JSESSIONID=5386A9443729D7EB0B61E38A9C7CF52F"); sprintf(str1, "%s\r\n",str1); protocol_SendString(this,"----------------------------- HTTP Data ----------------------------------\n"); sprintf(this->sendBuffer,"%s",str1); protocol_SendString(this, this->sendBuffer); sprintf(this->sendBuffer,"--------------------------- Data Len=%d ----------------------------------\n\n",strlen(str1)); protocol_SendString(this, this->sendBuffer); int ret=send(sockfd, str1, strlen(str1), 0); // 向服务器发送信息 if(ret<0) { protocol_SendString(this,"send"); close(sockfd); return PROTOCOL_ERR_FAIL; } char recv_buf[521]=""; recv(sockfd, recv_buf, sizeof(recv_buf), 0); protocol_SendString(this, "------------------------ server retrun data -------------------------------\n"); sprintf(this->sendBuffer,"%s\n\n",recv_buf); protocol_SendString(this, this->sendBuffer); close(sockfd); return PROTOCOL_ERR_NONE; } ```
C# 客户端和服务端连接时出现服务端运行一段时间后切断连接
各位大神,现在遇到一个问题: 我的客户端程序与服务端进行数据通讯,用到的通讯协议为Modbus tcp和FTP, 但现在在运行的过程中出现一个问题,就是我的客户端程序运行一段时间后,服务端直接切断了与我客户端程序的连接(此时我的客户端程序也没有报错,可是我使用了try,catch语句进行报错的),与此同时,我通过输入FTP地址直接登录也不行,提示的错误为与服务器的连接被重置,这个问题是处在我的客户端程序还是服务端?我查了两天的错误,实在不知道错误在哪,还望大神指导。
C# 客户端连接服务器端如果断线重连
我现在设计的是一个客户端,连接了100台硬件,通讯协议采用的是Modbus tcp和FTP。如果中间一台硬件断线了,如何避免程序崩溃(我采用的是线程池)?还有断线后重新连接上后,程序能自动连接上,并上传数据?还望大神能够多多指教,初学很多东西都不懂。
请问按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类型发送吗?希望有高手可以帮我解答一下,最好可以给我推荐一些相关的书籍或者资料,非常感谢!!如果能有个例子的话,就更好了。
Linux-ARM 连接网络摄像头,tcp封装http协议的问题
1.问题背景 有一块裁剪过的ARM板要用网线和网络摄像头直连,厂商只提供了CGI-API,没有其他接口,由于板子资源限制,也没法装http服务和curl。目前考虑用tcp 封装http 进行控制。 尝试过用Wireshark抓过浏览器和摄像头通信的包结构如下 ``` GET /cgi-bin/images_cgi?channel=0&user=admin&pwd=admin HTTP/1.1 Accept: text/html, application/xhtml+xml, image/jxr, */* Accept-Language: zh-CN User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko Accept-Encoding: gzip, deflate Host: 192.168.14.18 DNT: 1 Connection: Keep-Alive ``` 问题: 我把cookie删掉了,其余部分直接同过socket调试工具发给摄像头是有应的 ![图片说明](https://img-ask.csdn.net/upload/201912/11/1576047462_916583.png) 然后我tcp客户端也按照相同的格式send,但是始终没有收到摄像头的回应,是哪边的问题? tcp 客户端代码: ``` static protocol_err_t protocol_CameraCommand(PROTOCOL *this) { unsigned short port = 80; // 服务器的端口号 char *server_ip = "192.168.14.18"; // 服务器ip地址 int sockfd = socket(AF_INET, SOCK_STREAM, 0);// 创建TCP套接字 if(sockfd < 0) { protocol_SendString(this,"socket failed\n"); return PROTOCOL_ERR_FAIL; } struct sockaddr_in server_addr; //定义服务器信息结构体 bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family = AF_INET; server_addr.sin_port = htons(port); inet_pton(AF_INET, server_ip, &server_addr.sin_addr); int err_log = connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)); // 主动连接服务器 if(err_log != 0) { sprintf(this->sendBuffer, "connect error: %s(errno: %d)\n",strerror(errno),errno); protocol_SendString(this, this->sendBuffer); close(sockfd); return PROTOCOL_ERR_FAIL; } char str1[1024] = ""; sprintf(str1, "%s\r\n","GET /cgi-bin/date_cgi?action=get&user=admin&pwd=admin HTTP/1.0"); //服务端接收数据处理文件地址,并带参数 sprintf(str1, "%s%s\r\n",str1,"Accept: text/html, application/xhtml+xml, image/jxr, */*"); sprintf(str1, "%s%s\r\n",str1,"Accept-Language: zh-CN"); sprintf(str1, "%s%s\r\n",str1,"User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"); sprintf(str1, "%s%s\r\n",str1,"Accept-Encoding: gzip, deflate"); sprintf(str1, "%s%s\r\n",str1,"Host: 192.168.14.18"); //服务器地址 sprintf(str1, "%s%s\r\n",str1,"Connection: Keep-Alive"); //sprintf(str1,"%s%s\r\n",str1,"Cookie: JSESSIONID=5386A9443729D7EB0B61E38A9C7CF52F"); sprintf(str1, "%s\r\n",str1); protocol_SendString(this,"----------------------------- HTTP Data ----------------------------------\n\n"); sprintf(this->sendBuffer,"%s",str1); protocol_SendString(this, this->sendBuffer); sprintf(this->sendBuffer,"--------------------------- Data Len=%d ----------------------------------\n\n",strlen(str1)); protocol_SendString(this, this->sendBuffer); int ret=send(sockfd, str1, strlen(str1), 0); // 向服务器发送信息 if(ret<0) { protocol_SendString(this,"send"); close(sockfd); return PROTOCOL_ERR_FAIL; } protocol_SendString(this, "------------------------ server retrun data -------------------------------\n"); char recv_buf[1024*10240]=""; recv(sockfd, recv_buf, sizeof(recv_buf), 0); sprintf(this->sendBuffer,"%s\n\n",recv_buf); protocol_SendString(this, this->sendBuffer); close(sockfd); return PROTOCOL_ERR_NONE; } ```
游戏平台如何添加ftp协议
我现在做了一个游戏平台,用tcp协议来进行个人账户、商店等通信。现在打算用ftp协议进行上传和下载游戏包(1M--200M),我以前没有ftp开发的经验,所以想问如下问题: 1、我是否需要直接搭建一个ftp服务器,把游戏包都放在上边,需要下载时,让客户端直接连接这个服务器,这样是否可行,安全吗?(有的游戏需要收费才能下载的) 2、我直接在平台服务器上自己编写ftp协议,把游戏包放在数据库里边。这样数据库压力会不会很大呀? 3、上边两种方案比较合理呀?或者还有什么更合理的方案? 4、有没有类似的开源框架?
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币)
【求大神】canvas实时显示二进制数据(纯问题,无需写代码)
这样,有一台c++写的频谱仪,需要做一个网页来实时它的显示数据,800个点,100ms刷新一次。提供了两个端口,一个传输数据一个进行控制,进行基于tcp协议的二进制数据传输,做个局域网形式的就行,连上就能显示。 我的想法,显示肯定用canvas,用的echarts,现在接收数据解析数据什么都会,但是这个需要怎么实现呢?看过nodejs和websocket、还有socket.io。 问题一、我还需不需要写服务器,直接写客户端就行了吗?那相关文件放在哪里? 问题二、目前用的nodejs里的net模块,这个网上的例子很少,客户端client.js也是要用cmd 里node client.js来运行吗? 问题三、socket.io那个方法我最中意,但是我模拟数据时用net方式可以连上软件sokit,socket.io连不上,这个究竟能否实现tcp连接? 思路有些混乱,各路大神也可以直接说思路
项目中网络通讯协议的基础问题和学习方法
本人机械专业出身,一直在做叉车设计的工作。随着公司开始发展,无奈被逼向去做自动化设计。哎,真的有太多知识需要恶补。 目前呢,项目中遇到一个大问题,就是通讯这一块 1. 项目中要我们的车队管理系统(一个Webserver)要和客户的Info WMS进行连接。目前有三种解决方法。 a. 客户在他们的WMS服务器上建立一个文本文档,然后让我们的作为客户端去访问它。基于什么协议我不太清楚,网上查了一些据说共享文件的传输协议都是FTP。不知道是不是真的?以前做项目时候碰到过一家供应商抱怨说是读取服务器上的文本文档十分落后,而且数据流量大很容易死机。我想反驳他们,不知道这个理由成不成立?如果是其他协议像HTTP,能不能去读取这个文本文档呢?(我那时候不懂,想一个文本文档最多也就几k为什么流量大?) b. 客户的作为客户端连接我们的服务器。是不是意味着客户需要写一个专门通讯的程序? 我们的服务器仅支持HTTP协议(仔细研究了一下,虽说是http,但是客户端向服务器请求的时候用的是soap协议,传输的是xml的文档,其内容根据服务器反馈的wsdl;然后服务器返回一个soap文档,)。不知道这样理解对不对? c. 方案三就是通过另外一套软件wavelink,协议为telnet。具供应商说这样我们双方都不要写什么程序,通过这个软件就可以作为中间层转化数据。不知道这样现实吗? 另外,问题来了。 1、数据是究竟怎么传输的? 我恶补很多代码,但是开头都是 POST /WebServices/WeatherWebService.asmx HTTP/1.1 Host: www.webxml.com.cn Content-Type: application/soap+xml; charset=utf-8 Content-Length: 200 SOAPAction: "http://WebXml.com.cn/getSupportCity" 我想这个就是所谓的http soap协议去连接服务器吧。那接下来是不是服务器会反馈一个200 OK Content-Type: application/soap+xml; charset=utf-8 Content-Length: 200 客户的服务器才能继续进行传输? 2、数据是怎么传输的? 因为wms一开始是按照我的格式要求“项目+时间+位置+动作+其他”写在一个txt文档中,让我不断的去读,一有更新就读。如果现在用了http soap协议,客户是将这个txt文档发送到我的服务器上我自己把它读出来还是说他会在程序中直接以xml的格式写出来?(各位大侠如果有一段代码让我看一下,能够帮助我加深理解)因为我一直纠结这到底是http把这个文档(无论是XSD还是xml格式)发送到我的服务器上而已呢还是说程序内直接发送这些我要的数据给我。如果是直接发送,我的服务器应该说会储存这些数据并检验(看操作说明上是有Error反馈代码。) 所有我看的代码,都是建立连接后就没有后续了,所以真的很难理解是怎么传输数据的? 一会儿soap负责请求和数据定义,一会儿说这些数据还需要根据wsdl协议的反馈来写,一会儿说要用xsd去定义传输数据的协议。完全晕了。 另外,我自己正在努力学C++,如果以后要再往通讯这一块走,应该在学习些什么?TCP/IP还是说HTTP技术?
Kafka实战(三) - Kafka的自我修养与定位
Apache Kafka是消息引擎系统,也是一个分布式流处理平台(Distributed Streaming Platform) Kafka是LinkedIn公司内部孵化的项目。LinkedIn最开始有强烈的数据强实时处理方面的需求,其内部的诸多子系统要执行多种类型的数据处理与分析,主要包括业务系统和应用程序性能监控,以及用户行为数据处理等。 遇到的主要问题: 数据正确性不足 数据的收集主要...
volatile 与 synchronize 详解
Java支持多个线程同时访问一个对象或者对象的成员变量,由于每个线程可以拥有这个变量的拷贝(虽然对象以及成员变量分配的内存是在共享内存中的,但是每个执行的线程还是可以拥有一份拷贝,这样做的目的是加速程序的执行,这是现代多核处理器的一个显著特性),所以程序在执行过程中,一个线程看到的变量并不一定是最新的。 volatile 关键字volatile可以用来修饰字段(成员变量),就是告知程序任何对该变量...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
有哪些让程序员受益终生的建议
从业五年多,辗转两个大厂,出过书,创过业,从技术小白成长为基层管理,联合几个业内大牛回答下这个问题,希望能帮到大家,记得帮我点赞哦。 敲黑板!!!读了这篇文章,你将知道如何才能进大厂,如何实现财务自由,如何在工作中游刃有余,这篇文章很长,但绝对是精品,记得帮我点赞哦!!!! 一腔肺腑之言,能看进去多少,就看你自己了!!! 目录: 在校生篇: 为什么要尽量进大厂? 如何选择语言及方...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
GitHub开源史上最大规模中文知识图谱
近日,一直致力于知识图谱研究的 OwnThink 平台在 Github 上开源了史上最大规模 1.4 亿中文知识图谱,其中数据是以(实体、属性、值),(实体、关系、实体)混合的形式组织,数据格式采用 csv 格式。 到目前为止,OwnThink 项目开放了对话机器人、知识图谱、语义理解、自然语言处理工具。知识图谱融合了两千五百多万的实体,拥有亿级别的实体属性关系,机器人采用了基于知识图谱的语义感...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
微信支付崩溃了,但是更让马化腾和张小龙崩溃的竟然是……
loonggg读完需要3分钟速读仅需1分钟事件还得还原到昨天晚上,10 月 29 日晚上 20:09-21:14 之间,微信支付发生故障,全国微信支付交易无法正常进行。然...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
YouTube排名第一的励志英文演讲《Dream(梦想)》
Idon’t know what that dream is that you have, I don't care how disappointing it might have been as you've been working toward that dream,but that dream that you’re holding in your mind, that it’s po...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
相关热词 c# 二进制截断字符串 c#实现窗体设计器 c#检测是否为微信 c# plc s1200 c#里氏转换原则 c# 主界面 c# do loop c#存为组套 模板 c# 停掉协程 c# rgb 读取图片
立即提问

相似问题