C++socket数据接收处理问题

1.能够点了按钮之后能够一直接收发送过来的单行数据
2.能把接收的数据处理好了之后存到另外定义的数组或list中去
3.那个线程应该如何定义程序才能执行
 
SOCKET sHost;
  WSADATA wsd;
  SOCKET sServer;
  SOCKET sClient;
  SOCKADDR_IN addrServ;
  void CMyDlg::OnRev()
  {
  #define BUF_SZIE 64
  #pragma comment(lib, "ws2_32.lib")
  char buf[BUF_SZIE];
  int retVal;
  if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
  {
  printf("WSAStartup failed!\n");
  }
  sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

  addrServ.sin_family = AF_INET;
  addrServ.sin_port = htons(3000);
  addrServ.sin_addr.s_addr = INADDR_ANY;

  retVal = bind(sServer, (LPSOCKADDR)&addrServ, sizeof(SOCKADDR_IN));
  retVal = listen(sServer, 10);

  sockaddr_in addrClient;
  int addrClientlen = sizeof(addrClient);
  sClient = accept(sServer,(sockaddr FAR*)&addrClient, &addrClientlen);

  ZeroMemory(buf, BUF_SZIE);
  
  while(true)
  {
  retVal = recv(sClient, buf, BUF_SZIE, 0);
  if (SOCKET_ERROR == retVal)
  {
  printf("send failed!\n");
  }
  else
  {
  ......
  }
  }
  
  closesocket(sClient);
  WSACleanup();
  }

求大神指点一二

  • List item
c++
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c++socket客户端数据接收问题

本人刚接触这个东西,水平较低,在测试上位机客户端是否可以接受数据时,出现些问题,下位机发送的数据是ff,上位机接收的情况如图,会出现乱码,还有就是数据显示的很慢,最重要的是还需要不断抽拔与WiFi模块RX接口相连的线才能有数据显示,不知道是什么原因,程序是在网上找的socket客户端的程序,请大神们帮看一下,这个问题折磨我很久了,万分感谢。![图片说明](https://img-ask.csdn.net/upload/201608/25/1472136704_602387.png)

linux c语言 socket编程 recv每次收到一样的数据

#include <stdlib.h> #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #include <arpa/inet.h> #include <sys/types.h> #include <unistd.h> #include <netdb.h> int main() { int so=socket(AF_INET,SOCK_STREAM,0),r; sockaddr_in addr; hostent *hp; hp=gethostbyname("www.csdn.net"); addr.sin_addr.s_addr=*((unsigned long*)hp->h_addr); addr.sin_family=AF_INET; addr.sin_port=htons(80); connect(so,(sockaddr*)&addr,sizeof(sockaddr)); char message[200]="GET / HTTP/1.0\r\nHost:www.csdn.net\r\n\r\n"; send(so,message,strlen(message)+1,0); char buf[1024]={0}; while(recv(so,buf,1024,MSG_PEEK)){ puts(buf); memset(buf,0,1024); } } 就这样一直收不完,请问为什么 谢谢

C/C++ socket tcp 发送和接收数据问题

客户端和服务器之间发送的一个数据正常,但当发送第二个数据后便出现了问题。求大神帮忙看一哈: 代码如下: client端: #include <WINSOCK2.H> #include <STDIO.H> #include <iostream> using namespace std; #pragma comment(lib,"ws2_32.lib") int main(int argc, char* argv[]) { WORD sockVersion = MAKEWORD(2,2); WSADATA data; if(WSAStartup(sockVersion, &data) != 0) { return 0; } SOCKET sclient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(sclient == INVALID_SOCKET) { printf("invalid socket !"); return 0; } sockaddr_in serAddr; serAddr.sin_family = AF_INET; serAddr.sin_port = htons(1000); serAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); /**************************************** int WSA_return; WSADATA WSAData; WSA_return=WSAStartup(0x0101,&WSAData); hostent *host_entry;// 结构指针 char host_name[256] ="manage.dgjgw.cn"; if(WSA_return==0) { host_entry=gethostbyname(host_name);// 即要解析的域名或主机名 printf("%s\n", host_name); if(host_entry!=0) { printf("解析ip地址: "); printf("%s",inet_ntoa(*((struct in_addr*)host_entry->h_addr))); } } serAddr.sin_addr.S_un.S_addr = inet_addr((char*)inet_ntoa(*((struct in_addr*)host_entry->h_addr))); ****************************************/ //接收缓存区 int nRecvBuf=32*1024;//设置为32K setsockopt(sclient,SOL_SOCKET,SO_RCVBUF,(const char*)&nRecvBuf,sizeof(int)); //发送缓冲区 int nSendBuf=32*1024;//设置为32K setsockopt(sclient,SOL_SOCKET,SO_SNDBUF,(const char*)&nSendBuf,sizeof(int)); printf("连接中》》》》》》》》》\n"); //连接1 if (connect(sclient, (sockaddr *)&serAddr, sizeof(serAddr)) == SOCKET_ERROR) { printf("connect error !\n"); closesocket(sclient); return 0; } else { printf(" connect success !\n"); } //连接2 while (true) { char sendData[10] ={0x05,0x01,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33}; char sendData1[2] ={0x05,0x03}; cout<<"请输入指令"<<endl; int a=0; cin>>a; switch(a) { case 1: printf("发送注册消息\n"); send(sclient, sendData, strlen(sendData), 0); break; case 2: printf("发送心跳消息\n"); send(sclient, sendData1, strlen(sendData1), 0); break; default : cout<<"输入错误"<<endl; break; } char recData[2]; memset(recData,0,2); int ret=0; ret = recv(sclient, recData, 2, 0); if(ret > 0) { printf("信息发送成功,回执如下\n"); for(int i=0;i<=ret;i++) { printf("%x",recData[i]); } printf("\n"); } else { printf("信息发送失败,关闭客户端\n"); break; } memset(recData,0,2); closesocket(sclient); } system("pause"); closesocket(sclient); WSACleanup(); return 0; } sever端: //#include "stdafx.h" #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.lib") int main(int argc, char* argv[]) { //初始化WSA WORD sockVersion = MAKEWORD(2,2); WSADATA wsaData; if(WSAStartup(sockVersion, &wsaData)!=0) { return 0; } //创建套接字 SOCKET slisten = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(slisten == INVALID_SOCKET) { printf("socket error !"); return 0; } //绑定IP和端口 sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_port = htons(1000); sin.sin_addr.S_un.S_addr = INADDR_ANY; if(bind(slisten, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR) { printf("bind error !"); } //开始监听 if(listen(slisten, 5) == SOCKET_ERROR) { printf("listen error !"); return 0; } //循环接收数据 SOCKET sClient; sockaddr_in remoteAddr; int nAddrlen = sizeof(remoteAddr); char revData[255]; while (true) { printf("等待连接...\n"); sClient = accept(slisten, (SOCKADDR *)&remoteAddr, &nAddrlen); if(sClient == INVALID_SOCKET) { printf("accept error !"); continue; } printf("接受到一个连接:%s \r\n", inet_ntoa(remoteAddr.sin_addr)); //接收数据 char revData[10]; memset(revData,0,10); int ret= recv(sClient, revData, 10, 0); if(ret > 0) { printf("消息接收成功:\n"); for(int i=0;i<ret;i++) { printf("%x",revData[i]); } printf("\n"); } else { printf("消息接收失败:\n"); } while(revData[0]==0x05&&revData[1]==0x01&&revData[2]==0x33&&revData[3]==0x33&&revData[4]==0x33 &&revData[5]==0x33&&revData[6]==0x33&&revData[7]==0x33&&revData[8]==0x33&&revData[9]==0x33) { printf("注册消息接收成功:\n"); for(int i=0;i<ret;i++) { printf("%x",revData[i]); } printf("\n"); char sendData1[2]; sendData1[0]=0x05; sendData1[1]=0x02; send(sClient, sendData1, 2, 0); break; } while(revData[0]==0x05&&revData[1]==0x03) { printf("心跳消息接收成功:\n"); for(int i=0;i<2;i++) { printf("%x",revData[i]); } printf("\n"); char sendData[2]; sendData[0]=0x05; sendData[1]=0x04; send(sClient, sendData, 2, 0); break; } } closesocket(sClient); closesocket(slisten); WSACleanup(); return 0; }

Linux C语言, 如何获取socket接收缓冲区中当前数据的大小

由于程序中的一个任务处理较耗时,需要采样socket的接收缓冲区的大小 来决定是否跳出当前任务去读取socket中的数据

JAVA使用socket发送数据,服务端接收到的数据总是不一致,不明白哪里错了,请大神指点!

客户端: package test; import java.io.ByteArrayOutputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.security.PublicKey; public class SocketClient { public static byte[] varout = "987654321hijklmn".getBytes() ; public static byte[] varout1 = {'1','2','3','4','5','6','7','8','9'} ; public static byte[] varout2 = {'a','b','c','d','e','f','g'} ; public static void main(String[] args) { Socket socket = null; try { socket = new Socket("127.0.0.1", 8000); socket.setSoTimeout(100000); OutputStream out1 = socket.getOutputStream(); out1.write(varout); out1.write(varout1); out1.write(varout2); out1.flush(); out1.close(); } catch (Exception e){ e.printStackTrace(); } finally { try{ socket.close(); } catch (Exception e){ e.printStackTrace(); } } } } 服务端: package test; import java.io.InputStream; import java.io.InputStreamReader; import java.net.Socket; import java.net.ServerSocket; public class SocketServer { public static void main(String[] args) { try { ServerSocket serverSocket2 = new ServerSocket(8000); while(true){ Socket s2 = serverSocket2.accept(); InputStream in = s2.getInputStream(); s2.setSoTimeout(10000); //使用InputStream.read(var1)接收数据 byte[] var1 = new byte[10000]; while(in.read(var1) !=-1){ System.out.println(in.read(var1)); System.out.println(new String(var1)); } System.out.println("结束:"+new String(var1)); } } catch (Exception e){ e.printStackTrace(); } } } 服务端接收的结果: ![图片说明](https://img-ask.csdn.net/upload/202002/21/1582283115_195272.jpg)

C# socket networkstream 接收数据

最近在做c/s,客户端用C#的Socket进行通信。接收数据开单独的接收线程使用networkstream进行接收 接收的方法大体上跟网上流传的一样 do { int readSize = mNetworkstream.Read(bytes, 0, 1024); if (readSize > 0) { //do sth } }while(mNetworkstream.DataAvailable) 这样接收局内网或者单机没问题,但是放到外网测试网络不稳定就接收不全。 搜集很多资料,也试过在发送Socket包之前加个包大小,然后在while中增加判断是否读到包的大小,可是一样接不全,中间好像掺杂了一些没用的数据? 我一个包很容易超过byte[10240],而且要整个包接收完才能处理数据。 请问C# Socket使用networkstream怎样才能接收完全呢? ps:也有听说过异步networkstream.beginread接收。鉴于网上一大抄,各种人贴各种代码片段根本就没用。有些有用但只能接收一次。。。 如果有beginread相关代码也希望大牛们贴出来参考一下,不要贴代码片段。。。 谢谢了~

java socket如何接收C客户端发过来的结构体数据?

C做客户端向java服务器通过socket发送结构体数据,传送的是约定好的数字,但是服务端通过InputStream接收数据,然后放到byte数组中,然后再转为string类型的,现在出现乱码?这是怎么回事呢?直接将byte数组中的数据输出发现里面出现负数,约定的数据都是正的,这是怎么回事呢?是转码的问题还是接收的问题呢?请问如何解决呢?麻烦知道的帮助小弟一下。多谢

往socket发送大量数据,接收方无法读取到完整数据

大家有没有遇到一种情况,客户端往服务器的socket发送了一个很大的数据(3万+byte),在服务器那边read socket的时候没有读到所有的数据,服务器用while去读但是都无法读到客户端发过来的所有数据,读取socket fd的代码如图 ![图片说明](https://img-ask.csdn.net/upload/201504/26/1430034961_507939.png)

Java socket 接收数据包解析问题

我想实现的效果是,第一次接收4个字节,然后判断是否为包头,如果是包头就进行下一步,但是在限制字节,byte[] tmpHead = new byte[4]还有判断包头的时候总出错。初学者,基础不扎实,请大佬赐教。 ``` DataInputStream is =new DataInputStream(socket.getInputStream());//实例化 byte[] tmpHead = new byte[4];//接收包头 is.read(tmpHead);//将拿到的值给tmpHead if(is.read(tmpHead) != 0){ toastMsg("收到了"); }else { toastMsg("没有"); } if ((tmpHead[0] == 0x7E) && (tmpHead[1] == 0x81) && (tmpHead[2] == 0x18) && (tmpHead[3] == 0xE7)) {//判断包头 toastMsg("头验证"); byte[] tmpRest = new byte[44];//接收后续数据 is.read(tmpRest);//将拿到的值给tmpRest byte[] Head = new byte[tmpHead.length + tmpRest.length];//拼接完整包头 System.arraycopy(tmpHead, 0, Head, 0, tmpHead.length);//合并数组 System.arraycopy(tmpRest, 0, Head, tmpHead.length, tmpRest.length);//合并数组 struct.InfoHead mInfoHead = new struct.InfoHead();//JavaStruct 对象实例化 JavaStruct.unpack(mInfoHead, Head);//unpack解包 byte[] Data = new byte[mInfoHead.dataLen];//拿到Struct包中datalen,获取下段字节长度 is.read(Data);//将拿到的值给Data byte[] Tail = new byte[8];//包尾长度8字节 is.read(Tail);//将获取的数据给Tail struct.Tail mTail = new struct.Tail();//实例化Tail JavaStruct.unpack(mTail, Tail);//解包 if (mTail.packTail == 0x8F9009F8) {//判断包尾是否正确 System.out.print(mInfoHead.packHead); System.out.print(mTail.packTail); } } else { toastMsg("数据错误"); } } catch (Exception e) { e.printStackTrace(); } } }).start(); ```

WINDOWS C SOCKET编程 recv()接收不到数据?

我的代码逻辑(C语言实现断点续传的demo)大概是 > 服务器将文件分片,每次向客户端只发送一个分片,只有等客户端返回应答才继续发送接下来的分片 现在我遇到的问题是 > 客户端发送的应答,能发送到套接字的输出缓冲区,可是,服务器这边却recv()不到这个应答 我想不到是什么原因,help me 代码 ``` //服务器 //保存上次下载标识 int id; //从tfp指向的文件即Temp.txt读取内容,默认为0,即从第一个片开始 id = fgetc(tfp); int idsize = sizeof(id); //需要一个接收客户端应答的缓冲区 char buffer[BUF_SIZE] = { 0 }; char *bp = buffer; printf("Server will send files to the client\n\n\n\n"); int recvLen = 0,sendLen=0; for ( i = 0; i < PIECE; i++) { //记录当前下载到哪一个片,保存到Temp.txt fputc(i, tfp); printf("the %d of for circle\n", i); //上次下载到哪里,这一次便从那里开始 if (sli[i].grade == id) { //每次发送一个分片 printf("\tserver will send the %d piece of the file\n",i+1); if ((sendLen = send(sock, dp[i], tsize, 0)) < 0) { printf("\tsend a mess to client had failed, and the successful bytes is:%d\n", sendLen); } else { printf("\tsend a mess to client was succeeded, and the successful bytes is:%d\n", sendLen); } /* *服务器每发送一个分片,必须根据客户端的应答进行判断 *1、客户端应答已收到(用字符'f'表示)——继续发送剩下的分片,并且显示传输进度 *2、客户端应答未收到(用字符'n'表示)——保存当前下载标识,结束传输 */ //recv()的作用是阻塞,因为要接收客户端的应答 printf("\t\twait to receive respond from client\n"); if ((recvLen = recv(sock, buffer, nCount, 0)) > 0) { printf("\tthe num to recv respond from client is %d,and the nCount is %d\n", i + 1, recvLen); } else { printf("receive respond failed! return:%d\n",recvLen); } //应答超时设置为6s,表示经过了6s以后,若客户端还没有应答,就不再等待该应答 //Sleep(6000); if (*bp=='f') { //若客户端已收到应答 //表示已发送完毕一个分片,下载标识+1,并且打印传输进度 printf("Server gets the respond from client\n"); printf("\tthe rate of transported procession now is:%d%%\n", i * 100 / PIECE); if (i % 10 == 0) printf("\n"); id++; } else if(*bp=='n') { //若客户端收不到应答 //也就是当前分片也发送失败,即当前下载标识不需要自增1——记录当前下载标识 printf("Server misses the respond from client\n"); fputc(i, tfp); break; } else { printf("nothing\n"); } if (id == PIECE) printf("\n传输完成!\n"); printf("\n"); } } ``` 客户端代码 ``` //客户端 /* *接收缓冲区是连续接受数据的 * 每次接收一个片就返回应答 * 同时写进文件(buffer->rfp) */ char buffer[BUF_SIZE] = { 0 }; //客户端用指向字符常量的指针来表示应答 char idNarr[2] = "n"; char idFarr[2] = "f"; const char *ip = idNarr; //该应答标识的实际长度 int len = sizeof(ip) / sizeof(const char *); //实际接收字节 int rLen = 0, i,nCount,fwLen; printf("\n\n\n\n"); for (i = 0; i < PIECE; i++) { printf("the %d of for circle\n",i); rLen = recv(clntSock, buffer, BUF_SIZE, 0); buffer[rLen] = '\0'; //检验是否从套接字的输入缓冲区接收到数据 printf("receive from server is %s,the length is %d\n",buffer,rLen); printf("ip point to the string is:%s\n",ip); //接收到数据就把应答标识标志为f ip =idFarr; printf("ip point to the string is:%s\n",ip); //发送应答标识,并检查是否发送成功 if ((nCount= send(clntSock, ip, len, 0))<0) { printf("send a mess to server had failed, and the successful bytes is:%d", nCount); } else { printf("send a mess to server was succeeded, and the successful bytes is:%d\n", nCount); } ip = idNarr; //将接收到的数据写入本地文件,并检查是否写入成功 if((fwLen = fwrite(buffer, 1, rLen, fp)) > 0) { printf("\tto write something into file of %d,and the nCount is %d\n", i + 1, rLen); } else { printf("fwrite failed!\n"); } } ```

java socket 接收报文重复

我本地是client端做了一个java socket连接。 但是有大部分服务器给我返回的数据是2段重复的数据是什么意思。 例如 正常返回ABCD 但是服务器返回的是ABCDABCD 服务器端开发说是我本地没有是长连接不是短连接,但是我本地每次请求以后都close啊。

如何把socket通讯接收到的数据放在缓存里,然后用另一个线程读取缓存来进行数据库的写入操作

先贴上nio通讯代码 ![图片说明](https://img-ask.csdn.net/upload/201904/30/1556596574_246874.jpg) ![图片说明](https://img-ask.csdn.net/upload/201904/30/1556596627_364570.jpg) 在 ![图片说明](https://img-ask.csdn.net/upload/201904/30/1556596702_350963.jpg) 这获取到通讯数据后,我想放在缓存里,然后另一个线程就负责读取缓存的数据进行数据库插入操作。在网上查过关于ehcache和redis之类的缓存框架,也考虑过是否可以用一个静态变量替代缓存,想问问各位大佬哪种实现起来比较简单并且靠谱并提供一个设计思路。万分感谢。!!!

linux c socket编程 1、recv接收不完整 2、有些网站不能打开

小白刚接触socket编程,很多没搞清的地方。 我用如下代码 ``` #include <stdlib.h> #include <stdio.h> #include <sys/socket.h> #include <netinet/in.h> #include <string.h> #include <arpa/inet.h> #include <sys/types.h> #include <unistd.h> #include <netdb.h> int main() { int so=socket(AF_INET,SOCK_STREAM,0),r; sockaddr_in addr; hostent *hp; hp=gethostbyname("www.csdn.net"); addr.sin_addr.s_addr=*((unsigned long*)hp->h_addr); addr.sin_family=AF_INET; addr.sin_port=htons(80); connect(so,(sockaddr*)&addr,sizeof(sockaddr)); char message[200]="GET / HTTP/1.0\r\nHost:www.csdn.net\r\n\r\n"; send(so,message,strlen(message)+1,0); char buf[20000]={0}; r=recv(so,buf,20000,MSG_PEEK); printf("r %d\n%s",r,buf); } ``` 1、看见recv返回的只有1400,所以buf没有把完整的网页源代码记录下来,只有一部分,请问为什么 2、如果换一个网站,比如www.stateair.net,会出现404错误,但浏览器就可以打开,请问为什么 谢谢

C语言 socket 编写简单服务端客户端通信问题

大家好,感谢你的回复。 我用c 写了一个socket通信的小程序,写好了服务端和客户端,可遇到个问题,就是每次启动客户端只能发送第一条消息,之后服务端就不能再收到消息了。 Talk is cheak , show me the code. 服务端代码: ```#include<stdio.h> #include<stdlib.h> #include<WinSock2.h> #pragma comment(lib,"ws2_32.lib") int main(){ WSADATA wsd; SOCKET sockServer; SOCKADDR_IN serveraddr;// 服务端套接字 该结构中包含了要结合的地址和端口号 SOCKET sockClient; SOCKADDR_IN clientaddr; WSAStartup(MAKEWORD(2,2),&wsd);//初始化网络接口 sockServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//创建服务器socket if (sockServer != -1 && sockServer != INVALID_SOCKET){ printf("Socket has been created :%d", sockServer); } else{ printf("Socket create failed."); exit(0); } serveraddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); serveraddr.sin_family = AF_INET; serveraddr.sin_port = htons(6000);//绑定端口6000 int bindInfo = bind(sockServer, (SOCKADDR*)&serveraddr, sizeof(SOCKADDR)); char recvBuf[100]; int len = sizeof(SOCKADDR); listen(sockServer, 5);//5为等待连接数 while (1){ sockClient = accept(sockServer, (SOCKADDR*)&clientaddr, &len); //接收客户端数据 recv(sockClient, recvBuf, strlen(recvBuf)+1, MSG_PEEK); printf("to me:%s\n",recvBuf); memset(recvBuf, 0, 100); } closesocket(sockClient); system("pause"); return 0; } ``` 客户端代码: ``` #include<winsock2.h> #include<stdio.h> #pragma comment(lib, "ws2_32.lib") void main() { WSADATA wsaData; SOCKET sockClient;//客户端Socket SOCKADDR_IN addrServer;//服务端地址 WSAStartup(MAKEWORD(2, 2), &wsaData); char message[20] = "HelloSocket!"; //定义要连接的服务端地址 addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//目标IP(127.0.0.1是回送地址) addrServer.sin_family = AF_INET; addrServer.sin_port = htons(6000);//连接端口6000 //新建客户端socket sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); int s = 0; s = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR)); while (1){ //发送数据 int a = send(sockClient, message, strlen(message) + 1, 0); printf("to server:"); scanf("%s", message); } //关闭socket closesocket(sockClient); WSACleanup(); } ``` 求懂的高手来解答一下。 谢谢了!

win7 raw socket 发送接收udp有时成功有时失败

在win7系统,使用raw socket分别编写发送和接收udp的程序。一开始可以成功,后来莫名其妙就接收不到。然后试过一次相同的代码可以接收成功,但过几个小时之后有接收不了。 以下是做的一些测试:(源地址和目的地址都是127.0.0.1) ①使用raw socket发送,wireshark可以捕获到,且数据、端口正确。但是raw socket编写的接收端和java编写的接收端接收不到 ②使用java的发送端发送,raw socket接收端可以接收 据测试应该是发送端问题,可是之前成功过,同一份代码却无端失败。所以猜测会不会是系统或其他的问题。

服务器socket接收并显示16进制的数据

发送指令A1 58 01 02 05 01 01 02 02 01 03 86 客户端会恢复消息,用网络调试助手显示是A1 58 01 02 05 01 01 02 02 01 00 03 请问应该怎么写?

linux socket 接收问题

send完后接收时 用recv返回值判断接收到了54个字节,与TCP调试助手显示的一样,但是从接收buf里去读数据却没有,打印buf也是空的, ret=send(sockfd,(char*)&send_buf,7+num_len,0); if(ret<0){printf("CODE:7 send Maintain tel error!\n");return(-1); } ret=recv(sockfd,rcebuf,128,0); if(ret<0){printf("CODE:6 request TEL data error!\n");return(-1);} printf("tel_len:%d\n",ret); //可以打印出54 说明接收到数据了 printf("rcebuf:%s\n",rcebuf); //这里打印为空 fd=open("/config/a.txt",O_RDWR); write(fd,rcebuf,128); 用TCP调试助手接收也正确, ![图片说明](https://img-ask.csdn.net/upload/201702/26/1488052094_779202.png)

C# socket如何清空接收缓存呢

从发送端接过来的数据为包头+数据包 我通过socket.recive(),接收指定长度包头,并解析内容,如果符合判断,我再继续接收数据包里面的内容,如果不符合,请问我要如何把接收缓存里的数据内容清除掉,因为数据量大,所以我不可能全部Revice。也不能断开连接。

[新手]关于socket.io接收tcp服务器数据后转发给客户端的问题【一句话就能解决?】

如标题,接收到了tcp服务器的数据后,想转发给客户端。但是socket.io文档似乎没有这种方法。直接上代码。 服务器部分: **var express=require('express'); var app=express(); var fs =require('fs'); var net=require('net'); var http=require('http').createServer(app); var io=require('socket.io').listen(http); //nodeServer需要的变量 var nodeServer = new net.Socket(); var ExBuffer = require('./ExBuffer'); var len = 4027; var offset=4; var exBuffer = new ExBuffer().uint32Head().littleEndian(); var sbuf = new Buffer(4); //存储客户端的连接实例 var aSocket={}; app.use(express.static('public')); app.get('/',function(req,res){ res.sendfile(__dirname+'/index.html'); }); //连接到C服务器 nodeServer.connect(3102, '127.0.0.1', function() { console.log('CONNECTED TO: 127.0.0.1:3102' ); // 建立连接后立即向服务器发送数据,服务器将收到这些数据 nodeServer.write('your socket has connected'); }); var server = http.listen(8888, '127.0.0.1',function () { var host = server.address().address var port = server.address().port console.log("welcome to http://%s:%s", host, port) }); // 同客户端建立连接 io.sockets.on('connection', function (socketIO) { aSocket=socketIO; // 从客户端接收数据,然后发送至Tomcat socketIO.emit("test","your websocket has connected"); socketIO.on('fromWebClient', function (webClientData) { }); //客户端断开连接 socketIO.on('disconnect', function () { console.log('DISCONNECTED FROM CLIENT'); }); }); // 从C服务器接收数据 nodeServer.on('data', function (data) { if(data.readUInt8(0)==170){ sbuf.writeUInt32LE(len,0);//写入包长 exBuffer.put(sbuf); exBuffer.put(data); } else{ exBuffer.put(data); } console.log('nodeServer'+data.length); }); //当nodeServer收到完整的数据包时 exBuffer.on('data', function(buffer) { console.log('>> nodeServer receive data.length:'+buffer.length); //console.log(buffer); //console.log(buffer.readInt32LE(826)); var useData=byteArrayUntil.getUseJson(buffer,offset); console.log(aSocket); aSocket.emit['pushToWebClient',useData.hz]; }); // 为nodeServer添加“data”事件处理函数 // data是服务器发回的数据 // 为客户端添加“close”事件处理函数 nodeServer.on('close', function() { console.log('Connection closed'); }); //构造一个遍历函数,分别返回array或者json var byteArrayUntil=new function(){ this.getUseData=function(data,offset){ var arr=[]; for(var i=0;i<=799;i++){ arr.push(data.readInt32LE(826+i*offset)); } return arr; } this.getUseJson=function(data,offset){ var arr=[]; for(var i=0;i<=500;i++){ arr.push(data.readInt32LE(826+i*offset)); } return {'hz':arr}; } }();** 客户端部分:(很多无用的就贴关键的了,其实这个可以暂时无视) <script> var socket = io.connect(); socket.on("test", function (data) { console.log(data); }); socket.on('pushToWebClient', function (data) { console.log(data); }); 现在问题就是服务器的这一部分: exBuffer.on('data', function(buffer) { console.log('>> nodeServer receive data.length:'+buffer.length); //console.log(buffer); //console.log(buffer.readInt32LE(826)); var useData=byteArrayUntil.getUseJson(buffer,offset); console.log(aSocket); aSocket.emit['pushToWebClient',useData.hz]; }); 我把数据接收到了,最后一句转发给客户端不会。ps:不用管对应id问题,我只需要简单实现转发数据即可。 参考过这个文档(如果知道上面怎么处理可以不用继续看了): var http = require('http'), 2 net = require('net'), 3 app = http.createServer().listen('8181'), 4 io = require('socket.io').listen(app), 5 nodeServer = new net.Socket(); 6 // 连接到Tomcat 7 nodeServer.connect(8007, '127.0.0.1', function() { 8 console.log('CONNECTED'); 9 }); 10 // 存储客户端的WebSocket连接实例 11 var aSocket = {}; 12 // 同客户端建立连接 13 io.sockets.on('connection', function (socketIO) { 14 // 从客户端接收数据,然后发送至Tomcat 15 socketIO.on('fromWebClient', function (webClientData) { 16 // 存储至映射表 17 aSocket[socketIO.id] = socketIO; 18 // 发送至Tomcat的数据中添加socket_id 19 webClientData['sid'] = socketIO.id; 20 // 发送String类型的数据至Tomcat 21 nodeServer.write(JSON.stringify(webClientData)); 22 }); 23 // 客户端断开连接 24 socketIO.on('disconnect', function () { 25 console.log('DISCONNECTED FROM CLIENT'); 26 }); 27 }); 28 29 // 从Tomcat接收数据 30 nodeServer.on('data', function (data) { 31 var jsonData = JSON.parse(data.toString()); 32 // 分发数据至客户端 33 for (var i in jsonData.list) { 34 aSocket[jsonData.list[i]['sid']].emit('pushToWebClient', jsonData.list[i].data); 35 } 36 }); 有这么一句 aSocket[jsonData.list[i]['sid']].emit('pushToWebClient', jsonData.list[i].data); 虽然它实现的是通过id来实现建立一一对应连接,但是它还是独立出来使用了(查了一些资料都是在一起用的), 到底该怎么实现呢?ps:不用管对应id问题,我只需要简单实现转发数据即可。 求大神帮助。

java socket服务器接收不到客户端发来的消息

package socket; public class MySeverSocket { public static void main(String[] args) { new ServerListener().start(); } } **************************************** package socket; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import javax.swing.JOptionPane; public class ServerListener extends Thread { public void run (){ try { ServerSocket serverSocket = new ServerSocket(55555); while (true){ Socket socket = serverSocket.accept(); JOptionPane.showMessageDialog(null, "有客户端连接到了55555端口"); ChatSocket cs = new ChatSocket(socket); cs.start(); ChatManager.getChatManager().add(cs); } } catch (IOException e) { e.printStackTrace(); } } } *************************************** package socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.Socket; public class ChatSocket extends Thread { Socket socket; public ChatSocket(Socket s) { this.socket = s; } public void out(String out) { try { socket.getOutputStream().write(out.getBytes("UTF-8")); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8")); String line = null; while ((line = br.readLine()) != null) { ChatManager.getChatManager().publich(this, line); } br.close(); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } ******************************************************** package socket; import java.util.Vector; public class ChatManager { private ChatManager() {} private static final ChatManager cm = new ChatManager(); public static ChatManager getChatManager() { return cm; } Vector<ChatSocket> vector = new Vector<ChatSocket>(); public void add(ChatSocket cs) { vector.add(cs); } public void publich(ChatSocket cs,String out) { for(int i = 0;i<vector.size();i++){ ChatSocket csChatSocket = vector.get(i); if (!cs.equals(csChatSocket)) { csChatSocket.out(out); } } } } 安卓客户端连接与发送消息方法 public void connect(){ final AsyncTask<Void,String,Void> read = new AsyncTask<Void, String, Void>() { String iptext = ip.getText().toString(); @Override protected Void doInBackground(Void... params) { try { socket = new Socket(iptext,55555); writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); publishProgress("@success"); } catch (IOException e) { Toast.makeText(MainActivity.this,"连接失败",Toast.LENGTH_SHORT).show(); e.printStackTrace(); } try { String line; while ((line = reader.readLine()) != null){ publishProgress(line); } } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onProgressUpdate(String... values) { if (values[0].equals("@success")){ Toast.makeText(MainActivity.this,"连接成功",Toast.LENGTH_SHORT).show(); } text.append("别人说"+values[0]+"\n"); super.onProgressUpdate(values); } }; read.execute(); } public void send(){ try { // text.append("我说:"+editText.getText().toString()+"\n"); writer.write(editText.getText().toString()+"\n"); writer.flush(); editText.setText(""); } catch (IOException e) { e.printStackTrace(); } }

YOLOv3目标检测实战:训练自己的数据集

YOLOv3目标检测实战:训练自己的数据集

150讲轻松搞定Python网络爬虫

150讲轻松搞定Python网络爬虫

实用主义学Python(小白也容易上手的Python实用案例)

实用主义学Python(小白也容易上手的Python实用案例)

我说我不会算法,阿里把我挂了。

不说了,字节跳动也反手把我挂了。

立方体线框模型透视投影 (计算机图形学实验)

计算机图形学实验 立方体线框模型透视投影 的可执行文件,亲测可运行,若需报告可以联系我,期待和各位交流

2019 AI开发者大会

2019 AI开发者大会

组成原理课程设计(实现机器数的真值还原等功能)

实现机器数的真值还原(定点小数)、定点小数的单符号位补码加减运算、定点小数的补码乘法运算和浮点数的加减运算。

C/C++跨平台研发从基础到高阶实战系列套餐

一 专题从基础的C语言核心到c++ 和stl完成基础强化; 二 再到数据结构,设计模式完成专业计算机技能强化; 三 通过跨平台网络编程,linux编程,qt界面编程,mfc编程,windows编程,c++与lua联合编程来完成应用强化 四 最后通过基于ffmpeg的音视频播放器,直播推流,屏幕录像,

MFC一站式终极全套课程包

该套餐共包含从C小白到C++到MFC的全部课程,整套学下来绝对成为一名C++大牛!!!

软件测试2小时入门

软件测试2小时入门

三个项目玩转深度学习(附1G源码)

三个项目玩转深度学习(附1G源码)

计算机图形学-球的光照模型课程设计

计算机图形学-球的光照模型,有代码完美运行,有课程设计书

Linux常用命令大全(非常全!!!)

Linux常用命令大全(非常全!!!) 最近都在和Linux打交道,感觉还不错。我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因,比较短小但却功能强大。我将我了解到的命令列举一下,仅供大家参考: 系统信息 arch 显示机器的处理器架构 uname -m 显示机器的处理器架构 uname -r 显示正在使用的内核版本 d...

因为看了这些书,我大二就拿了华为Offer

四年了,四年,你知道大学这四年我怎么过的么?

深度学习原理+项目实战+算法详解+主流框架(套餐)

深度学习系列课程从深度学习基础知识点开始讲解一步步进入神经网络的世界再到卷积和递归神经网络,详解各大经典网络架构。实战部分选择当下最火爆深度学习框架PyTorch与Tensorflow/Keras,全程实战演示框架核心使用与建模方法。项目实战部分选择计算机视觉与自然语言处理领域经典项目,从零开始详解算法原理,debug模式逐行代码解读。适合准备就业和转行的同学们加入学习! 建议按照下列课程顺序来进行学习 (1)掌握深度学习必备经典网络架构 (2)深度框架实战方法 (3)计算机视觉与自然语言处理项目实战。(按照课程排列顺序即可)

fakeLocation13.5.1.zip

fakeLocation13.5.1 虚拟定位 ios13.5.1的最新驱动下载,iPhone/iPad免越狱虚拟定位工具Location-cleaned驱动已更新

UnityLicence

UnityLicence

Python可以这样学(第一季:Python内功修炼)

Python可以这样学(第一季:Python内功修炼)

Python+OpenCV计算机视觉

Python+OpenCV计算机视觉

土豆浏览器

土豆浏览器可以用来看各种搞笑、电影、电视剧视频

【数据结构与算法综合实验】欢乐连连看(C++ & MFC)案例

这是武汉理工大学计算机学院数据结构与算法综合实验课程的第三次项目:欢乐连连看(C++ & MFC)迭代开发代码。运行环境:VS2017。已经实现功能:开始游戏、消子、判断胜负、提示、重排、计时、帮助。

php+mysql学生成绩管理系统

学生成绩管理系统,分三个模块:学生,教师和管理员。 管理员模块:负责学生、老师信息的增删改;发布课程信息的增删改,以便让学生选课;审核老师提交的学生成绩并且打印成绩存档;按照课号查询每个课号的学生成绩

多功能数字钟.zip

利用数字电子计数知识设计并制作的数字电子钟(含multisim仿真),该数字钟具有显示星期、24小时制时间、闹铃、整点报时、时间校准功能

推荐24个国外黄色网站欣赏

在中国清朝,明黄色的衣服只有皇子才有资格穿,慢慢的黄色在中国就成了高贵的颜色。在人们的色彩印象中,黄色也表现为暂停。所以当你的网页设计采用黄色的时候,会让人们在你的网页前停留。 黄色,就像橙色和红色,黄色也是一个暖色。它有大自然、阳光、春天的涵义,而且通常被认为是一个快乐和有希望的色彩。黄色是所有色相中最能发光的颜色,给人轻快,透明,辉煌,充满希望的色彩印象。 黄色是一个高可见的色...

u-boot-2015.07.tar.bz2

uboot-2015-07最新代码,喜欢的朋友请拿去

一学即懂的计算机视觉(第一季)

一学即懂的计算机视觉(第一季)

学生成绩管理系统(PHP + MYSQL)

做的是数据库课程设计,使用的php + MySQL,本来是黄金搭配也就没啥说的,推荐使用wamp服务器,里面有详细的使用说明,带有界面的啊!呵呵 不行的话,可以给我留言!

Windows版YOLOv4目标检测实战:训练自己的数据集

Windows版YOLOv4目标检测实战:训练自己的数据集

C++语言基础视频教程

C++语言基础视频教程

玩转Python-Python3基础入门

玩转Python-Python3基础入门

相关热词 c# 开发接口 c# 中方法上面的限制 c# java 时间戳 c#单元测试入门 c# 数组转化成文本 c#实体类主外键关系设置 c# 子函数 局部 c#窗口位置设置 c# list 查询 c# 事件 执行顺序
立即提问
相关内容推荐