谁知道DOS的命令?

谁知道DOS的命令?,第1张

估计你是用的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凑齐指定长度)。

char RecvBuf[100];
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_family = AF_INET;  
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 );

实际开发中,为了追求并发效率和提升搞压效果,客户端需要有一个循环,另外可以多进程同时 *** 作。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10660064.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存