用c++编写支持网络功能的程序
1个回答
展开全部
封装了如下SOCKET函数,其实使用也挺简单的:
1。客户端函数:
#include<stdlib.h>
#include<winsock.h>
#include<stdio.h>
#include<string.h>
#ifndef INADDR_NONE
#define INADDR_NONE 0xffffffff
#endif
//******************************************************
//
//本函数负责与服务平台联系
//
//******************************************************
SOCKET SocketConnect(const char *host,const char *service,const char *transport)
{
struct protoent *protoin;//传输协议信息
struct sockaddr_in ipaddr;//主机的IP地址信息
struct hostent *hostin;//主机的信息
struct servent *servin;//服务器(主机)信息
int sock,type;//套接字描述符
//将ipaddr结构快速清零
memset(&ipaddr,0,sizeof(ipaddr));
//地址结构
ipaddr.sin_family=AF_INET;
//从服务器类型得到端口号
if(servin=getservbyname(service,transport))
ipaddr.sin_port=servin->s_port;//端口号
else
if((ipaddr.sin_port=htons((u_short)atoi(service)))==0)
{
printf("get server information error/n");
WSACleanup();
return INVALID_SOCKET;
}
//由传输协议得到对应的传输协议编码
if((protoin=getprotobyname(transport))==0)
{
printf("get protocol information error/n");
WSACleanup();
return INVALID_SOCKET;
}
//从主机名获取主机IP
if(hostin=gethostbyname(host))
memcpy(&ipaddr.sin_addr,hostin->h_addr,hostin->h_length);////
else
if((ipaddr.sin_addr.s_addr=inet_addr(host))==INADDR_NONE)
{
printf("get host IP infomation error/n");
WSACleanup();
return INVALID_SOCKET;
}
//根据传输类型给变量赋值
if(strcmp(transport,"udp")==0)
type=SOCK_DGRAM;
else
type=SOCK_STREAM;
//创建套接字描述符
sock=socket(PF_INET,type,protoin->p_proto);
if(sock==INVALID_SOCKET)
{
printf("creat socket error/n");
WSACleanup();
return INVALID_SOCKET;
}
//连接指定IP地址机器的指定服务端口,如果连接失败,则退出
if(connect(sock,(struct sockaddr*)&ipaddr,sizeof(ipaddr))==SOCKET_ERROR)
{
printf("connect socket error!please start server first/n");
WSACleanup();
return INVALID_SOCKET;
}
return sock;
}
//************************************
//UDP传输类型
//************************************
SOCKET UDPConnect(const char *host,const char *service)
{
return SocketConnect(host,service,"udp");
}
//************************************
//TCP传输类型
//************************************
SOCKET TCPConnect(const char *host,const char *service)
{
return SocketConnect(host,service,"tcp");
}
2。客户端函数调用例子(TCP):
//启动程序后即连接服务器,连接成功后接收控制台输入,发送到服务端
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<winsock.h>
#pragma comment(lib,"wsock32")
#ifndef INADDR_NONE
#define INADDR_NONE 0xffffffff
#endif
SOCKET TCPConnect(const char*,const char*);
void TCPecho(char *,char*);
#define LINELEN 128
#define WAVERS MAKEWORD(2,0)//WORD MAKEWORD(byte bLow,byte bHigh);
void main(int argc,char *argv[])
{
char *host="localhost";//IP 地址
char *service="3333";//默认端口号
WSADATA wsadata;
switch(argc)
{
case 1:
host="localhost";//使用默认IP
break;
case 2:
host=argv[1];//使用命令行给的IP
break;
case 3:
host=argv[1];
service=argv[2];//使用命令行IP和端口号
break;
default:
printf("argment error/n");
exit(1);
}
if(WSAStartup(WAVERS,&wsadata)!=0)//初始化Winsock
{
printf("initalize failed/n");
WSACleanup();//清除Winsock
exit(1);
}
TCPecho(host,service);
WSACleanup();
exit(0);
}
void TCPecho(char *host,char *service)
{
char buf[LINELEN+1];
SOCKET s;
int outchars;
s=TCPConnect(host,service);//采用TCP协议连接服务程序
while(fgets(buf,sizeof(buf),stdin))//循环调用得到用户输入,当输入的数据为回车时退出
{
buf[LINELEN]='/0';
outchars=strlen(buf);
send(s,buf,outchars,0);//发送消息
if(buf[0]=='/n')
break;
}
closesocket(s);
}
3。服务端函数:
#include<string.h>
#include<winsock.h>
#include<stdlib.h>
#include<stdio.h>
//
//SocketServer
//
SOCKET SocketServer(const char *service,const char*transport,int qlen)
{
struct sockaddr_in ipaddr;//主机IP地址
struct servent *servin;// 主机信息
struct protoent *protoin;//传输类型
int sock,type;// 套接字描述符
memset(&ipaddr,0,sizeof(ipaddr));
ipaddr.sin_family=AF_INET;
ipaddr.sin_addr.s_addr=INADDR_ANY;
// 从服务器名得到服务端口
if(servin=getservbyname(service,transport))
ipaddr.sin_port=htons(ntohs((u_short)servin->s_port));
else
if((ipaddr.sin_port=htons((u_short)atoi(service)))==0)
{
printf("get portnumber error/n");
WSACleanup();
return INVALID_SOCKET;
}
//从传输协议得到对应的编号
if((protoin=getprotobyname(transport))==0)
{
printf("get protocol number error/n");
WSACleanup();
return INVALID_SOCKET;
}
//根据传输协议给对应的变量赋值
if(strcmp(transport,"udp")==0)
type=SOCK_DGRAM;
else
type=SOCK_STREAM;
//创建套接字
sock=socket(PF_INET,type,protoin->p_proto);
if(sock==INVALID_SOCKET)
{
printf("creat socket error/n");
WSACleanup();
return INVALID_SOCKET;
}
//绑定本地IP
if(bind(sock,(struct sockaddr*)&ipaddr,sizeof(ipaddr))==SOCKET_ERROR)
{
printf("socket bind error/n");
WSACleanup();
return SOCKET_ERROR;
}
//如果是流式传输(TCP)使套接字处于监听状态,等待来自客户机的连接,参数qlen之指定等待
//队列长度
if(type==SOCK_STREAM)
{
if(listen(sock,qlen)==SOCKET_ERROR)
{
printf("socket listen errror/n");
WSACleanup();
return SOCKET_ERROR;
}
}
return sock;
}
//************************************
//UDPServer
//************************************
SOCKET UDPServer(const char *service)
{
return SocketServer(service,"udp",0);
}
//************************************
//TCPServer
//************************************
SOCKET TCPServer(const char *service,int qlen)
{
return SocketServer(service,"tcp",qlen);
}
4。服务器例子(TCP):
//接受客户端连接,每接收到客户端发送而来的数据则打印在控制台
#include<winsock.h>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#pragma comment(lib,"wsock32")
#define QLEN 5
#define BUFSIZE 5
#define WAVERS MAKEWORD(2,0)//WORD MAKEWORD(byte bLow,byte bHigh);
SOCKET TCPServer(const char*service,int qlen);
void main(int argc,char*argv[])
{
char *service="3333";//默认端口号
struct sockaddr_in fsin;
SOCKET msock,ssock;
WSADATA wsadata;
int alen,cc;
char buf[BUFSIZE];
switch(argc)
{
case 1:
break;//采用默认端口号
case 2:
service=argv[1];//采用命令行端口号
break;
default:
printf("argment error/n");
exit(1);
}
if(WSAStartup(WAVERS,&wsadata)!=0)//初始化Winsock
{
printf("initalize failed/n");
WSACleanup();//清除Winsock
exit(1);
}
msock=TCPServer(service,QLEN);//采用TCP协议
while(1)
{
alen=sizeof(struct sockaddr);
ssock=accept(msock,(struct sockaddr*)&fsin,&alen);//accept阻塞接收客户端请求
if(ssock==INVALID_SOCKET)
{
printf("initialize failed/n");
WSACleanup();
exit(1);
}
while(cc=recv(ssock,buf,sizeof(buf)-1,0))//接收客户端信息,当收到的信息为零时,则退出
{
buf[cc]='/0';
printf("%s",buf);
}
printf("connect close...");
closesocket(ssock);
break;
}
}
以上是两个完整的客户端和服务端程序,可建立两个VC控制台工程编译运行,进行连接测试。
1。客户端函数:
#include<stdlib.h>
#include<winsock.h>
#include<stdio.h>
#include<string.h>
#ifndef INADDR_NONE
#define INADDR_NONE 0xffffffff
#endif
//******************************************************
//
//本函数负责与服务平台联系
//
//******************************************************
SOCKET SocketConnect(const char *host,const char *service,const char *transport)
{
struct protoent *protoin;//传输协议信息
struct sockaddr_in ipaddr;//主机的IP地址信息
struct hostent *hostin;//主机的信息
struct servent *servin;//服务器(主机)信息
int sock,type;//套接字描述符
//将ipaddr结构快速清零
memset(&ipaddr,0,sizeof(ipaddr));
//地址结构
ipaddr.sin_family=AF_INET;
//从服务器类型得到端口号
if(servin=getservbyname(service,transport))
ipaddr.sin_port=servin->s_port;//端口号
else
if((ipaddr.sin_port=htons((u_short)atoi(service)))==0)
{
printf("get server information error/n");
WSACleanup();
return INVALID_SOCKET;
}
//由传输协议得到对应的传输协议编码
if((protoin=getprotobyname(transport))==0)
{
printf("get protocol information error/n");
WSACleanup();
return INVALID_SOCKET;
}
//从主机名获取主机IP
if(hostin=gethostbyname(host))
memcpy(&ipaddr.sin_addr,hostin->h_addr,hostin->h_length);////
else
if((ipaddr.sin_addr.s_addr=inet_addr(host))==INADDR_NONE)
{
printf("get host IP infomation error/n");
WSACleanup();
return INVALID_SOCKET;
}
//根据传输类型给变量赋值
if(strcmp(transport,"udp")==0)
type=SOCK_DGRAM;
else
type=SOCK_STREAM;
//创建套接字描述符
sock=socket(PF_INET,type,protoin->p_proto);
if(sock==INVALID_SOCKET)
{
printf("creat socket error/n");
WSACleanup();
return INVALID_SOCKET;
}
//连接指定IP地址机器的指定服务端口,如果连接失败,则退出
if(connect(sock,(struct sockaddr*)&ipaddr,sizeof(ipaddr))==SOCKET_ERROR)
{
printf("connect socket error!please start server first/n");
WSACleanup();
return INVALID_SOCKET;
}
return sock;
}
//************************************
//UDP传输类型
//************************************
SOCKET UDPConnect(const char *host,const char *service)
{
return SocketConnect(host,service,"udp");
}
//************************************
//TCP传输类型
//************************************
SOCKET TCPConnect(const char *host,const char *service)
{
return SocketConnect(host,service,"tcp");
}
2。客户端函数调用例子(TCP):
//启动程序后即连接服务器,连接成功后接收控制台输入,发送到服务端
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<winsock.h>
#pragma comment(lib,"wsock32")
#ifndef INADDR_NONE
#define INADDR_NONE 0xffffffff
#endif
SOCKET TCPConnect(const char*,const char*);
void TCPecho(char *,char*);
#define LINELEN 128
#define WAVERS MAKEWORD(2,0)//WORD MAKEWORD(byte bLow,byte bHigh);
void main(int argc,char *argv[])
{
char *host="localhost";//IP 地址
char *service="3333";//默认端口号
WSADATA wsadata;
switch(argc)
{
case 1:
host="localhost";//使用默认IP
break;
case 2:
host=argv[1];//使用命令行给的IP
break;
case 3:
host=argv[1];
service=argv[2];//使用命令行IP和端口号
break;
default:
printf("argment error/n");
exit(1);
}
if(WSAStartup(WAVERS,&wsadata)!=0)//初始化Winsock
{
printf("initalize failed/n");
WSACleanup();//清除Winsock
exit(1);
}
TCPecho(host,service);
WSACleanup();
exit(0);
}
void TCPecho(char *host,char *service)
{
char buf[LINELEN+1];
SOCKET s;
int outchars;
s=TCPConnect(host,service);//采用TCP协议连接服务程序
while(fgets(buf,sizeof(buf),stdin))//循环调用得到用户输入,当输入的数据为回车时退出
{
buf[LINELEN]='/0';
outchars=strlen(buf);
send(s,buf,outchars,0);//发送消息
if(buf[0]=='/n')
break;
}
closesocket(s);
}
3。服务端函数:
#include<string.h>
#include<winsock.h>
#include<stdlib.h>
#include<stdio.h>
//
//SocketServer
//
SOCKET SocketServer(const char *service,const char*transport,int qlen)
{
struct sockaddr_in ipaddr;//主机IP地址
struct servent *servin;// 主机信息
struct protoent *protoin;//传输类型
int sock,type;// 套接字描述符
memset(&ipaddr,0,sizeof(ipaddr));
ipaddr.sin_family=AF_INET;
ipaddr.sin_addr.s_addr=INADDR_ANY;
// 从服务器名得到服务端口
if(servin=getservbyname(service,transport))
ipaddr.sin_port=htons(ntohs((u_short)servin->s_port));
else
if((ipaddr.sin_port=htons((u_short)atoi(service)))==0)
{
printf("get portnumber error/n");
WSACleanup();
return INVALID_SOCKET;
}
//从传输协议得到对应的编号
if((protoin=getprotobyname(transport))==0)
{
printf("get protocol number error/n");
WSACleanup();
return INVALID_SOCKET;
}
//根据传输协议给对应的变量赋值
if(strcmp(transport,"udp")==0)
type=SOCK_DGRAM;
else
type=SOCK_STREAM;
//创建套接字
sock=socket(PF_INET,type,protoin->p_proto);
if(sock==INVALID_SOCKET)
{
printf("creat socket error/n");
WSACleanup();
return INVALID_SOCKET;
}
//绑定本地IP
if(bind(sock,(struct sockaddr*)&ipaddr,sizeof(ipaddr))==SOCKET_ERROR)
{
printf("socket bind error/n");
WSACleanup();
return SOCKET_ERROR;
}
//如果是流式传输(TCP)使套接字处于监听状态,等待来自客户机的连接,参数qlen之指定等待
//队列长度
if(type==SOCK_STREAM)
{
if(listen(sock,qlen)==SOCKET_ERROR)
{
printf("socket listen errror/n");
WSACleanup();
return SOCKET_ERROR;
}
}
return sock;
}
//************************************
//UDPServer
//************************************
SOCKET UDPServer(const char *service)
{
return SocketServer(service,"udp",0);
}
//************************************
//TCPServer
//************************************
SOCKET TCPServer(const char *service,int qlen)
{
return SocketServer(service,"tcp",qlen);
}
4。服务器例子(TCP):
//接受客户端连接,每接收到客户端发送而来的数据则打印在控制台
#include<winsock.h>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#pragma comment(lib,"wsock32")
#define QLEN 5
#define BUFSIZE 5
#define WAVERS MAKEWORD(2,0)//WORD MAKEWORD(byte bLow,byte bHigh);
SOCKET TCPServer(const char*service,int qlen);
void main(int argc,char*argv[])
{
char *service="3333";//默认端口号
struct sockaddr_in fsin;
SOCKET msock,ssock;
WSADATA wsadata;
int alen,cc;
char buf[BUFSIZE];
switch(argc)
{
case 1:
break;//采用默认端口号
case 2:
service=argv[1];//采用命令行端口号
break;
default:
printf("argment error/n");
exit(1);
}
if(WSAStartup(WAVERS,&wsadata)!=0)//初始化Winsock
{
printf("initalize failed/n");
WSACleanup();//清除Winsock
exit(1);
}
msock=TCPServer(service,QLEN);//采用TCP协议
while(1)
{
alen=sizeof(struct sockaddr);
ssock=accept(msock,(struct sockaddr*)&fsin,&alen);//accept阻塞接收客户端请求
if(ssock==INVALID_SOCKET)
{
printf("initialize failed/n");
WSACleanup();
exit(1);
}
while(cc=recv(ssock,buf,sizeof(buf)-1,0))//接收客户端信息,当收到的信息为零时,则退出
{
buf[cc]='/0';
printf("%s",buf);
}
printf("connect close...");
closesocket(ssock);
break;
}
}
以上是两个完整的客户端和服务端程序,可建立两个VC控制台工程编译运行,进行连接测试。
追问
不能运行啊
第二个客户端调用
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询