mfc中用TCP/IP socket编程来写了一个简单的收发端,可客户端的accept()老连接不上
发端的发送代码:voidCMyChatDlg::OnButton1(){//TODO:AddyourcontrolnotificationhandlercodehereD...
发端的发送代码:
void CMyChatDlg::OnButton1()
{
// TODO: Add your control notification handler code here
DWORD dwIP;
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP);
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.0.124");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(8005);
int retval=connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
if(SOCKET_ERROR==retval)
{
closesocket(sockClient);
MessageBox("连接失败!");
}
CString strSend;
GetDlgItemText(IDC_EDIT1,strSend);
send(sockClient,strSend,strlen(strSend)+1,0);
SetDlgItemText(IDC_EDIT1,"");
closesocket(sockClient);
WSACleanup();
}
收端的接收代码:
void CMyRecvDlg::OnChangeEditRecv()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(8005);
bind(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockClient,5);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET sockConn=accept(sockClient,(SOCKADDR*)&addrClient,&len);
char recvBuf1[50],recvBuf2[50];
recv(sockConn,recvBuf1,50,0);
sprintf(recvBuf2,"%s\n",recvBuf1);
CString s=(char*)recvBuf2;
GetDlgItemText(IDC_EDIT_RECV,s);
closesocket(sockConn);
}
}
发端运行到accept()那就运行不下去了..就弹出提示窗口.. 展开
void CMyChatDlg::OnButton1()
{
// TODO: Add your control notification handler code here
DWORD dwIP;
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwIP);
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("192.168.0.124");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(8005);
int retval=connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
if(SOCKET_ERROR==retval)
{
closesocket(sockClient);
MessageBox("连接失败!");
}
CString strSend;
GetDlgItemText(IDC_EDIT1,strSend);
send(sockClient,strSend,strlen(strSend)+1,0);
SetDlgItemText(IDC_EDIT1,"");
closesocket(sockClient);
WSACleanup();
}
收端的接收代码:
void CMyRecvDlg::OnChangeEditRecv()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CDialog::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
// TODO: Add your control notification handler code here
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(8005);
bind(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
listen(sockClient,5);
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1)
{
SOCKET sockConn=accept(sockClient,(SOCKADDR*)&addrClient,&len);
char recvBuf1[50],recvBuf2[50];
recv(sockConn,recvBuf1,50,0);
sprintf(recvBuf2,"%s\n",recvBuf1);
CString s=(char*)recvBuf2;
GetDlgItemText(IDC_EDIT_RECV,s);
closesocket(sockConn);
}
}
发端运行到accept()那就运行不下去了..就弹出提示窗口.. 展开
2个回答
展开全部
你的意思是不是服务端卡在accept()那,然后客户端弹出“连接失败!”窗口?
如果是这样的话先检查网络连接是否正常,然后IP是不是对的
如果以上都没问题,用WSAGetLastError()得到错误代码并在MessageBox()中显示。
另外发现你用阻塞方式收发数据,最好将这两段代码放入新线程,否则容易卡死
附上WSAGetLastError()错误代码:
WSAENOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。
WSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。
WSAEADDRINUSE:所指的地址已在使用中。
WSAEINTR:通过一个WSACancelBlockingCall()来取消一个(阻塞的)调用。
WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。
WSAEADDRNOTAVAIL:在本地机器上找不到所指的地址。
WSAENOTSUPPORT:所指族中地址无法与本套接口一起使用。
WSAECONNREFUSED:连接尝试被强制拒绝。
WSAEDESTADDREQ:需要目的地址。
WSAEFAULT:namelen参数不正确。
WSAEINVAL:套接口没有准备好与一地址捆绑。
WSAEISCONN:套接口早已连接。
WSAEMFILE:无多余文件描述字。
WSAENETUNREACH:当前无法从本主机访问网络。
WSAENOBUFS:无可用缓冲区。套接口未被连接。
WSAENOTSOCK:描述字不是一个套接口。
WSAETIMEOUT:超时时间到。
WSAEWOULDBLOCK:套接口设置为非阻塞方式且连接不能立即建立。可用select()调用对套接口写,因为select()时会进行连接。
希望对你有帮肋..
如果是这样的话先检查网络连接是否正常,然后IP是不是对的
如果以上都没问题,用WSAGetLastError()得到错误代码并在MessageBox()中显示。
另外发现你用阻塞方式收发数据,最好将这两段代码放入新线程,否则容易卡死
附上WSAGetLastError()错误代码:
WSAENOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。
WSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。
WSAEADDRINUSE:所指的地址已在使用中。
WSAEINTR:通过一个WSACancelBlockingCall()来取消一个(阻塞的)调用。
WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。
WSAEADDRNOTAVAIL:在本地机器上找不到所指的地址。
WSAENOTSUPPORT:所指族中地址无法与本套接口一起使用。
WSAECONNREFUSED:连接尝试被强制拒绝。
WSAEDESTADDREQ:需要目的地址。
WSAEFAULT:namelen参数不正确。
WSAEINVAL:套接口没有准备好与一地址捆绑。
WSAEISCONN:套接口早已连接。
WSAEMFILE:无多余文件描述字。
WSAENETUNREACH:当前无法从本主机访问网络。
WSAENOBUFS:无可用缓冲区。套接口未被连接。
WSAENOTSOCK:描述字不是一个套接口。
WSAETIMEOUT:超时时间到。
WSAEWOULDBLOCK:套接口设置为非阻塞方式且连接不能立即建立。可用select()调用对套接口写,因为select()时会进行连接。
希望对你有帮肋..
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询