客户端断开socket之后,服务器端才能收到数据?

weige2501 2012-05-04 07:10:11
android手机为服务器端,PC端软件为客户端
PC客户端通过socket发送数据给服务器端,服务器端一直接收不到数据,只有当PC客户端断开socket连接之后,
手机服务器端才接收到数据,请问是怎么回事?怎么处理,谢谢
代码如下:
android 手机端linux(server)

int make_server_socket()
{
int sockfd = socket(PF_INET, SOCK_STREAM, 0);
struct sockaddr_in my_addr;
memset(&my_addr, 0, sizeof(my_addr));
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(LISTENPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;

if(sockfd>0)
{
int on = 1;
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
if(bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))==0)
{
if(listen(sockfd, 0)==0)
{
// No error
}
else
{
close(sockfd);
sockfd = -3;
}
}
else
{
close(sockfd);
sockfd = -2;
}
}

return sockfd;
}

int accept_socket(int sockfd)
{
// Block until connections
struct sockaddr_in peer_addr;
unsigned int sin_size = sizeof(peer_addr);
int new_fd = accept(sockfd, (struct sockaddr *)&peer_addr, &sin_size);
return new_fd;
}

int recv_socket(int sockfd, void* buffer, int size)
{
int received = 0;

while (buffer && received < size)
{
int result = recv(sockfd, buffer + received, size - received, MSG_NOSIGNAL);
if (result > 0)
{
received += result;
}
else
{
received = result;
break;
}
}
return received;
}
.............
while (1)
{
listenfd = make_server_socket();
memset(receive_buffer,0,sizeof(receive_buffer));
if (listenfd > 0)
{
while (1)
{

tcpipfd = accept_socket(listenfd);

if (tcpipfd > 0)
{
len=recv_socket(tcpipfd, recmsg, BUF_LEN_1024);
}
else
{
break;
}
sleep(1);
}
close_socket(listenfd);
}
sleep(2);
}

............


java客户端:

byte[] bs = new byte[] { (byte) 127, (byte) 0, 0, 1 };
InetAddress addr = InetAddress.getByAddress(bs);
pcsocket =new Socket(addr,port);

sender=new BufferedOutputStream(pcsocket.getOutputStream(),20);
receiver=new BufferedInputStream(pcsocket.getInputStream(),20);

sender.write(data.getBytes(),0,data.length());
sender.write('\n');
sender.flush();
...全文
712 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
weige2501 2012-05-04
  • 打赏
  • 举报
回复
我的服务器端一次就是只能为一个客户端服务,另外,能否说明一下该怎么修改比较好,因为对socket不是特别熟悉
Eleven 2012-05-04
  • 打赏
  • 举报
回复
int recv_socket(int sockfd, void* buffer, int size)
{
int received = 0;

while (buffer && received < size)
{
int result = recv(sockfd, buffer + received, size - received, MSG_NOSIGNAL);
if (result > 0)
{
received += result;
}
else
{
received = result;
break;
}
}
return received;
}

---------
这个里面写的有问题,你是写在while循环中recv,退出while循环的条件是recv函数返回0,recv返回0表示发送端调用closesocket()关闭套接字。这个时候,你的recv_socket函数才返回到主调函数中。

还有一个问题就是你服务器端一次只能为一个客户端服务,知道该客户端关闭连接。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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