C语言中SOCKET关于send和recv的问题,不懂别乱贴

-----这个server中的循环
while(1)
{
struct sockaddr_in link_addr;
int link_fd;
socklen_t link_addr_len;

link_addr_len = sizeof(link_addr);
memset(&link_addr, 0x00, sizeof(link_addr));
link_fd = accept(server_fd, (struct sockaddr*)&server_addr, &link_addr_len);
send(link_fd, welcome_msg, sizeof(welcome_msg), 0);
memset(buff, 0x00, sizeof(buff));

recv(link_fd, buff, MAX_LEN,0);
printf("%s",buff);

}

-------这是client中的发送
if(recv(link_fd, buff, MAX_LEN,0) <0)
printf("recv fail");
printf("%s",buff);
memset(buff, 0x00, sizeof(buff));
sprintf(buff,"haha,i get your message");
send(link_fd, buff, strlen(buff)+1,0);
close(link_fd);

--------问题来了
在client中得发送send在执行完毕后,服务器什么都收不到,而吧send语句改成一个while循环服务器就可以收到,这个是为什么?

第1个回答  2011-12-16
说实在的这个问题非常简单,不过你习惯太差,你把send和recv的返回值看看不就明白了!
前提是你描述的都是事实。
否则还可能有Socket问题。
如果是linux,strace一下就知道什么问题了。
Windows的也很简单。

前面的明显不正确,send如果是TCP,(UDP 不应该用send),send返回时,消息已经发出了。追问

的确是TCP的,不过我还没整明白是什么问题,经过我的调试,发现是服务器这端的问题
而且检查返回值我也检查了,只是发到网上的时候我把代码精简掉了

追答

说实在的,服务器的那个recv会收到什么跟setsockopt关系很大,和操作系统关系也不小。TCP又没有规定每次必须收到多少东西。尤其是O_NONBLOCK很可能会出现你遇到的问题,这种不完整的程序要让人说问题不是不可能,是成本很高。因为只有很少的从业人员可以不看源代码指出源代码的问题。

本回答被提问者采纳
第2个回答  2011-12-16
原因,Send后,立即关闭了连接。这个时候数据没有发送出去。关闭的时候,服务器recv直接返回0追问

我在send后面插入sleep和while(1)依旧不可以,看来问题不在这里

追答

你这里肯定是有问题,而且这也是会引起这个问题,至于其他的,在上面的程序看不到

第3个回答  2011-12-16
你在send后加个延时试试,可能是你还没发送完毕就关掉了连接的原因追问

我在send后面插入sleep和while(1)依旧不可以,看来问题不在这里

追答

方便的话把你程序发给我调试一下试试吧,不好说哪里问题,你要会用调试,自己追踪一下就好

追问

好吧,我放在单位的服务器上了,等周一联络吧~

Socket send函数和recv函数详解
recv函数用于从TCP连接另一端接收数据。客户端和服务器应用程序都可使用此函数。函数接收套接字描述符、接收数据缓冲区、数据长度及标志参数。执行流程如下:等待s的发送缓冲中的数据被协议完全传输。若在传输中出现网络错误,返回SOCKET_ERROR。若发送缓冲无数据或数据传输完毕,检查套接字接收缓冲区。若无...

socket编程·send和recv
一般不会发生吧,UDP的send是直接发送出去的。recv的返回值>0时, 收到一个完整的数据包 。这个完整性是有IP层保证的。 recv的返回值==0时, 收到空包,这和TCP有很大不同 。 recv的返回值<0时,检查errno,确定socket是否正常。 PS: UDP还有两个函数 sendto 和 recvfrom 。客户端...

C里怎么样用send()和recv() 网络编程高手来看
send(sockSvr,"已经连接上服务器,请选择功能:\\n1. 截取对方屏幕 \\n2. 查找指定文件 \\n3.dos命令",200,0);客户端和服务端,都可以send(),revc,但是send和revc要对应,如果一端revc,但是另一端没有send,就会出现阻塞。连接上后,服务端和客户端可以等同看待。

SOCKET编程里send 和Receive函数的使用
if(INVALID_SOCKET==sClient){ closesocket(sServer);WSACleanup();return -1;\/\/开始接受客户端连接失败 } ZeroMemory(buf,sizeof(buf));retVal=recv(sClient,buf,sizeof(buf));if(SOCKET_ERROR==retVal){ closesocket(sServer);closesocket(sClient);WSACleanup();return -1;\/\/接收数据失败 ...

C++ Socket send recv 循环发送和接收 阻塞与缓冲区
send函数负责将数据写入输出缓冲区,数据发送到目标主机由TCP协议完成。recv函数从输入缓冲区读取数据,数据接收是独立的,recv函数不会判断数据包结束位置。数据的发送和接收不是一次完成,可能存在数据堆积在缓冲区中等待接收的情况。循环发送与接收 确保数据完整传输的关键是正确管理套接字的缓冲区。在循环...

TCP协议之Send和Recv原理及常见问题分析
TCP协议之Send和Recv原理及常见问题分析不论是客户还是服务器应用程序都用send函数向TCP连接的另一端发送数据。客户程序通常使用send函数向服务器发送请求,而服务器则经常使用send函数向客户端发送响应。send函数的

socket编程中write,read和send,recv之间的区别
1、recv和send函数提供了和read和write差不多的功能。但是他们提供了第四个参数来控制读写操作.intrecv(intsockfd,void*buf,intlen,intflags)intsend(intsockfd,void*buf,intlen,intflags)前面的三个参数和read,write相同,第四个参

socket中的receive、send函数
这个不难,bytes = temp.Receive(recvBytes, recvBytes.Length, 0);是说接收长度为recvBytes.Length的数据并将数据放进recvBytes中。bytes表示通过套接字一次接收的数据长度。temp.Send(bs, bs.Length, 0);是说发送长度为bs.Length的bs中的数据。参数0表示指定的传输控制方式,0就表示没有特殊行为。

用socketsend数据成功,但是在recv卡住了,是不是我代码有问题?
客户端调用send函数发送,服务器端recv,是不是send成功了,服务器端会自动向客户端返回信息,若客户端没收到成功接收的信息,是不是会自动重传?不清楚哪些是系统自动完成的。(现在是send了100个1k字节的包,不知道什么时候可以停止recv做别的事)...

send与recv函数详解
recv函数 recv用于接收socket通信中的数据,定义如下:ssize_t recv(int sockfd, void *buf, size_t len, int flags);核心参数包括:sockfd:接收端套接字描述符。buf:存放接收数据的缓冲区。len:指定buf的长度。flags:通常置为0。recv的工作原理包括:等待sockfd接收缓冲区数据发送完毕,网络错误时...

相似回答