• 回答数

    4

  • 浏览数

    186

甜甜的今天
首页 > 学术期刊 > 局域网聊天软件毕业论文

4个回答 默认排序
  • 默认排序
  • 按时间排序

真南真北

已采纳

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

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

通信结束。

120 评论

.芒果pai

1. 网上选课系统C#.NET.SQL2000 2. 人事管理系统 3. 局域网飞鸽传书软件的设计与实现 4. 多功能聊天软件的设计与开发——音频/视频聊天模块 5. 多功能聊天软件的设计与开发——文字聊天/文件传输模块 6. 某店POS积分管理系统——积分实绩更新及销售状况统计 7. 某店POS积分管理系统—商品分类,交易状况统计 8. 某店POS积分管理系统——销售情况,会员卡再发行数据生成 9. 中小企业OA系统的设计与实现 10. 邮件收发程序的设计与开发 11. 多语种网络硬盘系统的设计 12. 一种基于C2C模式的网上购物系统的设计与实现 13. 基于C/S结构的企业人事管理系统的设计与实现 14. 基于TCP协议的简单即时通信软件的设计与实现 15. 某店POS积分管理系统——清除履历表、日志表、月购买额 16. 基于Web Services的异构数据库检索系统的设计 17. C语言试题生成与考试系统 18. 基于.NET的产品报价系统的设计 19. 用socket实现局域网办公助理

217 评论

adamjackjason

找论文资料,求代写,就无忧无虑论文网

133 评论

sophiabian

以前做的系统有几十页呢?对你好像多了啊

275 评论

相关问答

  • 基于qt局域网聊天系统毕业论文

    Linux系统都是C写的 用C当然行得通 就是个socket编程嘛 我们原来做过一个的原理描述 当然 这个是C\S模式的 其实你可以做成 无服务端的本系统

    垂杨紫陌 3人参与回答 2023-12-08
  • 局域网组建毕业论文

    这个题目很简单 ,你可以找一些实际的公司去现场给公司做个网络模拟组建 ,这样对你的论文帮助很大 ,比你在这空想要好的多,一切的学习都要基于实践 ,这样你的论文会

    囩囩囡囡 3人参与回答 2023-12-11
  • 无线局域网与组件毕业论文

    说明: 1.802.11、802.11b、802.11g都工作在2.4GHz的ISM(工业、科学、医疗)公共频段,无需向无委申请;而802.11a工作在5GHz

    姣姣Devil 4人参与回答 2023-12-09
  • 毕业论文网络聊天室

    毕业论文,泛指专科毕业论文、本科毕业论文(学士学位毕业论文)、硕士研究生毕业论文(硕士学位论文)、博士研究生毕业论文(博士学位论文)等,即需要在学业完成前写作并

    魅影幽兰 3人参与回答 2023-12-11
  • 无线局域网毕业论文

    以下就是我为大家带来的无线 网络技术 论文三篇。 无线网络 技术论文一 试想一下,在有线网络时代,用户的活动范围受限于网线,无论到哪里必须要拖着长长的缆线

    爱吃爱喝薅羊毛 2人参与回答 2023-12-05