服务端, 开启服务的代码:
m_socksvr = socket(AF_INET, SOCK_STREAM, 0);
if ((m_socksvr == INVALID_SOCKET) || (NULL == m_socksvr))
{
AfxMessageBox("Create socket");
return;
}
int ret = WSAAsyncSelect(m_socksvr, m_hWnd, WM_SOCKET,
FD_READ | FD_WRITE | FD_ACCEPT);
if (SOCKET_ERROR == ret)
{
AfxMessageBox("Select");
closesocket(m_socksvr);
m_socksvr = NULL;
return;
}
struct sockaddr_in svraddr;
hostent *hostaddr;
char hostnm[255];
gethostname(hostnm, 255);
hostaddr = gethostbyname(hostnm);
svraddr.sin_family = AF_INET;
svraddr.sin_port = 10001;
svraddr.sin_addr.S_un.S_addr = *((unsigned long *)hostaddr->h_addr_list[0]);
memset(svraddr.sin_zero, 0, 8);
ret = bind(m_socksvr, (sockaddr *)&svraddr, sizeof(svraddr));
if ((ret == SOCKET_ERROR) || (0 != ret))
{
AfxMessageBox("bind");
closesocket(m_socksvr);
m_socksvr = NULL;
return;
} ret = listen(m_socksvr, 5);
if ((SOCKET_ERROR == ret) || (0 != ret))
{
AfxMessageBox("listen");
closesocket(m_socksvr);
m_socksvr = NULL;
return;
}
在消息处理函数里的代码:
char *buf = NULL;
switch (lp)
{
case FD_ACCEPT:
m_csock = accept(m_socksvr,
(sockaddr FAR *)&caddr,
&addlen);
if ((NULL == m_csock) || (SOCKET_ERROR == m_csock))
{
AfxMessageBox("Accept fail");
m_csock = NULL;
}
break; case FD_READ:
buf = (char *)malloc(1024);
recv(m_csock, buf, 1024, 0);
free(buf);
buf = NULL;
break; case FD_WRITE:
send(m_csock, (char *)wp, strlen((char *)wp), 0);
break; }
return 0;
客户端,连接代码:
m_sock = socket(AF_INET, SOCK_STREAM, 0);
if ((NULL == m_sock) || (INVALID_SOCKET == m_sock))
{
AfxMessageBox("Create socket fail");
m_sock = NULL;
return;
}
int ret = WSAAsyncSelect(m_sock, m_hWnd, WM_SOCKET,
FD_READ | FD_WRITE);
if ((0 != ret) || (SOCKET_ERROR == ret))
{
AfxMessageBox("select fail");
closesocket(m_sock);
m_sock = NULL;
return;
}
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_addr.S_un.S_addr = inet_addr((char FAR *)"192.168.0.6");//服务器IP地址
saddr.sin_port = 10001;
memset(saddr.sin_zero, 0, 8);
ret = connect(m_sock, (sockaddr *)&saddr, sizeof(saddr));
if ((0 != ret) || (SOCKET_ERROR == ret))
{
AfxMessageBox("connect fail");
closesocket(m_sock);
}
为什么会连接不上呢? 报出的错误号是:WSAEWOULDBLOCK(10035)
看了好多书和示例程序,都这样做的,为什么我的这段程序就不行。
郁闷好久了,求教各位大虾,请不吝赐教。
若觉得分不够,可以再开贴加分!
m_socksvr = socket(AF_INET, SOCK_STREAM, 0);
if ((m_socksvr == INVALID_SOCKET) || (NULL == m_socksvr))
{
AfxMessageBox("Create socket");
return;
}
int ret = WSAAsyncSelect(m_socksvr, m_hWnd, WM_SOCKET,
FD_READ | FD_WRITE | FD_ACCEPT);
if (SOCKET_ERROR == ret)
{
AfxMessageBox("Select");
closesocket(m_socksvr);
m_socksvr = NULL;
return;
}
struct sockaddr_in svraddr;
hostent *hostaddr;
char hostnm[255];
gethostname(hostnm, 255);
hostaddr = gethostbyname(hostnm);
svraddr.sin_family = AF_INET;
svraddr.sin_port = 10001;
svraddr.sin_addr.S_un.S_addr = *((unsigned long *)hostaddr->h_addr_list[0]);
memset(svraddr.sin_zero, 0, 8);
ret = bind(m_socksvr, (sockaddr *)&svraddr, sizeof(svraddr));
if ((ret == SOCKET_ERROR) || (0 != ret))
{
AfxMessageBox("bind");
closesocket(m_socksvr);
m_socksvr = NULL;
return;
} ret = listen(m_socksvr, 5);
if ((SOCKET_ERROR == ret) || (0 != ret))
{
AfxMessageBox("listen");
closesocket(m_socksvr);
m_socksvr = NULL;
return;
}
在消息处理函数里的代码:
char *buf = NULL;
switch (lp)
{
case FD_ACCEPT:
m_csock = accept(m_socksvr,
(sockaddr FAR *)&caddr,
&addlen);
if ((NULL == m_csock) || (SOCKET_ERROR == m_csock))
{
AfxMessageBox("Accept fail");
m_csock = NULL;
}
break; case FD_READ:
buf = (char *)malloc(1024);
recv(m_csock, buf, 1024, 0);
free(buf);
buf = NULL;
break; case FD_WRITE:
send(m_csock, (char *)wp, strlen((char *)wp), 0);
break; }
return 0;
客户端,连接代码:
m_sock = socket(AF_INET, SOCK_STREAM, 0);
if ((NULL == m_sock) || (INVALID_SOCKET == m_sock))
{
AfxMessageBox("Create socket fail");
m_sock = NULL;
return;
}
int ret = WSAAsyncSelect(m_sock, m_hWnd, WM_SOCKET,
FD_READ | FD_WRITE);
if ((0 != ret) || (SOCKET_ERROR == ret))
{
AfxMessageBox("select fail");
closesocket(m_sock);
m_sock = NULL;
return;
}
struct sockaddr_in saddr;
saddr.sin_family = AF_INET;
saddr.sin_addr.S_un.S_addr = inet_addr((char FAR *)"192.168.0.6");//服务器IP地址
saddr.sin_port = 10001;
memset(saddr.sin_zero, 0, 8);
ret = connect(m_sock, (sockaddr *)&saddr, sizeof(saddr));
if ((0 != ret) || (SOCKET_ERROR == ret))
{
AfxMessageBox("connect fail");
closesocket(m_sock);
}
为什么会连接不上呢? 报出的错误号是:WSAEWOULDBLOCK(10035)
看了好多书和示例程序,都这样做的,为什么我的这段程序就不行。
郁闷好久了,求教各位大虾,请不吝赐教。
若觉得分不够,可以再开贴加分!
结束时要WSACleanup()
WSADATA wsaData;
int ret = WSAStartup(0x202, &wsaData);
if (0 != ret)
{
AfxMessageBox("startup fail");
return FALSE;
}
if (wsaData.wVersion != 0x202)
{
AfxMessageBox("version wrong!");
return FALSE;
}
在Dialog的OnDestroy里面: WSACleanup();
包含的头文件是<winsock2.h> (在StdAfx.h中包含)
引用的库文件是 ws2_32.lib
大虾们,帮忙看看,问题到底出在什么地方啊?郁闷啊!
也可以在Connect()调用之后等待CAsyncSocket::OnConnect()事件被触发,这是推荐的方法,CAsyncSocket::OnConnect()是要表明Socket要么连接成功了,要么连接彻底失败了。至此,我们在CAsyncSocket::OnConnect()被调用之后就知道是否Socket连接成功了,还是失败了。
int ret = WSAAsyncSelect(m_socksvr, m_hWnd, WM_SOCKET,
FD_READ | FD_WRITE | FD_ACCEPT);
if (SOCKET_ERROR == ret)
{
AfxMessageBox("Select");
closesocket(m_socksvr);
m_socksvr = NULL;
return;
}
移到bind后面看一下
accept立即返回错误,connect也立即返回错误。
之后就不停得弹出“Accept fail”对话框(如楼顶源码),
按热启动键都没反映(WIN2000),只好关电源了。
其实这段代码小弟是基本照搬了一个示例程序的代码,所不同的是示例中没有用MFC窗体,我懒得写API去做界面了,就这些不一样,怎么他那个就行,我这个却不行?
郁闷,尴尬。。
请各位大虾多多赐教啊,分数的事好说!
{
CSockSvrDlg *pDlg = (CSockSvrDlg *)pParam;
pDlg->m_csock = accept(pDlg->m_socksvr,
(sockaddr FAR *)&caddr,
&addlen);
if ((NULL == pDlg->m_csock) || (SOCKET_ERROR == pDlg->m_csock))
{
AfxMessageBox("Accept fail");
pDlg->m_csock = NULL;
}
return 0;
}可是一旦这个线程开始执行,ACCEPT函数马上就返回错误这就让人非常费解了。
m_hWnd正确吗?
因为你没有把端口转换成网络字节顺序。saddr.sin_port = 10001;
=============
改为:saddr.sin_port = htons(10001);svraddr.sin_port = 10001;
==============================
改为:svraddr.sin_port = htons(10001);
你有没有把这个WM_SOCKET消息影射到接收函数(recieve)什么的呀?
ON_MESSAGE(WM_SOCKET,OnReceive)
你把服务端程序移到本机上来调试吧!
客户端选择消息要加一条FD_CONNECT:
WSAAsyncSelect(m_sock, m_hWnd, WM_SOCKET,FD_READ | FD_WRITE|FD_CONNECT);
在响应FD_CONNECT消息时,调用select判断是否已经连接:
fd_set curset;
struct timeval waittime;
waittime.tv_sec=0;
waittime.tv_usec=0;
FD_ZERO(&curset);
FD_SET(this->clientsocket,&curset);
sprintf(tmpchar,"已经连接上了,当前SOCKET 是%d",(int)CurSock);
//curset.
int ret=select(NULL,NULL,&curset,NULL,&waittime);
if(ret==0)
{
//sprintf(tmpchar,"已经连接上了,当前SOCKET 是%d",(int)CurSock);
this->SetDlgItemText(IDC_STATICSTATE,"连接失败!");
this->connected=false;
m_connect.EnableWindow();
return;
}
else
{
if(ret==SOCKET_ERROR)
{
this->Showerror();
this->SetDlgItemText(IDC_STATICSTATE,"连接失败!");
m_connect.EnableWindow();
return;
}
}
还有:
accept()失败后服务端会不停地收到FD_ACCEPT直到接受连接!!
所以如果还不行的话,将服务端的WSAAsyncSelect放到bind后面
客户端和服务器端都有加htons的,我一直都是在本地调试的服务端与客户端。to tgame(从此醉):
我把您写的这段代码加到客户端的FD_CONNECT消息处理过程中了,connect函数仍然立即返回错误,跟踪进这段代码中,发现没有出现什么异常,顺利执行完毕。select函数返回1。但是服务端程序死了,也没有弹出“Accept fail”提示,不知还有什么没发现的问题,请赐教!
(10014)
Bad address.
The system detected an invalid pointer address in attempting to use a pointer argument of a call. This error occurs if an application passes an invalid pointer value, or if the length of the buffer is too small. For instance, if the length of an argument which is a struct sockaddr is smaller than sizeof(struct sockaddr).
sockaddr_in clientaddr;
int addr_len=sizeof(sockaddr_in);
accept(this->ServerSocket,(struct sockaddr FAR *)&(clientaddr),&addr_len);
试试看
(MSVCRTD.DLL) 0xC0000005:Access Violation.就一条语句: return 0;
要不您给我个邮箱,我把全部代码发给您看看,您帮着改改,再发回给我。[email protected](这是在下的邮箱)不知您意下如何?
去掉