估计你是用的tcp socket,导致“videlord”网友说的情况:对于tcp socket,send与recv不是对等的,recv时只要缓冲有数据就会收上来。简单说就是你send 4次,比如分别为10 10 10 10字节,对端可以一次recv到这40字节数据,也可以recv 40次、每次1字节。
解决办法有两种:
改用udp socket,send/recv自然对等了
继续用tcp socket,自己进行数据分段:比如自行约定在数据前约定4个字节用于描述数据长度,这样发送时,send 4+33字节,send 4+35字节;接收时,先获取描述长度的4字节获得长度,再按照长度接收数据(可能需要多次recv凑齐指定长度)。
recv(SocketClient,RecvBuf,100,0);//接收服务器数据
printf("%s\n",RecvBuf);
也许没有接收到数据,所以在printf()输出时输出了没有初始化的字串。
你可以试一下:
char RecvBuf[100]={"\0"};
recv(SocketClient,RecvBuf,100,0);//接收服务器数据
printf("%s\n",RecvBuf);可以将客户端的逻辑设计成:
1将username,password 封装进buffer
2连接服务端
3发送buffer
4接收二进制的系统当前时间
5显示时间
代码如下:服务端地址设置部分:
[cpp] view plain copy print
addr_serversin_port = htons( port );
addr_serversin_addrs_addr = inet_addr( ip );
创建连接:
sock_client = socket( AF_INET, SOCK_STREAM, 0 );连接服务端代码:
flag = connect( sock_client, ( struct sockaddr ) &addr_server, sizeof( addr_server ) );设置buffer填充username/password代码:
sprintf(buffer, "%s", "username");sprintf(buffer + 32, "%s", "password" );
buffer[31]=buffer[63] = 0;
接着是发送
flag = send( sock_client, buffer, 64, 0 );if( flag == 64 )
{
printf( "send ok\n");
}
接收部分代码:
flag = recv( sock_client, buffer, 64, 0 );if( flag != sizeof( time_t ) )
{
printf( "recv does not follow protocal\n");
close( sock_client );
continue;
}
将接收到的二进制数据转成时间
memcpy( curtime, buffer, sizeof( time_t ) );struct tm ptm = localtime( curtime );
显示时间:
printf( "system time:%04d-%02d-%02d-%02d:%02d:%02d\n", ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday,ptm->tm_hour, ptm->tm_min, ptm->tm_sec );
关闭连接:
printf( "ok,now we close connection\n" );close( sock_client );
实际开发中,为了追求并发效率和提升搞压效果,客户端需要有一个循环,另外可以多进程同时 *** 作。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)