linux socket send 程序,Linux socket:如何使send()等待recv()

我正在使用TCP协议创建一个简单的客户端 – 服务器应用程序.

我知道默认情况下. recv()将阻塞,直到另一方调用send()到此套接字.

但是有可能send()阻塞自己,直到另一方已经recv()编辑了msg而不是将send()保持到传出队列,然后找到另一侧recv()得到了一大堆由多个发送的消息发送()■

换一种说法.是否有可能让每个send()等待另一方的recv()才能调用另一个send()?

说清楚我的问题.我将在这里发布一个简单的代码:

client.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

int main(int argc, char *argv[])

{

int sockfd = 0;

char sendBuff[1024];

struct sockaddr_in serv_addr;

int i;

if(argc != 2)

{

printf("\n Usage: %s \n",argv[0]);

return 1;

}

if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)

{

printf("\n Error : Could not create socket \n");

return 1;

}

memset(&serv_addr, '0', sizeof(serv_addr));

serv_addr.sin_family = AF_INET;

serv_addr.sin_port = htons(5000);

if(inet_pton(AF_INET, argv[1], &serv_addr.sin_addr)<=0)

{

printf("\n inet_pton error occured\n");

return 1;

}

if( connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0)

{

printf("\n Error : Connect Failed \n");

return 1;

}

do{

memset(sendBuff, '\0', sizeof(sendBuff));

sprintf(sendBuff, "This is line %d", i);

send(sockfd, sendBuff, strlen(sendBuff), 0);

//sleep(1);

}while(++i<100);

return 0;

}

server.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

int main(int argc, char *argv[])

{

int listenfd = 0, connfd = 0;

struct sockaddr_in serv_addr;

char sendBuff[1025];

char recvBuff[100];

int i = 0;

listenfd = socket(AF_INET, SOCK_STREAM, 0);

memset(&serv_addr, '0', sizeof(serv_addr));

memset(sendBuff, '0', sizeof(sendBuff));

serv_addr.sin_family = AF_INET;

serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

serv_addr.sin_port = htons(5000);

bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

listen(listenfd, 10);

connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);

do{

memset(recvBuff, '\0', sizeof(recvBuff));

recv(connfd, recvBuff, sizeof(recvBuff),0);

printf( "%s\n", recvBuff);

}while(++i<100);

return 0;

}

我期望在服务器端的结果是打印:

This is line 0

This is line 1

This is line 2

This is line 3

...

但是,实际结果是这样的:

This is line 0

This is line 1This is line 2This is line3This is line 4

This is line 5This is line 6This is line 7This is line 8This is line 9This is line 10

This is line 11This is line 12...

但是这很容易解释:当客户端发出send()时,它没有等待服务器端的recv()完成,并且由于某种原因,服务器端recv()循环比客户端发送慢().因此,客户端上的几个send()可以堆叠在一起并由服务器作为整体接收. (我的解释是对的吗?)

实际上似乎有一个非常愚蠢和松散的解决方案.只需在循环中的每个send()之后添加一个sleep(1)(就像我注释掉的那样).我知道这将使代码效率非常低,并且如果recv()循环将花费更长的时间来实现一些其他复杂的操作(当程序变大时这显然是不可预测的),这将花费超过1秒.此解决方案失败!

那么是否有更好的方法让双方相互通信以确保由单个recv()接收的单个send()发送的消息?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值