照着书上的例子写了个简单的聊天工具, 用socket连接就失败了, 大家帮我看看SOCKET m_socket;
//在InitInstance()里
WSADATA wsd;
int error = WSAStartup( MAKEWORD(2,2), &wsd );
if( error != 0 )
{
AfxMessageBox("初始失败");
return FALSE;
}
if( LOBYTE( wsd.wVersion ) != 2 ||
HIBYTE( wsd.wVersion ) != 2)
{
AfxMessageBox("版本有误!");
WSACleanup();
return FALSE;
}
//在OnInitDialog()里
m_socket = socket( AF_INET, SOCK_STREAM,0 );//连接按纽响应函数OnConn()
UpdateData( TRUE );
sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons( m_Serverprot ); //取得端口(我填123,不太理解端口的意义)--UINT类型Edit变量
serveraddr.sin_addr.S_un.S_addr = inet_addr( m_Serverip );//取得IP(我填本机的IP) --CString类型Edit变量
if(connect(m_socket, (sockaddr *)&serveraddr, sizeof(serveraddr))!=0)
{
AfxMessageBox("连接失败");
return;
}else
AfxMessageBox("连接成功");连接失败-- 初学SOCKET不清楚哪里出错了,希望大家给点意见..
//在InitInstance()里
WSADATA wsd;
int error = WSAStartup( MAKEWORD(2,2), &wsd );
if( error != 0 )
{
AfxMessageBox("初始失败");
return FALSE;
}
if( LOBYTE( wsd.wVersion ) != 2 ||
HIBYTE( wsd.wVersion ) != 2)
{
AfxMessageBox("版本有误!");
WSACleanup();
return FALSE;
}
//在OnInitDialog()里
m_socket = socket( AF_INET, SOCK_STREAM,0 );//连接按纽响应函数OnConn()
UpdateData( TRUE );
sockaddr_in serveraddr;
serveraddr.sin_family = AF_INET;
serveraddr.sin_port = htons( m_Serverprot ); //取得端口(我填123,不太理解端口的意义)--UINT类型Edit变量
serveraddr.sin_addr.S_un.S_addr = inet_addr( m_Serverip );//取得IP(我填本机的IP) --CString类型Edit变量
if(connect(m_socket, (sockaddr *)&serveraddr, sizeof(serveraddr))!=0)
{
AfxMessageBox("连接失败");
return;
}else
AfxMessageBox("连接成功");连接失败-- 初学SOCKET不清楚哪里出错了,希望大家给点意见..
解决方案 »
- 诚求一个能改换 static 控件的背景函数思路!!!!!(急)
- windows嵌套锁
- socket传输文件
- 指针函数问题,函数里调用不同函数(参数不同)
- 求助——如何将double型的数据截取小数点后一位存入数据库
- 有关在Richedit中向上文本搜索的问题
- 入门级算法书, (C编写)??
- 紧急求教:如何去除或遮盖MSFLEXGRID控件的某一单元格的下格线或上格线。
- About "Windows is now restarting..."100分!
- 有关建立树视图的问题。
- 一个自动发贴机的源代码,有个奇怪问题,请高手指教,下载地址:
- ADO如何读取ACCESS数据库OLE字段(word文档)?
不知你填的端口和本机地址iP是怎么填的 本机IP为127.0.0.1端口一般写个6000客服端和服务端要一样端口
IP 192.168.105.77
PROT 123
这样填的
比如,你客户端程序要连接127.0.0.1地址,端口号是6060,则服务器上必须有一个监听6060端口的程序,才能建立连接。
另外,你那是不是是不是不支持2.2版本的套接字库啊
将你的套接字库版本放低试试,换成1.1版本的
int error = WSAStartup( MAKEWORD(1,1), &wsd );
if( error != 0 )
{
AfxMessageBox("初始失败");
return FALSE;
}
if( LOBYTE( wsd.wVersion ) != 1 ||
HIBYTE( wsd.wVersion ) != 1)
{
AfxMessageBox("版本有误!");
WSACleanup();
return FALSE;
}
2。命令行下netstat -a,看你的端口是否是listening,确定服务器是否启动成功
另外,你那可能不支持套接字库2.2版本,改为1.1版本的试试看
先运行服务器,在运行客户端int error = WSAStartup( MAKEWORD(1,1), &wsd );
if( error != 0 )
{
AfxMessageBox("初始失败");
return FALSE;
}
if( LOBYTE( wsd.wVersion ) != 1 ||
HIBYTE( wsd.wVersion ) != 1)
{
AfxMessageBox("版本有误!");
WSACleanup();
return FALSE;
}
一定要先运行服务器端,再运行客户端,我也是刚学的,但我的运行成功!
下面的是客户端:#include "Winsock2.h"
#include "stdio.h"void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err; wVersionRequested = MAKEWORD(1,1); err = WSAStartup(wVersionRequested,&wsaData);
if(err != 0)
{
return;
} if(LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return;
} SOCKET sockClient = socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrSrv;
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(5000);
addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); connect(sockClient,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR)); char recvBuf[100];
memset(recvBuf,0,sizeof(recvBuf));
recv(sockClient,recvBuf,100,0);
printf("%s\n",recvBuf); char sendBuf[100];
memset(sendBuf,0,sizeof(sendBuf));
sprintf(sendBuf,"我是张帅帅!");
send(sockClient,sendBuf,strlen(sendBuf),0); closesocket(sockClient);
WSACleanup();
}
#include "stdio.h"void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err; wVersionRequested = MAKEWORD(1,1); err = WSAStartup(wVersionRequested,&wsaData);
if(err != 0)
{
return;
} if(LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
{
WSACleanup();
return;
} SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrSrv;
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(5000);
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); bind(sockSrv,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR));
listen(sockSrv,5); SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR); while(1)
{
SOCKET sockConn = accept(sockSrv,(SOCKADDR*)&addrClient,&len); char sendBuf[100];
memset(sendBuf,0,sizeof(sendBuf));
sprintf(sendBuf,"欢迎%s来到勇哥聊天室!",inet_ntoa(addrClient.sin_addr));
send(sockConn,sendBuf,strlen(sendBuf),0); char recvBuf[100];
memset(recvBuf,0,sizeof(recvBuf));
recv(sockConn,recvBuf,100,0);
printf("%s\n",recvBuf); closesocket(sockConn);
}
}
另外,还得加入win32.dll
#include <stdio.h>void main() //服务器端
{
//步骤1.加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1,1 ); //1.1版本
err = WSAStartup( wVersionRequested, &wsaData ); //加载套接字库(功能1:加载套接字库,功能2:进行套接字库版本协商)
//协商结果放在wsaData中
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( ); //清除资源
return;
} //步骤2:建立socket
SOCKET sockServer = socket(AF_INET,SOCK_DGRAM,0); // //步骤3:bind
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(5000); // bind(sockServer,(sockaddr*)&addrSrv,sizeof(sockaddr));
//步骤4:接收数据
char recvBuff[100];
SOCKADDR_IN addClient;
int len = sizeof(SOCKADDR);
recvfrom(sockServer,recvBuff,100,0,(SOCKADDR*)&addClient,&len);
printf("%s\n",recvBuff);
//步骤5:释放资源
closesocket(sockServer);
WSACleanup();
}客户端代码:在增加一个c++源文件:名字自己取。#include <Winsock2.h>
#include <stdio.h>void main() //客户端
{
//步骤1.加载套接字库
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1,1 ); //1.1版本
err = WSAStartup( wVersionRequested, &wsaData ); //加载套接字库(功能1:加载套接字库,功能2:进行套接字库版本协商)
//协商结果放在wsaData中
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( ); //清除资源
return;
} //步骤2:创建socket
SOCKET sockClient = socket(AF_INET,SOCK_DGRAM,0); //步骤3:发送数据
SOCKADDR_IN addServer;
addServer.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addServer.sin_family=AF_INET;
addServer.sin_port=htons(5000); sendto(sockClient,"Hello",strlen("Hello")+1,0,(SOCKADDR*)&addServer,sizeof(SOCKADDR));
//步骤4:释放资源
closesocket(sockClient);
WSACleanup();
}
服务器端要先启动,客户端后启动。
另外需要在project-settings-link中的Object/library module的输入框的最后增加ws2_32.lib