Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
客户端消息不';t在tcp winsock中到达服务器_C_Windows_Tcp_Client Server_Winsock - Fatal编程技术网

客户端消息不';t在tcp winsock中到达服务器

客户端消息不';t在tcp winsock中到达服务器,c,windows,tcp,client-server,winsock,C,Windows,Tcp,Client Server,Winsock,我有一个服务器客户端应用程序。 当我连续发送消息(下面的代码中没有scanf)时,服务器似乎没有收到它们(没有打印)。 如果我稍等一下(下面的代码中有scanf),然后发送下一条消息,服务器工作正常并打印所有消息 有什么问题吗? 我如何修复它,因为我想对到达服务器的消息做更多的处理(不仅仅是打印) 在我的客户机代码中(服务器不打印任何内容) char消息[(100)]={0}; int x=rand(); 而(i

我有一个服务器客户端应用程序。 当我连续发送消息(下面的代码中没有scanf)时,服务器似乎没有收到它们(没有打印)。 如果我稍等一下(下面的代码中有scanf),然后发送下一条消息,服务器工作正常并打印所有消息

有什么问题吗? 我如何修复它,因为我想对到达服务器的消息做更多的处理(不仅仅是打印)

在我的客户机代码中(服务器不打印任何内容)

char消息[(100)]={0};
int x=rand();
而(i<3)
{
printf(“我发送%d\n”,x);fflush(NULL);
sprintf(消息,“%d”,x);
如果(发送(mainSockfd,消息,strlen(消息),0)=-1)
{
printf(“errrrrrr\n”);fflush(NULL);
}
i++;
x=rand()%100;
}
在我的客户端代码中(当服务器打印消息时)

char消息[(100)]={0};
int x=rand();
而(i<3)
{
printf(“我发送%d\n”,x);fflush(NULL);
sprintf(消息,“%d”,x);
如果(发送(mainSockfd,消息,strlen(消息),0)=-1)
{
printf(“errrrrrr\n”);fflush(NULL);
}
i++;
x=rand()%100;
scanf(“%d”,&x);//这是唯一的更改
}
在我的服务器代码中

char command[(100+1)] = {0};
while(1)
    {
        readLength = recv(sockfd, command, 100+1,0);
        if(readLength > 0)
        {
            printf("arrived = %s,\n",command);fflush(NULL);
            ZeroMemory(command, sizeof(command));
        }
        else if( readLength == 0)
                {
                    break;
                }
        else if ( readLength < 0 ){
            if(GetLastError() == 10035)
            {
                continue;
            }
            if(GetLastError() == 10057 || GetLastError() == 10054)
            {
                break;
            }
            continue;
        }
    }
char命令[(100+1)]={0};
而(1)
{
readLength=recv(sockfd,命令,100+1,0);
如果(读取长度>0)
{
printf(“到达=%s\n”,命令);fflush(NULL);
零内存(命令,sizeof(命令));
}
else if(readLength==0)
{
打破
}
else if(readLength<0){
如果(GetLastError()==10035)
{
继续;
}
如果(GetLastError()==10057 | | GetLastError()==10054)
{
打破
}
继续;
}
}

当您似乎正在传输
0
终止的“字符串”而不终止
0
时,您应该读取一个
char
,少于读取缓冲区提供的读取缓冲区,以便始终终止
0
,就好像您试图
printf
一个非
0
终止的“字符串”你挑起了未定义的行为

所以改变这个

readLength = recv(sockfd, command, 100+1,0);
变成这样

readLength = recv(sockfd, command, 100,0);

命令如何声明?什么是MAX_MSGLEN
?同时打印
readLength
message
是如何声明的?我编辑过。连接关闭时,readLength为-1。在没有scanf的代码中,什么也不打印(我也尝试打印readLength)。“readLength为-1”,您通过
GetLastError()
?10054.得到了哪个错误。。当客户端完成发送消息并关闭连接时,就会发生这种情况。如果
recv()
返回
0
,则可以中断循环,因为这意味着另一方关闭了连接。请看这里:是的,这是一部经典之作。网络代码#0193473:)中strlen()的滥用现在我得到第一条消息ok,另外两条消息连接在一起。我发4167和34。第一条消息是“Arrized=41”,第二条消息是“Arrized=6734”,第三条消息是“Arrized=,”@KobiGuetta:好的,这是一个不同的问题。你可能想提出另一个问题。另外,阅读此答案可能有助于您了解正在发生的情况。如果我使用Winsock函数(如WSArecv)或可能使用事件(FDSET等),这很重要吗?我从未尝试过使用它们。@alk:我在发送函数中更改了,从strlen(message)改为100,现在它从未连接,打印效果很好,但有时它什么都不打印(readLength为-1)。
readLength = recv(sockfd, command, 100+1,0);
readLength = recv(sockfd, command, 100,0);