socket编程中的接收数据丢失问题

hello__world_ 2012-06-02 09:53:11
这个是服务器的代码:
#define MAX_BUFLEN 1024*256
main(int ac, char *av[])
{
int sock;
int sock_fd;
int retval,retvals;
char buf[MAX_BUFLEN],buf2[MAX_BUFLEN];
sock = make_server_socket();//这里调用socket();bind();listen()等函数;
while(1)
{
sock_fd = accept( sock, NULL, NULL);
retval = recv( sock_fd, buf, MAX_BUFLEN, 0 );
printf("buf= %s\n ##retval=%d\n",buf,retval);
write(sock_fd,"get the call\n",sizeof("get the call\n")-1);
}
}

这里是客户端:
int main()
{
int sockfd;
int a, b;
char buf[1024];
sockfd = connect_to_server("192.168.1.28",12345);//这里调用socket();connect();等函数,连接服务器。
a = write(sockfd,"#####helloworld\n",sizeof("#####helloworkd\n")-1);
b = write(sockfd,"#####whatisit\n",sizeof("#####whatisit\n")-1);
printf("a= %d b=%d\n",a,b);
return 0;
}
结果是这样。我客户端向服务器发送了两次数据,而且客户端的打印显示两次数据都发送成功了,###但是服务器那端发生了诡异事情,服务器大部分时间是只接受到第一次发送的数据,也就是“####helloworld\n”,然后少部分时间是两句都接收到了,我运行了大概30次,两句都接收到的情况大概只有三四次。。求高手。。求专家。。求大神。。感激不尽
...全文
358 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2012-06-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 2 楼 的回复:
TCP字节流,让老赵教育教育吧。

不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
[/Quote]

终于等来了
赵4老师 2012-06-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
TCP字节流,让老赵教育教育吧。
[/Quote]
不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
blueliuyun 2012-06-04
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
引用 2 楼 的回复:
TCP字节流,让老赵教育教育吧。

不知道有多少前人掉在TCP Socket
send(人多)send(病少)send(财富)
recv(人多病)recv(少财富)
陷阱里面啊!
[/Quote]
"老赵" (这么称呼前辈,请前辈多多包涵!)
你好!
你提到的这个问题,我是否可以 在每次 send 的数据之前添加一个 “数据头” ,在“数据头”中包含了接下来要用 send 发送的数据的长度(包括数据头的长度); 在 recv 接收到数据之后, 比较接收的 “数据头” 中标示的数据长度 和 实际接收到的数据长度 是否相等,如果相等则完成一次正常的接收; 否则丢弃或请求重发。
我的这个思路是否合理呢? 期待前辈指点。 谢谢 O(∩_∩)O~
ljhhh0123 2012-06-04
  • 打赏
  • 举报
回复
抄代码也是一门技术。
在别人的代码基础上修改比闭门造车强太多了。
諾不輕許 2012-06-03
  • 打赏
  • 举报
回复
上面那样只能连一次,或者在accept后面多加一个死循环,用select,poll之类的检测套接字上还有没有数据,没数据时在退出后一层的死循环,
諾不輕許 2012-06-03
  • 打赏
  • 举报
回复
服务器里把accept函数移出while(1)试试
blueliuyun 2012-06-03
  • 打赏
  • 举报
回复
贴上一段代码吧,代码的出处是 http://beej.us/guide/bgipc/output/html/multipage/unixsock.html


/*
** echos.c -- the echo server for echoc.c; demonstrates unix sockets
*/

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>

#define SOCK_PATH "echo_socket"

int main(void)
{
int s, s2, t, len;
struct sockaddr_un local, remote;
char str[100];

if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}

local.sun_family = AF_UNIX;
strcpy(local.sun_path, SOCK_PATH);
unlink(local.sun_path);
len = strlen(local.sun_path) + sizeof(local.sun_family);
if (bind(s, (struct sockaddr *)&local, len) == -1) {
perror("bind");
exit(1);
}

if (listen(s, 5) == -1) {
perror("listen");
exit(1);
}

for(;;) {
int done, n;
printf("Waiting for a connection...\n");
t = sizeof(remote);
if ((s2 = accept(s, (struct sockaddr *)&remote, &t)) == -1) {
perror("accept");
exit(1);
}

printf("Connected.\n");

done = 0;
do {
n = recv(s2, str, 100, 0);
if (n <= 0) {
if (n < 0) perror("recv");
done = 1;
}

if (!done)
if (send(s2, str, n, 0) < 0) {
perror("send");
done = 1;
}
} while (!done);

close(s2);
}

return 0;
}
blueliuyun 2012-06-03
  • 打赏
  • 举报
回复
看过LZ的代码,LZ是想用TCP连接吧。

我感觉你的服务器代码部分,缺少一个针对 接收套接字的循环 ,你自己的代码很大可能是,服务器只打印一次字符串,然后下一次循环时就阻塞在 accept() 那里了。

qq120848369 2012-06-02
  • 打赏
  • 举报
回复
TCP字节流,让老赵教育教育吧。
Wenxy1 2012-06-02
  • 打赏
  • 举报
回复
用tcp socket写,才保证可靠。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧