socket问题,自己写的客户端断线重连程序,,PC机上测试正常,ARM板上出错
本帖最后由 fantansy 于 2010-10-18 15:39 编辑如题,客户端循环向服务器发送一段字符串。当服务器关闭,再打开后,要求客户端能自动连上。服务器不用自己写,负责将客户端的发送字符打印出来。
但是在ARM板上测试时,客户端发送数据正常,但是当服务器关闭,客户端也跟着关闭,无任何出错信息。#include<stdio.h>
#include <>
int main(int argc,char* argv[])
{
int a;
if (argc != 3)
{
fprintf(stderr,"error input ! <codename><ip><port>\n");
//exit(1);
}
while(1)
{
a = my_socket(argv,argv);
printf("a : %d\n",a);
if(a == -2)
{
printf("/**************************\nretry to connect the server\n\n**************************************\n");
}
}
printf("here!!");
return 0;
}
int my_socket(char *serv_ip,char *serv_port)
{
int sockfd;
int numbytes;
char serverip;
int my_port;
char buf[]="ddkksldfksdlfkajsaldfksdlfa\n";
struct sockaddr_in their_addr;
struct timeval tv;
fd_set rfds,xfds; //写描述符集,异常描述符集
int maxfd;
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) //建立socket
{
perror("socket");
return -2;
}
strcpy(serverip,serv_ip);
bzero(&their_addr, sizeof(their_addr)); //一些设置
their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(6060);//SERV_PORT
inet_pton(AF_INET, serv_ip, &their_addr.sin_addr);
printf("sockfd:%d\n",sockfd);
if (connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr)) == -1) //连接
{
perror("connect:\n");
close(sockfd);
return -2;
}
FD_ZERO(&rfds);
FD_ZERO(&xfds);
int n;
while(1)
{
//sleep(1);
FD_SET(sockfd,&rfds);
FD_SET(sockfd,&xfds);//我想看看程序有没有什么异常
tv.tv_sec=1;
tv.tv_usec=0;
maxfd = sockfd + 1;
n = select(maxfd,NULL,&rfds,&xfds,&tv);
printf("n:%d\n",n);
if(n > 0 ){
if(FD_ISSET(sockfd,&rfds))
{
numbytes=write(sockfd, buf, sizeof(buf));//如果sockfd可写,那么发送一段字符到服务器
if(numbytes <= 0)
{
printf("numbytes error");
close(sockfd);
return -2;
}
}//n>0
if(FD_ISSET(sockfd,&xfds))//判断是否有异常
{
printf("&xfds error");
close(sockfd);
return -2;
}
}
if(n == 0) //select 返回0,则重连
{
printf("select time out");
close(sockfd);
return -2;
}
if(n<0) //select < 0也重连
{
printf("select < 0");
close(sockfd);
return -2;
}
}//while
close(sockfd);
return -2;
}//my_socket函数设定,出错返回-2
期待高人指点,, 期待高手指点。。。 "当服务器关闭,再打开后,要求客户端能自动连上"
显然你的程序完全没有实现这个。
代码好乱。
另外:
应该在select(maxfd,NULL,&rfds,&xfds,&tv);
加上读判断
当读到==0的时候,服务器就关闭了,你可以在fork()一个程序再次连接服务器
TCP是四元素(对方端口,对方地址,本地端口,本地地址)来确定一个套接口的 SIGPIE信号?
页:
[1]