问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

毕业论文《基于socket 的局域网聊天工具》,要求C++语音编写,要有程序,能实现,有文档……

发布网友 发布时间:2022-05-10 05:27

我来回答

1个回答

热心网友 时间:2023-11-05 21:08

“对图中的那些函数,我这里稍加解释一下。”

 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 <stdio.h>

#include <winsock.h>

#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 <stdio.h>

#include <stdio.h>

#include <winsock.h>

#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客户端循环发消息询问服务器有无消息)

通信结束。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
乾隆小时候的书童是谁 下面对句式判断有误的一项是( ) A.当立者乃公子扶苏(判断句) ...为折线,把 折起,使平面 平面 ,连接 (1)求证: ;(2)求二面角 图中由线段OA、AB组成的折线表示的是小明步行所走的路程和时间之间的关... 动态图像粒度粒形分析仪 oppor9splus视频通话怎么开美颜 微信视频聊天怎么开美颜oppor9 谁家出售二手胶囊填充机NJP1200 NJP-1200A硬胶囊填充机仪器特点简介 NJP-1200A硬胶囊填充机仪器参数 C#的Socket聊天室问题 java中做客户与客户的聊天对话,利用socket实现了客户的群发功能,怎么利用map给指定的客户发消息?? 关于java多线程socket局域网聊天的问题 socket聊天怎么判断是文件还是文字 socket.io 支持多少人聊天 python socket半双工聊天怎么运行 如何用socket编程实现聊天室 使用socket编程,实现一个多线程聊天程序,使用9977端口,要求服务端使 ... iphone手机屏幕裂了,换过外屏后手机还好不好用? 养老保险人没了怎么办 急!!发给客户的某某离职通知书 你好,我想咨询一下,关于污染问题,环保局对该厂下达停产整顿通知书但该厂还是在生产,后来又找环保局, 辞退员工后通知客户的通知书如何写 我国最高山峰 工商局给下个责令停业通知书,我该咋办? 知道我国最高的山峰是那坐山么 因为客户原因导致项目延期 客户通知书如何写 安全生产行政执法文书——责令改正指令书,是否等同停产通知书? 环保局停产通知书今天拿给我们的 ,我们可以搬迁吗 老人与海读后感10个字的。 在网页游戏中用socket怎么做个聊天功能 请问这是华为耳机吗? 壳牌机油sn级的多少钱 壳牌机油0w一40SN级4L多少钱一桶 壳牌喜力机油价格正常是多少钱? 壳牌4升5w-30sn级机油多少钱一桶? 壳牌喜力hx7多少钱,性能怎么样? 壳牌机油全合成油sn7糸什么价格查询 壳牌机油多少钱? 壳牌机油价格及其产品特点 壳牌hx6机油属于哪种等级的机油?多少公里换?价格多少?谢谢!!! 老车一般用那款机油合适?壳牌的机油多少钱一升? 4个月泰迪怎么修毛? 壳牌机油价格多少钱? 壳牌机油的价格各种各样多少价格是可以买的? 谁在4S店保养用过壳牌机油啊,多少钱 壳牌机油的价格大概是在什么范围? 壳牌机油大概多少钱一桶? 保养用壳牌机油5w40价格大概是多少? 壳牌机油一共有多少种 分别都是多少钱