2 champion lx champion_lx 于 2016.04.17 11:23 提问

关于windows下socket编程的recv函数 1C

Talk is cheap,show me the code.
do{

memset(buf, 0, BUFSIZ);

strLen = recv(reads.fd_array[i], buf, BUFSIZ - 1, 0);

                    if (strLen == 0 || strLen == -1){
                        FD_CLR(reads.fd_array[i], &reads);
                        closesocket(cpyReads.fd_array[i]);
                        printf("closed client:%d \n", cpyReads.fd_array[i]);
                    }
                    else{
                        printf("From %d : %s", cpyReads.fd_array[i], buf);
                        //send(reads.fd_array[i], buf, strLen, 0);
                    }

} while (strLen==BUFSIZ-1);

我设置的BUFSIZ 是10
我在调用recv函数来取客户端发过来的数据时,如果收到的数据长度大于我设置的缓冲大小也就是BUFSIZ 比如发过来的是10个字符 , 那么do while 循环会循环两次,如果我发送过来的正好是9个字符 , 为啥只循环了一次呢。我调试看到 strLen 明明等于BUFSIZ-1 的 , 于是在上面的memset处加的断点,才知道确实是循环了两次, 可是执行到 recv函数的时候 整个循环直接跳出来了,不太明白这里,求大神讲解一下,站等。。。

2个回答

CSDNXIAON
CSDNXIAON   2016.04.17 11:32

windows socket编程函数(一)
SOCKET编程 & send recv API函数。。。。
socket 中的recv()函数
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

webcq
webcq   2016.04.17 19:51

跳到do while语句之后执行吗?如果套接字不阻塞,应该在第二次recv时返回0吧,否则应该在recv时阻塞吧。还有一种可能,就是你这段代码是多线程调用的,在当前线程实际是阻塞到recv了,而转到另一个线程执行do while之后的代码。

champion_lx
champion_lx 恩,是跳到do while 之后执行了,而且第二次recv 没看到返回值就跳了。这个是单线程的,用的是select函数 , IO复用的方式
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
socket编程---send函数&recv函数详解
交流学习。。。
send、recv等socket编程接口的阻塞与非阻塞模式.md
socket编程中经常使用send和recv函数来接收和发送数据。 对于系统来说,不管是发送数据还是接收数据,都不是直接在内存上操作的。 发送数据有发送缓冲区,接收数据有接收缓冲区。对于send来说,send函数调用时,先将将应用程序请求发送的数据拷贝到发送缓存中,而后驱动程序会去读取发送缓冲中的数据,在进行真正的传输。 对于recv来说,recv只是从接收缓冲中读取数据,而接收缓存中的数据来自
socket编程recv函数返回值说明
recv函数 int recv( SOCKET s, char FAR *buf, int len, int flags); 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。该函数的第一个参数指定接收端套接字描述符; 第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据; 第三个参数指明buf的长度; 第四个参数一般置0
socket编程中recv()和read()的使用与区别
recv和read相似,都可用来接收sockfd发送的数据,但recv比read多了一个参数,也就是第四个参数,它可以指定标志来控制如何接收数据。 1、recv() 原型:ssize_t recv(int sockfd, void *buf, size_t nbytes, int flags); 对于SOCK_STREAM套接字来讲,recv接收的数据可以比预期的少,recv的第四个
socket编程中send()和recv()参数解析
1.send 函数int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。该函数的第一个参数指定发送端套接字描述符;第二个参数指明一个存放应用程序要发送数据的缓
socket编程 send() recv() sendto() recvfrom()
socket编程 send() recv() sendto() recvfrom() int socket( int af, int type, int protocol); af: 指定一个协议簇(协议域),常见有AF_INET──指定为IPv4协议,AF_INET6──指定为IPv6,AF_LOCAL──指定为UNIX 协议域等。 它值都是系统预先定义的宏,系统支持哪些协议我们才可以使用,
windows socket编程中send与recv函数的收发数据不一致问题
这几天在使用windows的socket编程去做文件的传输,发现这个windows下的socket编程也真和以前接触过的java和C#的有很多的不同,有异步的模型也有同步的模型,为了简单起见我还是使用了同步阻塞模型,没想到这个阻塞也还不是想象中的阻塞,以前使用send发送完数据后,recv就会把数据都接完,调试了很久,发现recv老是接收的数据比send的要少,上网查了一下,大概明白recv就是只
winsock recv函数使用注意
Winsock int recv( SOCKET s, char FAR *buf, int len, int flags 支持MSG_WAITALL ); 在使用这个函数的时候为了能够一次性接收客户端的封包,我尝试使用了MSG_WAITALL的标志,但是这个标志使用上竟然有点奇怪,网上资料也相对比较少,最后在
Socket中send()函数和recv()函数详解
1、send函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。 客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。 (1)第一个参数指定发送端套接字描述符; (2)第二
recv、send函数windows和linux下超时设置
在socket通讯中,如果不设置超时时间的话,recv和send函数都会一直无限阻塞在那等待接受数据,为了防止出现这种情况,需要设置超时时间,windows下是这样设置超时时间 int recvTimeout = 30 * 1000;   //30s int sendTimeout = 30 * 1000;  //30s  setsockopt(sClient, SOL_SO