C++ socket 客户端recv不到数据 5C

#include
#include /* for socket() and bind() /
#include /
for printf() and fprintf() /
#include /
for sockaddr_in and inet_ntoa() /
#include /
for close() /
#include /
for memset() /
#include /
for atoi() */

#include "Msg.h"
#include "queue"
#include "pack.h"
#include "analysis.h"
///////////////

using namespace std;
#define MYPORT 7000
#define SERVER_IP "127.0.0.1"

#define BUFFER_SIZE 1024
int sock_cli;//client文件描述符

void* recvMess(void* ptr) {
unsigned char recvbuf[BUFFER_SIZE];
while (1){
memset(recvbuf,0x00, sizeof(recvbuf));
cout<<"ready recv"<<endl;
int len = recv(sock_cli,recvbuf, sizeof(recvbuf),0);
if(len == -1){
cout << " client -1 recv error" << endl;
} else if (len == 0){
cout << "clent 0 recv over" << endl;
} else {
cout << len << endl;
}
}

int main()
{

///定义sockfd
//sock_cli = socket(AF_INET,SOCK_STREAM,0);
sock_cli = socket(AF_INET,SOCK_STREAM ,IPPROTO_TCP);
if(sock_cli <0){
    cout << "socket creatation failed!" << endl;
    return -1;
}
///定义sockaddr_in
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));

servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(MYPORT);  ///服务器端口
servaddr.sin_addr.s_addr = inet_addr(SERVER_IP);  ///服务器ip

if (connect(sock_cli, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
{
    perror("connect");
    exit(1);
}

pthread_t recv_szMessage_thread;
int  recv_szMessage_thread_flag = pthread_create(& recv_szMessage_thread,NULL,recvMess,NULL);
if ( recv_szMessage_thread_flag !=0){
    cout<< "client create recv thread failed"<<endl;
}
pthread_detach( recv_szMessage_thread);

while(1){
}
close(sock_cli);
return 0;

}

1

3个回答

0
qq_39588327
qq_39588327 我 memset过啊, 打断点 每次到recv这就沉了
7 个月之前 回复

当我把 服务端关闭时,就会recv的返回值是0

0

这种代码网上多得是,你咋出的错呢,是不是服务器那边就没弄好,导致客户端没收到数据?

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
socket05---recv && send使用,回射客户端
开始复习网络编程这一块,话说有一段时间了,那不多说了,开始吧!这一节,我们学习的是recv和send函数的使用,如果对初始化socket,绑定,连接,write和read等基本操作不太熟悉的话,可以参考前几篇博文,还有网络字节序和本地字节序的转换,需要注意的点也不少,多写才能熟悉。先介绍一下recv和send函数recv函数 提供了和read一样的功能,不同的是它多了一个参数ssize_t rec
python socket.recv() 一直不停的返回空字符串,客户端怎么判断连接被断开?
python socket.recv() 一直不停的返回空字符串,客户端怎么判断连接被断开?
Windows下SOCKET的recv()函数接收的buf无法随时清除问题
昨天遇到一个问题,我使用客户端来接收一个服务器发送的消息进行判断,然后再转发给另一个服务器。在这个过程中需要随时清空已经接收过的服务器数据,但是使用memset只能在recv接收完毕清空,而无法随时清空, 尝试了很多修改代码逻辑的方法来解决问题,但都不行,后来才发现必须要能够随时清空接受到的buf才能解决问题。 因为时间紧迫,没有想到太好的办法,就临时加了一个线程,一个线程用来接收数据,将接收...
C++ Socket编程(二) send与recv 缓冲区与阻塞
socket缓冲区每一个socket在被创建之后,系统都会给它分配两个缓冲区,即输入缓冲区和输出缓冲区。 send函数并不是直接将数据传输到网络中,而是负责将数据写入输出缓冲区,数据从输出缓冲区发送到目标主机是由TCP协议完成的。数据写入到输出缓冲区之后,send函数就可以返回了,数据是否发送出去,是否发送成功,何时到达目标主机,都不由它负责了,而是由协议负责。recv函数也是一样的,它并不是直
socket, recv函数返回值说明
1.创建socket int udp_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);  //IPPROTO_UDP表示UDP协议 int tcp_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);  //IPPROTO_TCP表示TCP协议 2.recv接收数据 recv函数
socket编程中send recv阻塞和非阻塞详解
int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。   该函数的第一个参数指定发送端套接字描述符;   第二个参数指明一个存放应用程序要发送数据
C++ Socket send recv 循环发送和接收 阻塞与缓冲区
套接字的概念及分类 在网络中,要全局的标识一个参与通信的进程,需要三元组:协议,IP地址以及端口号。要描述两个应用进程之间的端到端的通信关联需要五元组:协议,信源主机IP,信源应用进程端口,信宿主机IP,信宿应用进程端口。为了实现两个应用进程的通信连接,提出了套接字的概念。套接字可以理解为通信连接的一端,将两个套接字连接在一起,可以实现不同进程之间的通信。 针对不同的通信需求,TCP/IP中...
Linux网络编程--recv函数返回值详解
recv函数 int recv( SOCKET s, char FAR *buf, int len, int flags); 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。 该函数的第一个参数指定接收端套接字描述符;  第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;  第三个参数指明buf的长度; 第四个参数一般置0。 这里只描述同步S
linux网络编程:设置非阻塞socket收发数据
    非阻塞式I/O包括非阻塞输入操作,非阻塞输出操作,非阻塞接收外来连接,非阻塞发起外出连接。包括的函数有:read, readv, recv, recvfrom, recvmsg, write, writev, send, sendto, sendmsg, accept。    将socket 设置为非阻塞模式有三总方法:    (1)创建socket的时候,指定socket是异步的,在ty...
socket编程---send函数&recv函数详解
交流学习。。。
Linux下使用select处理socket数据
IO口复用   以前写的服务端都是阻塞+多线程模型 socket—–>bind——>listen——>循环accept——>客户端连接——>创建进程或者线程接受数据。显然当有大量长连接时,会创建大量的进程或者线程消耗大量系统资源。   IO口复用简单的说就是一个线程中处理多个文件描述符连接。设置好我们关注的文件描述符后。系统会循环查询文件描述符是否可读、可写、或者有异常,当查询到有一个满足时就
linux下 Socket send函数和recv函数详解
1 #include 2 ssize_t recv(int sockfd, void *buff, size_t nbytes, int flags); 3 ssize_t send(int sockfd, const void *buff, size_t nbytes, int flags); recv 和send的前3个参数等同于read和write。 flags参数值为0或
TCP协议下的recv函数
recv函数 函数原型:int recv( SOCKET s, char *buf, int len, int flags) 功能:不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。 参数一:指定接收端套接字描述符; 参数二:指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据; 参数三:指明buf的长度; 参数四 :一般置为0。 同步Socket
socket 请求接收完整的一个http响应(设置recv 接收超时选项SO_RCVTIMEO)
在前面的系列网络编程文章中,我们都是使用socket 自己实现客户端和服务器端来互相发数据测试,现在尝试使用socket 客户端发 送http 请求给某个网站,然后接收网站的响应数据。http 协议参考 这里。 代码如下:  C++ Code  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
socket recv()函数返回0的一种情况
假设使用Socket基于TCP通信协议进行C/S通信编程,客服端已经成功与服务端建立tcp连接,并且可以正常进行收发数据。 当一段时间后,服务端的程序如果调用closesocket(sClient);WSACleanup();函数关闭socket,  那么客户端的recv()将会返回0; 如果服务端没有调用closesocket(sClient);而只调用WSACleanup()
Linux下Socket网络编程send和recv使用注意事项
send函数和recv函数使用注意事项。
socket编程 recv()返回值处理
 一般在经典的socket教程中,调用send()和recv()时都会判断一下返回值,如果返回值是-1(或者SOCKET_ERROR),那么就进行错误处理(一般是打印出错信息,关闭socket,退出)。在我的一个项目中我因为嫌麻烦就想当然没有判断send和recv的返回值,结果遇到了点小麻烦。简单地说明一下问题:服务器端支持多线程,每个线程用while(1)循环地接收客户端的请求并加以
tcp + 阻塞 + 多線程 => 如何停止Recv()
http://topic.csdn.net/t/20051117/01/4398756.htmlTCP的阻塞模式,服務器程序 主線程 => 界面 線程2 => Accept() 線程3 => Recv() 線程2在Accept了一個Client的連接後返回一個TCP Socket,我把它放到線程3來接收資料。 問題是在Recv()在沒有資料到來的時候會一直等待,我想在收到界面命令的時候令到它停止等待。 請各位給個正確的思路!=========================设置socket超时间隔,比如10
[笔记]socket recv()函数返回0的一种情况
假设使用Socket基于TCP通信协议进行C/S通信编程,客服端已经成功与服务端建立tcp连接,并且可以正常进行收发数据。 当一段时间后,服务端的程序如果调用closesocket(sClient);WSACleanup();函数关闭socket,  那么客户端的recv()将会返回0; 如果服务端没有调用closesocket(sClient);而只调用WSACleanup();或直接关闭
关于socket中recv的返回值
最近在做一个利用socket下载图片的小程序。基本思路就是建立socket以后自己组包然后发送过去,然后recv接收里面的数据里面就包含了图片数据信息。 一开始自己在写的时候,一直会遇到问题。关键代码如下: char* WriteBuffer = (char *)malloc(1024 * 1024 * 2); //创建足够大的Buffer
再次深入理解TCP网络编程中的send和recv
本篇我们用一个测试机上的阻塞socket实例来说明主题。文章中所有图都是在测试系统上现截取的。 需要理解的3个概念 1. TCP socket的buffer 每个TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区,TCP的全双工的工作模式以及TCP的流量(拥塞)控制便是依赖于这两个独立的buffer以及buffer的填充状态。接收缓冲区把数据缓存入内核,应用进程一直没
Socket通信recv()与send()的超时
在send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,而设置收发超时控制: 在Linux下需要注意的是时间的控制结构是struct timeval而并不是某一整型数,以下是来自于网上一篇文章中的摘录,它是这样写的: int nNetTimeout=1000;//1秒,//设置发送超时 setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(cha...
recv函数说明返回值
客户端的程序连接上服务器后recv函数阻塞接受,有时会返回0,说明接收超时服务器主动断开了连接,需要重新connect服务器,但重新connect时会报“Transport endpoint is already connected”!!!返回0时正确处理方法是什么呢,大虾指教啊!!!!! 现象:说明服务器主动断开了客户端的连接 客户端应该调用close关闭,然后再连接 原因:
socket编程recv函数返回值说明
recv函数 int recv( SOCKET s, char FAR *buf, int len, int flags); 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。该函数的第一个参数指定接收端套接字描述符; 第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据; 第三个参数指明buf的长度; 第四个参数一般置0
【win网络编程】socket中的recv阻塞和select的用法
转载请注明出处:作者 kikilizhm 在编写ftp客户端程序时,在联通后使用recv函数进行接收欢迎信息时,需要申请内存进行接收数据保存,一次读取成功,但是由于一个随机的ftp服务端在说,欢迎信息的大小是不知道的,所以在尝试使用死循环,在阅读recv的说明时讲到返回值即是接收到的字节数,那么返回0的时候就代表结束了,实践发现recv是个阻塞函数,在连接不断开的情况下,会一直处于阻塞状
socket recv阻塞与非阻塞error总结
socket recv阻塞与非阻塞error总结 recv是socket编程中最常用的函数之一,在阻塞状态的recv有时候会返回不同的值,而对于错误值也有相应的错误码,分别对应不同的状态,下面是我针对常见的几种网络状态的简单总结。       首先阻塞接收的recv有时候会返回0,这仅在对端已经关闭TCP连接时才会发生。       而当拔掉设备网线的时候,recv并不会发生变化
socket编程中recv()和read()的使用与区别
recv和read相似,都可用来接收sockfd发送的数据,但recv比read多了一个参数,也就是第四个参数,它可以指定标志来控制如何接收数据。 1、recv() 原型:ssize_t recv(int sockfd, void *buf, size_t nbytes, int flags); 返回值:返回数据的字节长度;若无可用数据或对等方已经按序结束,返回0;若出错,返回-1.(APU...
[Linux]socket阻塞模式下recv()返回11(EAGAIN )的原因
linux socket 阻塞模式下recv()返回11(EAGAIN )的可能原因:   1,设置了接收超时为非0。 参考至:http://stackoverflow.com/questions/735249/blocking-socket-returns-eagain   2,网络质量差,例如:wifi环境下的网络信号强度太弱 ...
socket tcp使用recv接收数据时,返回errno错误代码88
原因:就是recv函数的第一个参数不是可用的,也就是第一个参数不是建立连接时返回的文件描述符. 解决方法:xxx
Socket的消息阻塞和非阻塞send/recv
原文:https://blog.csdn.net/shy_hc/article/details/69950334 先理一下阻塞和非阻塞的概念: 阻塞就是让当前调用线程一直处于停止等待当中,挂起的状态,线程函数会被卡住。 非阻塞则是不管运行结果如何,都会继续往下执行(往往都要处理很多返回结果),线程函数里一般都是一个循环,不停的轮询。 再理一下发送接收函数: send/sendto函数...
python socket UDP客户端与服务端简单尝试
今天学了一会linux,然后根据《自顶向下》写了UDP连接的代码,用自己的阿里云试了一下,发现了一些问题 1、阿里云的端口不都是开放的,要自己添加安全组,其中地址用0.0.0.0/0代表对所有人开放。 2、之前也考虑过用本机地址(127.0.0.1)作为服务器地址(即serverName),但对pycharm能否同时运行两个代码有所怀疑,同时想试一下自己的阿里云,就没用本机地址,一直在那捣鼓l...
socket编程中recv的错误使用
在昨天的测试中,终于发现了APICollector上传样本至Executor时样本错误的问题。问题原因在对socket中recv函数的理解错误。 之前的做法是:在发送端APICollector首先发送样本的信息至Executor,包括样本名称、大小等,然后将样本分成一块一块传送,每块2048字节,在Executor端收到样本信息后,计算数据块的数目N,然后recv这么多次数,每次都保存到缓冲区D
TCP通信,recv接收数据需要注意的地方?
        关于TCP通信中,recv函数接收数据大小的问题,之前一直觉得,只要是客户端与服务器一发一收的模式,那么recv接收的数据大小一定是函数中指定的数据大小。这次写了客户端与服务器通信的程序,在这上面栽了一个大跟斗。        程序功能如下:通过客户端与服务器的通信,实现文件的传输,客户端每次发送1k的数据,服务器每次接收1k大小数据并将数据存储到文件中,就这样一发一收的循环发送接...
Linux下的Socket编程实例(阻塞和非阻塞)
Linux下基于C/C++的Socket的阻塞和异步编程实例
Windows socket通信出现接收数据时出现recv返回大于0,但缓冲区为大小为0的问题
服务端在ubuntu服务器下,客户端在windows下,采用socket进行通信,在客户端接收数据时,出现了诡异的情况,recv返回值大于0,但缓冲区大小为0,代码如下:char buff[10]; int res=recv(ClientSocket, buff, 10, 0); cout << res << endl;//返回8,表示有接收到数据 cout << strlen(buff) << e
recv出现乱码后——对recv函数的一点思考和要注意的问题
recv函数如果最后一个参数设为0,如果网络质量不是太好的话,send函数发送的数据不能保证一次性到达,可能一开始只有几个字节,其他的数据到达得较晚。这样、使用recv( )就会读取开始到达的那几个字节,返回。而如果buffer在使用之前又没有被清空就会出现乱码问题。
Socket、send/recv的循环发送和接收、缓冲区、阻塞
这篇文章略作删减后转过来了。主要有以下几点值得自己注意的: (1)刚开头对套接字的理解。 (2)缓冲区的理解。 其他部分有时间重新整理。 套接字的概念及分类        在网络中,要全局的标识一个参与通信的进程,需要三元组:协议,IP地址以及端口号。要描述两个应用进程之间的端到端的通信关联需要五元组:协议,信源主机IP,信源应用进程端口,信宿主机IP,信宿应用进程端口。为了实现两个应用...
socket为send和recv设置超时时间
linux和windows下用setsockopt设置SO_SNDTIMEO,SO_RCVTIMEO的参数的一点区别   UDP的socket在某些情况:如对方关闭时,本地可能sendto不出去数据,然后recvfrom就会被阻塞,这时就需要设置 这两个参数的值提高程序质量。 linux:     struct timeval timeout={3,0};//3s  
Recv 返回10054的原因及解决
开发中遇到问题,Recv 出错,返回10054用sniffer 抓包分析,正常交易以FIN 4次握手结束,该交易服务器以返回RST 结束。查找资料,为什么返回RST。有一种原因是接收缓冲区中还有数据,此时调用closesocket,就会返回RST,而不是正常的FIN四次握手结束。看一下程序,发送时确实多发了几个字节。服务器根据定长报文格式只取了前面的内容,调用closeso
socket循环接收问题
import socket server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM) server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True) server_socket.bind(('',8080)) server_socket.listen(...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 java学习socket java学习的客户端