📄 01client.cpp
字号:
/**客户控制台应用程序---Echo(回声服务)
**/
#include <afxwin.h> // 使用了MFC的字符串类:CString
#include "winsock.h"
#pragma comment(lib, "wsock32")
#include "assert.h"
#include "iostream.h"
CString m_strServer; //服务器IP地址
UINT m_nPort; //服务器端口号
CString m_strUser; //客户名
CString m_strPass; //客户口令
SOCKET m_hSocket; //服务器进程套接字类
SOCKADDR_IN m_addr; //套接字地址结构
void StartUp(); //初始化Winsock的函数:启动Winsock
void CleanUp(); //终止对Winsock DLL的使用,释放资源
void OnOK(); //建立TCP通信套接字并与服务器连接
void SendToServer(); //向服务器发送数据
void RecvFromServer(); //向服务器发送数据
//从str的头一个字符往后检查,直到字符'\0'(其值为0)为止,即返回字符串str字符'\0'前的长
int strlen(char str[]);
void main(){
m_strServer = "127.0.0.1"; //_T("127.0.0.1");
m_nPort = 2350;
m_strUser = "测试数据";//ware";
m_strPass = "test";
StartUp(); //初始化Winsock的函数:启动Winsock
char cc;
do{
OnOK();//建立通信套接字
cout<<"已经与服务器连接成功,向服务器发送数据\n";
SendToServer();//向服务器发送数据
cout<<"发送成功,服务器返回数据:\n\n";
RecvFromServer();//从服务器接收数据
cout<<"\n本次通信完成;再来吗(y/n)\n";cin>>cc;
}while (cc != 'n');
CleanUp(); //终止对Winsock DLL的使用,释放资源
}
//调用socket建立TCP通信套接字并与服务器连接
void OnOK()
{
//调用socket建立TCP通信套接字
if(m_hSocket != NULL){
closesocket(m_hSocket);
m_hSocket = NULL;
}
if(m_hSocket == NULL){
m_hSocket = socket(AF_INET, SOCK_STREAM,0);
assert(m_hSocket != NULL);
}
//UpdateData();
//给套接字地址结构赋值
m_addr.sin_family = AF_INET;
m_addr.sin_addr.S_un.S_addr = inet_addr(m_strServer.GetBuffer(0));
m_addr.sin_port = htons(m_nPort);
int ret = 0;//
int error = 0;
//用connect建立连接,连接成功,返回0,否则返回SOCKET_ERROR
ret = connect(m_hSocket, (LPSOCKADDR)&m_addr, sizeof(m_addr));
if(ret == SOCKET_ERROR){//出错处理
TRACE("Connect Error: %d \n", (error = WSAGetLastError()));
// cout<<"Connect Error!\n";//, (error = WSAGetLastError()));
if(error == 10061)
// AfxMessageBox(_T("请确认服务器确实已经打开并工作在同样的端口!"));
cout<<"请确认服务器确实已经打开并工作在同样的端口!\n";
return ;
}
}
void SendToServer(){
//
CString str;
str += m_strUser;
str += m_strPass;
//发送数据,如成功,返回发送的字节数
int ret = send(m_hSocket, str, str.GetLength(), 0);
if(ret != str.GetLength()){
TRACE("Send data error: %d\n", WSAGetLastError());
// cout<<"Send data error: %d\n";//, WSAGetLastError());
return ;
}
}
void RecvFromServer(){
char buff[256];
/** 接受数据recv函数的返回值:
如无错误,返回接到的字节数(bytes received)
如连接已关闭,返回0
要不然,返回出错处理值:SOCKET_ERROR
**/
int ret = recv(m_hSocket, buff, 256, 0);
if(ret == 0){
TRACE("Recv data error: %d\n", WSAGetLastError());
// cout<<"Recv data error: %d\n";//, WSAGetLastError());
return ;
}
buff[ret] = '\0';//ASCII值为0的字符:'\0'
cout<<buff<<endl;//显示服务器送回数据
//AfxMessageBox(buff);
}
//初始化Winsock的函数:启动Winsock
void StartUp()
{
WSADATA wsaData;
WORD version = MAKEWORD(2, 0); //
//调用WSAStartup函数对Winsock DLL进行初始化,协商Winsock版本支//持,分配资源
int ret = WSAStartup(version, &wsaData);
if(ret != 0)cout<<"初始化错误!\n";
}
//应用程序关闭套接字后,终止对Winsock DLL的使用,释放资源
void CleanUp()
{
if (WSACleanup() != 0){
TRACE("UnInitilize Error:%d\n", WSAGetLastError());
// cout<<"UnInitilize Error:%d\n";//, WSAGetLastError());
}
}
//从str的头一个字符往后检查,直到字符'\0'(其值为0)为止,即返回字符串str字符'\0'前的长
int strlen(char str[]){
int i=0;
while(str[i])i++;
return i;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -