首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

Socket客户端和服务器联接

2012-10-25 
Socket客户端和服务器连接问题是这样的,我用VC6.0写了客户端程序和服务器程序,并设定了本机IP地址,尝试着

Socket客户端和服务器连接
问题是这样的,我用VC6.0写了客户端程序和服务器程序,并设定了本机IP地址,尝试着先打开服务器程序,并用客户端去连接。但是,当客户程序执行到了connect()函数时,总是报错“连接失败!”想请教哪位高手帮忙看看是什么原因?
客户端程序:
// Client.cpp : 定义控制台应用程序的入口点。
//
#include <iostream.h>
#include <winsock2.h>
#pragma comment(lib,"ws2_32.lib")
#define client_port 27015

int main()
{
WSADATA wsData;
int iResult = WSAStartup(MAKEWORD(2,0),&wsData);
if (iResult != NO_ERROR)
{
cout<<"Error at WSAStartup()\n";
}
//创建连接到服务器的SOCKET对象
SOCKET ConnetSocket;
ConnetSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if (ConnetSocket==INVALID_SOCKET)
{
cout<<"Error at socket():\n";
WSACleanup();
return 0;
}
//构建地址信息
sockaddr_in clientService;
clientService.sin_family = AF_INET;
clientService.sin_addr.s_addr = inet_addr("10.101.31.28");
clientService.sin_port = htons(client_port);

if (connect(ConnetSocket,(SOCKADDR*)&clientService,sizeof(clientService))==SOCKET_ERROR)
{
cout<<"Failed to connect!\n";
WSACleanup();
return 0;
}
//声明和初始化变量
int bytesent;
int bytesRecv = SOCKET_ERROR;
char sendbuf[32] = "Client:sending data.";
char recvbuf[32] = "";
//发送数据
bytesent = send(ConnetSocket,sendbuf,strlen(sendbuf),0);
cout<<"Byte sent: "<<bytesent<<"\n";

//接收数据
while (bytesRecv!=SOCKET_ERROR)
{
bytesRecv = recv(ConnetSocket,recvbuf,32,0);
if (bytesRecv==0||bytesRecv ==WSAECONNRESET)
{
cout<<"connection closed.\n";
break;
}
cout<<"Byte recv:"<<recvbuf<<endl;
}
WSACleanup();
system("pause");
return 0;
}

服务器端程序如下:
// Server.cpp : 定义控制台应用程序的入口点。
//

//#include "stdafx.h"
#include <iostream.h>
#include <winsock2.h>
#include <stdlib.h>
#pragma comment(lib,"ws2_32.lib")
#define Buf_size100//最大文件传输量
#define Lisen_N1//等待连接队列的最大长度

int main()
{
//初始化Socket()
char buf[Buf_size];//接收缓冲区大小
WSAData dw;
if(WSAStartup(MAKEWORD(2,2),&dw)!=0)
{
cout<<"WSOCKET can not be startup!\n";
return 0;
}
//创建用于侦听的套接字s
SOCKET s = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(s == SOCKET_ERROR)
{
cout<<"SOCKET can not be created\n";
WSACleanup();
return 0;
}
//////////////////////////////////////bind函数
struct sockaddr_in addr;
int addr_len = sizeof(struct sockaddr_in);
int port = 9990;//端口号
int errcode;
//服务器地址
addr.sin_family = AF_INET;//地址家族
addr.sin_port = htons(port);//端口
addr.sin_addr.s_addr = (INADDR_ANY);//地址格式表明是在本地任意地址(0.0.0.0)上进行侦听

errcode = bind(s,(SOCKADDR*)&addr,addr_len);
if(errcode == SOCKET_ERROR)
{
cout<<"绑定失败\n";
closesocket(s);
WSACleanup();
return -1;
}

////////////////////////////////////////////////监听函数listen()
errcode = listen(s,Lisen_N);
if(errcode!=SOCKET_ERROR)
{
cout<<"监听失败!\n";
closesocket(s);
WSACleanup();
return -1;
}

//////////////////////////////////////////////接受接入accept()
cout<<"Tcp Server start\n";
SOCKET SockAccept;//执行接受函数后用于实际通信的socket实体
struct sockaddr_in from;//用于接收介入地址
int len = sizeof(from);//接入地址的长度

SockAccept = accept(s,(SOCKADDR*)&from,&len);
if(SockAccept == INVALID_SOCKET)
{
cout<<"accept failed:\n";
closesocket(s);
WSACleanup();
return 0;
}
//////////////////////////////////////////////////////////////接受数据


//循环接收数据,知道客户端输入quit结束
while (TRUE)
{
ZeroMemory(buf,Buf_size);//清空缓冲区
if (recv(SockAccept,buf,Buf_size,0)==SOCKET_ERROR)
{
cout<<"recv failed!\n";
closesocket(SockAccept);
closesocket(s);
WSACleanup();
return 0;
}
SYSTEMTIME st;
GetLocalTime(&st);

cout<<st.wYear<<"-"<<st.wMonth<<"-"<<st.wDay<<" "<<st.wHour<<":"<<st.wMinute<<":"<<st.wSecond;
cout<<"Recv from client"<<inet_ntoa(from.sin_addr)<<":"<<from.sin_port<<buf<<endl;
if (strcmp(buf,"quit")==0)
{
int re;
re = send(SockAccept,"quit",strlen("quit"),0);
break;
}
else
{
char msg1[Buf_size];
strcmp(msg1,buf);

int re;
re = send(SockAccept,msg1,strlen(msg1),0);//向客户端会送
if (re ==SOCKET_ERROR)
{
cout<<"send failde\n";
closesocket(SockAccept);
closesocket(s);
WSACleanup();
return 0;
}
}
}

if(WSACleanup()!=0)
{
cout<<"WSOCKET can not be clean up!\n";
}
system("pause\n");
return 0;
}

[解决办法]
客户端连接的端口号与服务器端绑定的端口号就不是一个
楼主在socket操作失败时,可以用WSAGetLastError看看错误码是什么

热点排行