使用c++6.0,基于Socket开发网络音频点播程序。求源码!
使用c++6.0,基于Socket开发网络音频点播程序,服务器端能够捕捉音频流并发送到需要点播的客户端,客户端接收音频流后播放。不同客户端之间可以互相发送文本。求源码!...
使用c++6.0,基于Socket开发网络音频点播程序,服务器端能够捕捉音频流并发送到需要点播的客户端,客户端接收音频流后播放。不同客户端之间可以互相发送文本。
求源码! 展开
求源码! 展开
2个回答
2016-05-15
展开全部
“对图中的那些函数,我这里稍加解释一下。” int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData); 功能是初始化Windows Socket Dll,在Windows下必须使用它。参数:“wVersionRequested”表示版本,可以是1.1、2.2等;“lpWSAData”指向WSADATA数据结构的指针。int socket(int family, int type, int protocol); 功能是建立Socket,返回以后会用到的Socket值。如果错误,返回-1。参数:“int family”参数指定所要使用的通信协议,取以下几个值:AF_UNIX(Unix内部协议)、AF_INET(Internet协议)、AF_NS Xerox(NS协议)、AF_IMPLINK(IMP连接层),在Windows下只能把“AF”设为“AF_INET”;“int type”参数指定套接字的类型,取以下几个值:SOCK_STREAM(流套接字)、SOCK_DGRAM (数据报套接字)、SOCK_RAW(未加工套接字)、SOCK_SEQPACKET(顺序包套接字);“int protocol”参数通常设置为0。int bind(int sockfd, struct sockaddr *my_addr, int addrlen); 功能是把套接字和机器上一定的端口关联起来。参数:“sockfd”是调用socket()返回的套接字值;“my_addr”是指向数据结构struct sockaddr的指针,它保存你的地址,即端口和IP地址信息;“addrlen”设置为sizeof(struct sockaddr)。 int listen(int sockfd, int backlog); 功能是服务端监听一个端口,直到accept()。在发生错误时返回-1。参数:“sockfd”是调用socket()返回的套接字值;“backlog”是允许的连接数目。大多数系统的允许数目是20,也可以设置为5到10。 int connect(int sockfd, struct sockaddr *serv_addr, int addrlen); 功能是客户端连接服务端监听的端口。参数:“sockfd”是调用socket()返回的套接字值;“serv_addr”保存着目的地端口和IP 地址的数据结构struct sockaddr;“addrlen”设置为sizeof(struct sockaddr)。 int accept(int sockfd, void *addr, int *addrlen); 功能是服务端接受客户端的连接请求,并返回一个新的套接字,以后服务端的数据传输就使用这个新的套接字。如果有错误,返回-1。参数:“sockfd”是和listen()中一样的套接字值;“addr”是个指向局部的数据结构sockaddr_in的指针;“addrlen”设置为sizeof(struct sockaddr_in)。int send(int sockfd, const void *msg, int len, int flags);int recv(int sockfd, void *buf, int len, unsigned int flags);功能是用于流式套接字或数据报套接字的通讯,我们数据的真正传输就由它们完成。参数:“sockfd”是发/收数据的套接字值;“msg”指向你想发送的数据的指针;“buf”是指向接收数据存放的地址;“len”是数据的长度;“flags”设置为 0。int sendto(int sockfd, const void *msg, int len, unsigned int flags,const struct sockaddr *to, int tolen);int recvfrom(int sockfd, void *buf, int len, unsigned int flags, struct sockaddr *from, int *fromlen);功能和send、recv类似,不过是用于无连接数据报套接字的传输。 int closesocket(int sockfd) 功能是关闭套接字。参数“sockfd”为要关闭的套接字值。程序:“这里的目的是让大家对Socket编程有个整体了解。不用怕,程序我会详细解释的,首先是服务端的程序。其流程是: socket()→bind()→listen→accept()→recv()/send()→closesocket() 具体代码如下:”★#include #include #pragma comment(lib,"Ws2_32")#define MYPORT 830 /*定义用户连接端口*/ #define BACKLOG 10 /*多少等待连接控制*/ int main() { int sockfd, new_fd; /*定义套接字*/ struct sockaddr_in my_addr; /*本地地址信息 */ struct sockaddr_in their_addr; /*连接者地址信息*/ int sin_size; WSADATA ws; WSAStartup(MAKEWORD(2,2),&ws); //初始化Windows Socket Dll //建立socket if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { //如果建立socket失败,退出程序 printf("socket error\n"); exit(1); } //bind本机的MYPORT端口 my_addr.sin_family = AF_INET; /* 协议类型是INET */ my_addr.sin_port = htons(MYPORT); /* 绑定MYPORT端口*/ my_addr.sin_addr.s_addr = INADDR_ANY; /* 本机IP*/ if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))== -1) { //bind失败,退出程序 printf("bind error\n"); closesocket(sockfd); exit(1); } //listen,监听端口 if (listen(sockfd, BACKLOG) == -1) { //listen失败,退出程序 printf("listen error\n"); closesocket(sockfd); exit(1); } printf("listen"); //等待客户端连接 sin_size = sizeof(struct sockaddr_in); if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) { printf("accept error\n"); closesocket(sockfd); exit(1); } printf("\naccept!\n"); //有连接,发送ww0830字符串过去 if (send(new_fd, "ww0830\n", 14, 0) == -1) { printf("send error"); closesocket(sockfd); closesocket(new_fd); exit(1); } printf("send ok!\n"); //成功,关闭套接字 closesocket(sockfd); closesocket(new_fd); return 0;}对服务端程序的流程概括:先是初始化Windows Socket Dll: WSAStartup(MAKEWORD(2,2),&ws); 然后建立Socket: sockfd = socket(AF_INET, SOCK_STREAM, 0) 再bind本机的MYPORT端口:my_addr.sin_family = AF_INET; /* 协议类型是INET */ my_addr.sin_port = htons(MYPORT); /* 绑定MYPORT端口 */ my_addr.sin_addr.s_addr = INADDR_ANY; /* 本机IP */ bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) 接下来监听端口: listen(sockfd, BACKLOG) 如果有客户端的连接请求,接收它: new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size) 最后发送ww0830字符串过去: send(new_fd, "ww0830\n", 14, 0) 收尾工作,关闭socket: closesocket(sockfd); closesocket(new_fd); ”编译、执行,就会一直监听830端口客户端程序了。其流程是: socket()→connect()→send()/recv()→closesocket() 比服务端更简单吧!其实现代码如下:”★#include #include #include #pragma comment(lib,"Ws2_32") #define PORT 830 /* 客户机连接远程主机的端口 */ #define MAXDATASIZE 100 /* 每次可以接收的最大字节 */ int main(int argc, char *argv[]) { int sockfd, numbytes; char buf[MAXDATASIZE]; struct sockaddr_in their_addr; /* 对方的地址端口信息 */ if (argc != 2) { //需要有服务端ip参数 fprintf(stderr,"usage: client hostname\n"); exit(1); } WSADATA ws;WSAStartup(MAKEWORD(2,2),&ws); //初始化Windows Socket Dll if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){ //如果建立socket失败,退出程序 printf("socket error\n"); exit(1); } //连接对方their_addr.sin_family = AF_INET; /* 协议类型是INET */ their_addr.sin_port = htons(PORT); /* 连接对方PORT端口 */ their_addr.sin_addr.s_addr = inet_addr(argv[1]); /* 连接对方的IP */ if (connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr)) == -1){ //如果连接失败,退出程序 printf("connet error\n"); closesocket(sockfd); exit(1); } //接收数据,并打印出来if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1) { //接收数据失败,退出程序 printf("recv error\n"); closesocket(sockfd); exit(1); } buf[numbytes] = '\0'; printf("Received: %s",buf); closesocket(sockfd); return 0; } 对客户端程序的流程概括:首先是初始化Windows Socket Dll: WSAStartup(MAKEWORD(2,2),&ws); 然后建立Socket: sockfd = socket(AF_INET, SOCK_STREAM, 0) 接着连接服务器方:their_addr.sin_family = AF_INET; /* 协议类型是INET */ their_addr.sin_port = htons(PORT); /* 连接对方PORT端口 */ their_addr.sin_addr.s_addr = inet_addr(argv[1]); /* 连接对方的IP */ connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr)) 连接成功就接收数据: recv(sockfd, buf, MAXDATASIZE, 0) 最后把收到的数据打印出来并关闭套接字: printf("Received: %s",buf); closesocket(sockfd); 编译结束后,运行服务端,然后。客户端 服务端IP 回车你会看到服务端发来得数据。那么基本的点对点通信就没问题了。只要两台机器同时包含服务端和客户端,就可以互相通信了。当然,你也可以将服务端和客户端分开做,专门一个服务器负责用户登录和转发消息。流程如下:A客户端发登录消息-----》服务器服务器验证发送用户消息----》客户端A客户端想发消息给B客户端----》先发给服务端服务器得到消息查询B客户端IP并转发消息。(或者B客户端循环发消息询问服务器有无消息)通信结束。
追问
这不是完整的程序吧?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询