我在本机上写了客户端和服务器的程序,测试可以连接和接收数据,而在两台局域网内,当客户端输入主机IP时
却说连接出错
代码如下:
server端:
int status;
sockServ = socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addSrv;
//htonl将一个u_long类型的值从主机字节顺序转换为TCP/IP网络字节顺序
addSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addSrv.sin_family = AF_INET;
//htons将一个u_short类型的值从主机字节顺序转换为TCP/IP网络字节顺序
addSrv.sin_port = htons(9741); status = bind(sockServ,(SOCKADDR *)&addSrv,sizeof(SOCKADDR));
if(status !=0)
return FALSE;
//将套接字设为监听模式
status = listen(sockServ,5);
if(status !=0)
return FALSE;
client端:
int msgsock;
sockClient = socket(AF_INET,SOCK_STREAM,0);
if (sockClient < 0)
{
MessageBox(0,"scoker err",
"err",MB_OK);
return FALSE;
}
SOCKADDR_IN addrServ;
addrServ.sin_addr.S_un.S_addr = inet_addr("192.168.1.6");//服务器端IP地址
addrServ.sin_family = AF_INET;
addrServ.sin_port = htons(9741);
//向服务器发送请求
msgsock=connect(sockClient,(SOCKADDR *)&addrServ,sizeof(SOCKADDR));
if (msgsock!=0) {
MessageBox(0,"connect err",
"not lind",MB_OK);我想问问大家这是什么原因???我把防火墙都关了,是不是端口的问题?
却说连接出错
代码如下:
server端:
int status;
sockServ = socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addSrv;
//htonl将一个u_long类型的值从主机字节顺序转换为TCP/IP网络字节顺序
addSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addSrv.sin_family = AF_INET;
//htons将一个u_short类型的值从主机字节顺序转换为TCP/IP网络字节顺序
addSrv.sin_port = htons(9741); status = bind(sockServ,(SOCKADDR *)&addSrv,sizeof(SOCKADDR));
if(status !=0)
return FALSE;
//将套接字设为监听模式
status = listen(sockServ,5);
if(status !=0)
return FALSE;
client端:
int msgsock;
sockClient = socket(AF_INET,SOCK_STREAM,0);
if (sockClient < 0)
{
MessageBox(0,"scoker err",
"err",MB_OK);
return FALSE;
}
SOCKADDR_IN addrServ;
addrServ.sin_addr.S_un.S_addr = inet_addr("192.168.1.6");//服务器端IP地址
addrServ.sin_family = AF_INET;
addrServ.sin_port = htons(9741);
//向服务器发送请求
msgsock=connect(sockClient,(SOCKADDR *)&addrServ,sizeof(SOCKADDR));
if (msgsock!=0) {
MessageBox(0,"connect err",
"not lind",MB_OK);我想问问大家这是什么原因???我把防火墙都关了,是不是端口的问题?
解决方案 »
- 关于二级指针的问题
- VC6.0编译错误
- 将普通dll包成com组件dll时遇到的问题
- 如何动态改变静态文本控件的内容??
- 请问如何编程获得显示器物理尺寸等参数?
- 诸位,我找到有的源代码,编译的时候发现提示中有欢迎使用。。。。字样,请问怎么加到工程中的
- 我的程序在Build后显示这个错误:unexpected end of file while looking for precompiled header directive什么原因?如何解决?Thanks!
- 进程权限问题(比较难)不好解决啊
- 分享win32+数据结构算法的书
- 网上语音聊天是如何做的?
- _RecordsetPtr获得记录数出问题
- 编写的smtp client连不上126.com的smtp服务器,connect超时
服务器端accept: SOCKADDR_IN addClient;
int len = sizeof(SOCKADDR);
try
{
//while (1) {
//等待客户请求到来
sockConn = accept(sockServ,(SOCKADDR *)&addClient,&len);
if(sockConn<0)
{
closesocket(sockServ);
return FALSE;
}
服务器端刚开始监听就被你关掉了,仔细看一下下面的代码,和你的比较比较,这是sdk文档里的代码
SOCKET AcceptSocket; printf( "Waiting for a client to connect...\n" );
while (1) {
AcceptSocket = SOCKET_ERROR;
while ( AcceptSocket == SOCKET_ERROR ) {
AcceptSocket = accept( m_socket, NULL, NULL );
}
printf( "Client Connected.\n");
m_socket = AcceptSocket;
break;
}
HWND hwnd = ((RECVPARAM *)lpParameter)->threadHwnd;
delete lpParameter;
while (true)
{
if(!AcceptData())//在这里调用accept
{
WSACleanup();
exit(1);
}
if (!GetData(tempHwnd))
{
if(!InitSock())
return 0;
if(!Accept())//这里是调用listen监听的,
return 0;
}
closesocket(sockConn);
}
return 0;
if(sockConn<0)
{
closesocket(sockServ);
return FALSE;
}
比如你第一次进入监听状态,外部没有给它发送连接请求,这时候返回的是-1你的程序关闭了sockServ
你是循环监听第二次程序又进入了accept状态,可是这时候sockServ已经被你关闭了你再 accept(sockServ,(SOCKADDR *)&addClient,&len);
还有用嘛
WORD wVersionRequested;//版本号
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );//1.1版本的套接字
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}//加载套接字库,加裁失败则返回
小弟初学,请dch4890164大大赐教啊
msgsock=connect(sockClient,(SOCKADDR *)&addrServ,sizeof(SOCKADDR));
if (msgsock!=0) {
MessageBox(0,"connect err",
"not lind",MB_OK);////客户端执行到这里弹出该提示,就这个错误了
}
HWND hwnd = ((RECVPARAM *)lpParameter)->threadHwnd;
delete lpParameter;
呵呵看你的程序我快得多疑症了,这我怎么感觉有问题,你删除了lpParameter你的这个hwnd 还有效嘛
虽然是值拷贝,但是怎么感觉这么悬呢
if(!AcceptData())//在这里调用accept
{
WSACleanup();
exit(1);
}
if (!GetData(tempHwnd))
{
if(!InitSock())
return 0;
if(!Accept())//这里是调用listen监听的,
return 0;
}
如果每次监听失败,你的程序都能保证进入第二个if嘛,如果进入不了,你的AcceptData也就没有意义了,因为你包是无效的
还有本地和远程的时候,处理速度是不一样的,你的程序实在是乱,看不出思路
=========================================================================
还有就是你只要接受失败就重新创建,这个效率是不是太低了,你想如果client的connect只连接一次
如果正好赶上你销毁的过程中,它可能连上嘛
如果假设你所有的程序都没有错误的话,你的程序连上的最大可能就是你这边刚进入接收,那边正好connect
这个效率是不是有些低啊,为什么不能用一个包一直在那里accept呢