关于connect 我在用socket编写一个聊天程序时,出现了一个问题。在客服及连接服务机的connect中出现了错误,我用FormatMessage查看了下是 (无法立即完成一个非阻挡性套接字的操作)请问哪位高手知道的,知道的帮帮我。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你用的是非阻塞套接字,解决办法:1 改用阻塞套接字;2 用非阻塞套接字,用select或wsaeventselect等通过检测其是否可写,如果可写,连接完成。 我在里面使用WSAAsyncSelect来进行异步处理的,下面是服务器初始化的一些程序,就在connect后我用formatmessage查看了WSAGetLastError就是上面说的错误。void CChatDlg::ClientInit(){ CString strip; GetDlgItemText(IDC_EDIT_CIP,strip); CString strport; GetDlgItemText(IDC_EDIT_CPORT,strport); int iport; iport=atoi(strport); SOCKADDR_IN saddr; saddr.sin_addr.S_un.S_addr=inet_addr(strip); saddr.sin_family=AF_INET; saddr.sin_port=htons(iport); m_ClientSock=socket(AF_INET,SOCK_STREAM,0); if(INVALID_SOCKET==m_ClientSock) { MessageBox("client sock establish error!"); return; } if(0!=WSAAsyncSelect(m_ClientSock,m_hWnd,WM_CLIENT_MESSAGE, FD_CONNECT|FD_WRITE|FD_READ|FD_CLOSE)) { MessageBox("client WSAAsyncSelect error!"); return; } if(SOCKET_ERROR==connect(m_ClientSock,(sockaddr*)&saddr,sizeof(saddr))) { //MessageBox("client connect error!"); LPVOID lpMsgBuf; FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, WSAGetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) &lpMsgBuf, 0, NULL ); ::MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION ); LocalFree( lpMsgBuf ); return; } m_list.AddString("Connecting...");}处理WM_CLIENT_MESSAGE程序int CChatDlg::OnClientMessage(HWND hwnd,WPARAM wParam,LPARAM lParam){ if(WSAGETSELECTERROR(lParam)) { closesocket(m_ClientSock); CString strmsg("Server no response"); m_list.AddString(strmsg); } switch(WSAGETSELECTEVENT(lParam)) { case FD_CONNECT: { CString strmsg("Successfully connected."); m_list.AddString(strmsg); } break; case FD_READ: { char buffer[1024]; int recvlen; recvlen=recv(m_ClientSock,buffer,1024,0); if(SOCKET_ERROR==recvlen) { MessageBox("client recv error"); } else { m_list.AddString(buffer); } } break; case FD_WRITE: break; case FD_CLOSE: { closesocket(m_ClientSock); CString strmsg("Server close session."); m_list.AddString(strmsg); } break; } return 0;}请高手指点。 还是没写出 WSAGetLastError()=?sockSend.AsyncSelect(0);//由于CSocket实际是异步,将它变为同步(阻塞)方式。 楼上的,我的WSAGetLastError在connect下的FormatMessage里面,就是这里的connect出了错误。另外,我用的是socket API编程,没用CSocket 如何用windows服务程序模拟鼠标动作 关于CFileDialog的第三个参数,帮忙看看。 怎么样将某个文件复制到指定的文件夹里面呢? 小弟作了个小工具给朋友,可是对方用的时候提示需要"mfc71.dll" 我的adsl猫具有地址转换功能吗? 作好的VC如何变为.exe程序或安装程序? Update语句的咄咄怪事!!! 怎么使一个已知窗口句柄的窗口透明? 2个进程间的自定义消息怎么收不到? 有关DrawText+滚动条 大神们请进 为什么这段代码在DEBUG下可以正常运行,而在RELEASE下一点按钮程序就关闭? VC中解压RAR文件怎么做?
1 改用阻塞套接字;
2 用非阻塞套接字,用select或wsaeventselect等通过检测其是否可写,如果可写,连接完成。
void CChatDlg::ClientInit()
{
CString strip;
GetDlgItemText(IDC_EDIT_CIP,strip);
CString strport;
GetDlgItemText(IDC_EDIT_CPORT,strport);
int iport;
iport=atoi(strport); SOCKADDR_IN saddr;
saddr.sin_addr.S_un.S_addr=inet_addr(strip);
saddr.sin_family=AF_INET;
saddr.sin_port=htons(iport); m_ClientSock=socket(AF_INET,SOCK_STREAM,0);
if(INVALID_SOCKET==m_ClientSock)
{
MessageBox("client sock establish error!");
return;
}
if(0!=WSAAsyncSelect(m_ClientSock,m_hWnd,WM_CLIENT_MESSAGE,
FD_CONNECT|FD_WRITE|FD_READ|FD_CLOSE))
{
MessageBox("client WSAAsyncSelect error!");
return;
}
if(SOCKET_ERROR==connect(m_ClientSock,(sockaddr*)&saddr,sizeof(saddr)))
{
//MessageBox("client connect error!");
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
WSAGetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
::MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION );
LocalFree( lpMsgBuf );
return;
}
m_list.AddString("Connecting...");
}
处理WM_CLIENT_MESSAGE程序
int CChatDlg::OnClientMessage(HWND hwnd,WPARAM wParam,LPARAM lParam)
{
if(WSAGETSELECTERROR(lParam))
{
closesocket(m_ClientSock);
CString strmsg("Server no response");
m_list.AddString(strmsg);
}
switch(WSAGETSELECTEVENT(lParam))
{
case FD_CONNECT:
{
CString strmsg("Successfully connected.");
m_list.AddString(strmsg);
}
break;
case FD_READ:
{
char buffer[1024];
int recvlen;
recvlen=recv(m_ClientSock,buffer,1024,0);
if(SOCKET_ERROR==recvlen)
{
MessageBox("client recv error");
}
else
{
m_list.AddString(buffer);
}
}
break;
case FD_WRITE:
break;
case FD_CLOSE:
{
closesocket(m_ClientSock);
CString strmsg("Server close session.");
m_list.AddString(strmsg);
}
break;
}
return 0;
}请高手指点。