在Win32中与服务器通信;我怎么看服务器的响应?

时间:2011-01-16 03:33:31

标签: winapi smtp winsock visual-c++

我是Win32编程的新手。

sprintf(lpszBuff,"HELO Mail-Server\r\n");
     send(s,lpszBuff,strlen(lpszBuff),0);     
     recv(s,lpszBuff,100,0);
  cout << lpszBuff;

在这里,我连接到本地邮件服务器。缓冲区包含我发送的请求,同一缓冲区包含浏览器发送的回复。我如何看待回复? cout <<buffer未显示任何输出。我在VC ++ 2008上这样做。

2 个答案:

答案 0 :(得分:0)

您使用的是阻塞套接字还是非阻塞套接字? recv()的返回值是多少?您有可能在阅读之前阅读,recv()正在返回您忽略的错误代码。你所展示的太简单了。正确的套接字编码需要更多逻辑(当发生不完整的发送/读取时循环,使用select()检测套接字状态,错误处理等)

答案 1 :(得分:0)

当您作为发件人与SMTP服务器通信时,接收/邮件服务器应首先向发件人发送220命令。

     R: 220 BBN-UNIX.ARPA Simple Mail Transfer Service Ready
     S: HELO USC-ISIF.ARPA
     R: 250 BBN-UNIX.ARPA

     S: MAIL FROM:<Smith@USC-ISIF.ARPA>
     R: 250 OK

     S: RCPT TO:<Jones@BBN-UNIX.ARPA>
     R: 250 OK

     S: RCPT TO:<Green@BBN-UNIX.ARPA>
     R: 550 No such user here

     S: RCPT TO:<Brown@BBN-UNIX.ARPA>
     R: 250 OK

     S: DATA
     R: 354 Start mail input; end with <CRLF>.<CRLF>
     S: Blah blah blah...
     S: ...etc. etc. etc.
     S: .
     R: 250 OK

     S: QUIT
     R: 221 BBN-UNIX.ARPA Service closing transmission channel

R:Receptor - 本地SMTP服务器 S:表示本地发件人

基本上你应该:

recv(s,lpszBuff,200,0); // for 220
cout << lpszBuff;
sprintf(lpszBuff,"HELO Mail-Server\r\n");
send(s,lpszBuff,strlen(lpszBuff),0);     
recv(s,lpszBuff,100,0);
cout << lpszBuff;

确保您的套接字处于阻止模式。