我有个很大的问题..。我正在使用C中的套接字,我向服务器发送了一个请求,它向我发送了许多响应。问题是客户端接收到第一个响应,然后连接被关闭。我能做什么?我试过和setsockopt()..。SO_KEEPALIVE或SO_LINGER,但我还没有解决这个问题。你能帮帮我吗?非常感谢
这里更清楚的是代码。套接字在一定时间后或客户端收到第一个响应后自动关闭.我没有把握。
char* demarre_client( client_args * c_args,char* message, /*char* SERVEUR_PORT*/int port){
int socket_client=socket(PF_INET,SOCK_STREAM,0);
memset(&(c_args->adresse_serveur),0,sizeof(c_args->adresse_serveur));
c_args->adresse_serveur.sin_family=AF_INET;
c_args->adresse_serveur.sin_addr.s_addr=inet_addr(SERVEUR_IP);
//int port=APHash(SERVEUR_PORT,strlen(SERVEUR_PORT));
c_args->adresse_serveur.sin_port=htons(port);
int err=0;
if ((err=connect(socket_client, (struct sockaddr *) &(c_args->adresse_serveur), sizeof(c_args->adresse_serveur)))<0)
{
printf("CONNECT error %d\n", errno);
exit(-1);
}
if (send(socket_client, message, strlen(message), 0)!=strlen(message))
{
printf("send error!!\n");
exit(-2);
}
char* raspFin=(char* )malloc(sizeof(char)*1024);
strcpy(raspFin,"");
int num=-1;
int nn=0;
char* rasp=(char* )malloc(sizeof(char)*1024);
memset (rasp, 0, 1024 * sizeof(char ));
/* here it reads the first response and after he get out of while */
while ((num=recv(socket_client, rasp,1024,MSG_WAITALL))>0)
{
printf("recu %s mun=%d\n" , rasp,num);
strcat(raspFin,rasp);
strcat(raspFin,"\n");
rasp=(char* )malloc(sizeof(char)*1024);
memset (rasp, 0, 1024 * sizeof(char ));
}
if (num<0)
{
printf("rasp error!!\n");
exit(-3);
}发布于 2009-03-19 07:50:32
你确定第一次打电话的时候没有得到所有的回复吗?
TCP/IP是一种没有流控制的流协议,因此使用单独的send()调用发送的不同消息可以在一个recv()中接收。因为您使用了printf(),所以它会打印缓冲区,直到它看到null-终止符-可能是终止符之外的其他响应?
尝试使用一些流控制,如发送消息长度前缀或使用一些特殊字符(如STX/ETX,但确保您的消息不包含此类字符)。如果您计划使用这个软件,那么无论如何您都需要实现一些流控制。
现在,尝试将printf()替换为
char *ptr;
for (ptr = buffer; ptr <= buffer + num; ptr += strlen(ptr)+1;)
printf("%s\n", ptr);它将从响应缓冲区打印所有字符串。
而且您不需要在循环中使用malloc() --您会泄漏内存。
顺便说一下,SO_KEEPALIVE和SO_LINGER与这个问题无关。
发布于 2009-03-19 09:16:29
我的建议是启动Wireshark网络分析仪,看看在分组上发生了什么。在滤波器组中
tcp.srcport == <insert_server_port> || tcp.dstport == <insert_server_port>您应该看到实际发送给哪些数据以及谁关闭了连接(发送FIN/RST数据包)。
https://stackoverflow.com/questions/660421
复制相似问题