我想通过一个程序 和远程服务器建立连接并且交互,就像TELNET一样,但是遇到了问题。先看代码吧。
#include <iostream>
#include <string>
#include <stdlib.h>
#include <stdio.h>
#include <process.h>
#include <WinSock2.h> //适用平台 Windows
using namespace std;
#pragma comment(lib, "ws2_32.lib")
unsigned __stdcall resolve(void* pArguments)
{
SOCKET socket = (SOCKET) pArguments;
while(1)
{
char recvBuf[500]="";
recvBuf[recv(socket, recvBuf, 500, 0)] = '\0';
printf("%s",recvBuf);
}
}
int main()
{
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(2, 1);
//WSAStarup,即WSA(Windows SocKNDs Asynchronous,Windows套接字异步)的启动命令
int err = WSAStartup(wVersionRequested, &wsaData);
SOCKET sockClient; //客户端的套接字
sockClient = socket(AF_INET, SOCK_STREAM, 0); //建立socket对象
char host[50];
int port;
printf("输入连接的主机:");
scanf("%s",&host);
printf("输入连接的端口:");
scanf("%d",&port);
HOSTENT* pHostent;
pHostent = gethostbyname(host);
cout<<pHostent->h_name<<endl;
SOCKADDR_IN addrServer; //服务端地址
addrServer.sin_addr.S_un.S_addr = *((DWORD *)pHostent->h_addr_list[0]); //得到smtp服务器的网络字节序的ip地址
addrServer.sin_family = AF_INET;
addrServer.sin_port = htons(port); //连接端口25
if((err = connect(sockClient, (SOCKADDR*)&addrServer, sizeof(SOCKADDR)))) //向服务器发送请求
{
cout<<"连接邮件服务器失败!"<<endl;
return 0;
}
HANDLE hThread;
unsigned threadID;
hThread = (HANDLE)_beginthreadex( NULL, 0, &resolve, (void*)sockClient, 0, &threadID );
//send(sockClient,"ehlo qq.com\r\n",strlen("ehlo qq.com\r\n"),0);
//cout<<"ehlo qq.com\r\n"<<endl;
while(1)
{
char buff[500] = "";
cin>>buff;
strcat(buff,"\r\n");
send(sockClient,buff,strlen(buff),0);
}
Sleep(20000);
CloseHandle( hThread );
}
问题是这样的,运行这个程序,输入 smtp.qq.com 和 25,连接到邮箱服务器。出现下面的文字代表连接成功了,
然后输入ehlo qq.com ,就会出现无法识别的输入
但是我们如果把代码55,56行取消注释,然后运行程序。结果如下
由此可见,输入的符号没问题,但我不知道是什么导致不能直接通过输入和服务端进行交互,是要经过什么转换吗?