今天调试的一个socket程序,主要实现的功能是客户端输入用户名和密码,然后服务器端显示出余额。这是参考书中的例子,自己补全了代码。自己调试的过程中还是膨大很多问题的。
下面是主要的头文件
其中winsock,pragma comment(lib,"wsock32“)是套接字必备的一个头文件,atlstr.h是为了不在MFC的情况下,使用CString。
其中我学到的就是在socket发送的数据中,比如传输用户名和密码。它的发送和接收机制是这样的,先发一个用户名的长度,再发用户名,再发密码长度,再发密码。
这样在接收端接收的时候,先接收第一个数据,(正是双方约定好了的),它包含了用户名长度,再从接收的数据中读取相应长度的数据。再读取下一个数据,它包含了密码的长度,再读取密码。
在代码中,它是这样实现的,首先创建了一个char型的指针name,为空。再创建len+1个char型内存空间(为最后加上0而多分配一个空间),然后就是读取接收到的数据。同样的道理创建一个char型的指针pass。同样的道理接收密码数据。
在代码中创建了空间就一定要再代码的最后释放数据。
在项目属性里面如果字符集选用的是“使用 Unicode 字符集” 那么编译器在编译下面这行代码的时候很有可能出错,并且查起来很费劲,很郁闷
这是因为编译器默认给CString类型的是WCHAR类型,而buff指针是char型的。因此在这里就需要把项目属性里——常规——字符集选为使用多字节字符集。
这个代码的缺点是只能查一个用户的余额,不能查多用户的。自己水平,刚开始,加强锻炼。
客户端的代码,简单起见,只写上了connect部分和send部分的代码
其中今天费了好大劲,实现了能自己输入用户名和密码。在代码中如果直接设置CString cuser;而不赋值,在运用cin,cin.get,cin.getline这些时都不管用,很郁闷,最后自己只能是先确定了一个char类型的数组或者是指针,然后给这个char类型的变量赋值,再由这个char类型的变量赋值给Cstring类型的变量。
send完用户名和密码之后,则等待服务器的反馈,如果是正确则会显示“your account left is 1W”,如果不正确则会显示相应的信息。
完整的代码在自己的邮箱中,名字为exam_1和exam_2