采用的是send 和recv函数
服务器端没有任何问题,只要你向服务器发送数据后就会收到数据,现在我是第一次发送的数据能够正确的接收,但是第二次发送数据后怎么都不能收到了,不停的进行select循环,各位碰到过这样的问题没有,头都大了,谢谢!!
服务器端没有任何问题,只要你向服务器发送数据后就会收到数据,现在我是第一次发送的数据能够正确的接收,但是第二次发送数据后怎么都不能收到了,不停的进行select循环,各位碰到过这样的问题没有,头都大了,谢谢!!
解决方案 »
- 请问这些话是什么意思呀,刚学WINDOWS程序设计,
- _beginthreadex 最后那个参数应该怎么定义?
- 一个比较不常见的问题,WinINet能穿透SOCKS5代理吗?
- 怎样在单文档的视图中创建按钮呢?
- 请教:如何利用CDatabase类和CRecordset类调用存储过程,并取得返回记录集
- 请版主不要删除这个贴子。并请版主和大家帮帮我!
- 各位新年好!!!,我想问一个简单的ADO的问题
- 大家别犯lstrcpy和CString相关的如此低级错误,昨天累了几乎四小时……
- 一个很有意思的问题
- HELP ME!我调用AfxBeginThread(),51分
- 怎么在对话框里建一个Doc/View
- 线程UINT的问题(在线等)
建一个win32console application
把代码考进去调试吧,谢谢了解决了问题一定重分酬谢!!
#include "winsock.h"
#include "iostream.h"
#pragma comment(lib, "ws2_32.lib")
char * ErrorStr;
char * Pop3Server="pop3.163.com";
char * PassWord="123456";
char * UserName="lbyang";
SOCKET sock;
bool Connect();
bool Close();
int RecData(char * outdata,int outdatalen);
int SendData(char *cmd,int cmdlen);
int SubString(char * str, char * sub, int start, int length);
int JudgeString(char * strCheck);
int Login();
int main()
{
char c;
Connect(); Close();
cin>>c;
return 0;
}
bool Connect()
{
// TODO: Add your implementation code here IPPROTO_TCP
unsigned int iPort=110;
struct sockaddr_in m_sockaddr;
WSADATA wsd;
WSAStartup(MAKEWORD(1,1),&wsd);
sock=socket(AF_INET,SOCK_STREAM,0);
if(sock==INVALID_SOCKET)
{
cout<<"Create_Socket_Error";
return S_FALSE;
}
if(strlen(Pop3Server) == 0)
{
cout<<("initialize pop3server first");
return S_FALSE;
}
hostent *hostEnt = NULL;
long lIPAddress =0;
hostEnt = gethostbyname(Pop3Server);//根据计算机名得到该计算机的相关内容;
if(hostEnt!=NULL)
{
lIPAddress = ((in_addr*)hostEnt->h_addr)->s_addr;
m_sockaddr.sin_addr.s_addr = lIPAddress;
}
else
{
m_sockaddr.sin_addr.s_addr = inet_addr(Pop3Server);
}
m_sockaddr.sin_family = AF_INET;
m_sockaddr.sin_port = htons(iPort);
unsigned long NonBlock;
NonBlock = 1;
if(connect(sock, (sockaddr *)&m_sockaddr, sizeof(m_sockaddr))==SOCKET_ERROR)
{
cout<<"Connect_Pop3Server_Error";
return S_FALSE;
}
if (ioctlsocket(sock, FIONBIO, &NonBlock) == SOCKET_ERROR)
{
cout<<("ioctlsocket() failed with error %d\n", WSAGetLastError());
return S_FALSE;
}
if(UserName==NULL||PassWord==NULL)
{
cout<<"UserName Or PassWord is empty,first initialize them";
return S_FALSE;
}
char outdata[240];
int outdatalen=240;
/*
char cmd1[10];
ZeroMemory(cmd1,sizeof(cmd1));
if(SendData(cmd1,sizeof(cmd1))==-1)
return S_FALSE;
*/
if(RecData(outdata,outdatalen)==-1)
{
cout<<("No welcome word");
return S_FALSE;
}
cout<<"welcome:"<<outdata<<endl;
if(Login()==0)
{
cout<<("OK");
return S_OK;
}
else
{
cout<<("UserName or PassWord is wrong!,Can't login Pop3 server")<<endl;
return S_FALSE;
}
}
bool Close()
{
// TODO: Add your implementation code here
if(closesocket(sock)== SOCKET_ERROR)
{
cout<<("closesocket() failed");
return S_FALSE;
}
//WSAClean();
cout<<("close sock OK");
WSACleanup();
return S_OK;
}int SendData(char *cmd,int cmdlen)
{
int ret = 0;
timeval tv01;// = {1,0};//1ms钟延迟,实际为0-10毫秒
tv01.tv_sec=2;
tv01.tv_usec = 0; fd_set fdr;
int nSelectRet=0;
cout<<"in senddata "<<endl;
if( cmd == NULL)
{
cout<<("SendCmd_PARAM_Error");
return -1;
}
strcat(cmd,"\r\n");
cout<<cmd;
tv01.tv_sec=2;
tv01.tv_usec=0;
int i=0;
int len;
while(1)
{
FD_ZERO(&fdr);
FD_SET(sock,&fdr);
Sleep(10);
nSelectRet=select(0,0,&fdr,0,0);//&tv01
if(SOCKET_ERROR==nSelectRet)
{
cout<<("可写状态为零");
::closesocket(sock);
return -1;
}
if(nSelectRet==0)//超时发生,无可写数据
{
cout<<("超时发生,不可写数据");
return -1;
}
if(nSelectRet>0&&FD_ISSET(sock, &fdr))
{
len=send(sock,cmd, cmdlen,0);
if(len==SOCKET_ERROR)
{
cout<<("SEND_COMMAND_DATA_ERROR");
return -1;
}
else
{
cout<<("SEND_DATA_len")<<len<<endl;
return 0;
}
}
if(i++>100)
{
cout<<"send select "<<i<<endl;
return -1;
}
}
return 0;
}int RecData(char * outdata,int outdatalen)
{
int ret = 0;
timeval tv01;// = {1,0};//1ms钟延迟,实际为0-10毫秒
tv01.tv_sec=20;
fd_set fdr;
int nSelectRet=0;
FD_ZERO(&fdr);
FD_SET(sock,&fdr);
tv01.tv_sec=2;
cout<<"in RecData "<<endl;
int i=0;
while(1)
{
//FD_SET(1, &fdr);
FD_ZERO(&fdr);
FD_SET(sock,&fdr);
nSelectRet=::select(0, &fdr, NULL, NULL, &tv01);//检查可读状态
Sleep(100);
if(SOCKET_ERROR==nSelectRet)
{
//itoa(WSAGetLastError(),ErrorStr,10);
cout<<("可读出错");
// ::closesocket(sock);
return -1;
}
if(FD_ISSET(sock, &fdr))
{
ret=recv(sock, outdata, outdatalen, 0);
if( ret == 0 )
{
cout<<("str_cli: server terminated prematurely")<<endl;
return -1;
}
else if( ret == SOCKET_ERROR )
{
cout<<("Receive error!");
// ErrorStr=_T
return -1;
}
outdata[ret] = '\0';
cout<<("Receive data")<<endl;
return 0;
}
i++;
//cout<<i++<<endl;
if(i>50)
{
cout<<"select:"<<i<<endl;
break;
} }
return -1;
}
int Login()
{
char temp1[240];
char cmd1[40]="user ";
char cmd2[40]="pass ";
int ret=0;
//return 0;
cout<<"in Login "<<endl; strcat(cmd1,UserName);
strcat(cmd2,PassWord);
ZeroMemory(temp1,sizeof(temp1));
if(SendData(cmd1,sizeof(cmd1))==-1)
return -1;
ZeroMemory(temp1,sizeof(temp1));
if(RecData(temp1,sizeof(temp1))==-1)
return -1;
cout<<temp1<<endl;
if(SendData(cmd2,sizeof(cmd2))==-1)
return -1;
ZeroMemory(temp1,sizeof(temp1));
if(RecData(temp1,sizeof(temp1))==-1)
return -1; cout<<temp1<<endl;
// ZeroMemory(temp1,sizeof(temp1));
// if(SendPopCmd(cmd2,sizeof(cmd2)+1,temp1,sizeof(temp1))==-1)
// return -1;
// TempData=temp1;
if(JudgeString(temp1)==0)
{
// ZeroMemory(temp2,sizeof(temp2));
return 0;
}
else
{
/// ZeroMemory(temp2,sizeof(temp2));
cout<<("UserName or PassWord is wrong!Can't login Pop3 server")<<endl;
return -1;
}
}int JudgeString(char * strCheck)
{ char t[10];
SubString(strCheck,t,0,3);
if(strcmp(t,"+OK"))
{
return -1;
}
else
return 0;
}int SubString(char * str, char * sub, int start, int length)
{
char *t;
char *p;
int i=0;
int len=strlen(str);
t=sub;
if(start+1>len)
{
*t='\0';
return -1;
}
p=str+start;
if(start+length>len)
{
while(*p!='\0')
{ *t=*p;
t++;
p++;
}
}
else
while(i!=length)
{
*t=*p;
t++;
p++;
i++;
}
*t='\0';
return 0;
}