社区
通信技术
帖子详情
初学网络,请指点!
liao2001
2001-10-06 08:28:02
客户端发送数据给服务器处理,然后服务器返回结果给客户端,那么
客户端可不可能通过同一个socket向服务器连续发数据,同时还要接收结果?
...全文
112
8
打赏
收藏
初学网络,请指点!
客户端发送数据给服务器处理,然后服务器返回结果给客户端,那么 客户端可不可能通过同一个socket向服务器连续发数据,同时还要接收结果?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
8 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
caiyi9000
2001-10-15
打赏
举报
回复
用MFC做个对话框(记住不要选择socket支持),再将winsock2.h包含进你的主程序中,在Project\Settings中的link页中的object/library modules编辑框的最后增加库文件:ws2_32.lib
walkonthesky
2001-10-09
打赏
举报
回复
loushang d dui
yuliang
2001-10-09
打赏
举报
回复
有空买几本书看看了,多上上网,聊聊天,会有进步的,如果有感性的认识,那就开始学编程吧,就这种过程!,好好努力了!
dansu
2001-10-09
打赏
举报
回复
当然可以了,SOCKET是双工的,你用异步SOCKET或开两个线程就可以了.
ggzzkk
2001-10-09
打赏
举报
回复
这段程序需要那些头文件?
caiyi9000
2001-10-09
打赏
举报
回复
当然可以用一个SOCKET来发数据和接收数据,而且一般都是用一个。
初学WINSOCK编程建议你:
用API做一个小服务器和客户端试试。
为了简单起见,应用程序是基于MFC的标准对话框。
Winsock用WINDOWS API实现:
(1)服务器端有两个线程:
主线程 — 你需要编写以下函数来实现
#define NETWORK_EVENT USER_MESSAGE+100 //定义网络事件
sockaddr_in clientaddr; //暂时存放客户端IP地址
//自己定义消息映射函数,将上面定义的网络事件映射到处理函数
//OnNetEvent为网络事件处理函数,它在下面定义
ON_MESSAGE(NETWORK_EVENT, OnNetEvent);
在你对话框中的初始化函数中调用下面的初始化网络的子函数
BOOL InitNetwork() //初始化网络
{
//初始化TCP协议
BOOL ret = WSAStartup(MAKEWORD(2,2), &wsaData);
if(ret != 0)
{
MessageBox("初始化套接字失败!");
return FALSE;
}
//创建服务器端套接字
SOCKET serverSocket
= socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(serverSocket == INVALID_SOCKET)
{
MessageBox("创建套接字失败!");
closesocket(m_Socket);
WSACleanup();
return FALSE;
}
//绑定到本地一个端口上
sockaddr_in localaddr;
localaddr.sin_family = AF_INET;
localaddr.sin_port = htons(1688);
localaddr.sin_addr.s_addr = 0;
if(bind(serverSocket ,(const struct sockaddr*)&localaddr,
sizeof(sockaddr)) == SOCKET_ERROR)
{
MessageBox("绑定地址失败!");
closesocket(m_Socket);
WSACleanup();
return FALSE;
}
//注册网络异步事件,m_hWnd为应用程序的主对话框或主窗口的句柄
WSAAsyncSelect(serverSocket, m_hWnd, NETWORK_EVENT,
FD_ACCEPT | FD_CLOSE | FD_READ | FD_WRITE);
listen(serverSocket, 5); //设置侦听模式
return TRUE;
}
//定义网络事件的响应函数
void OnNetEvent(WPARAM wParam, LPARAM lParam)
{
//调用API函数,得到网络事件类型
int iEvent = WSAGETSELECTEVENT(lParam);
//得到发出此事件的客户端套接字
SOCKET pSock = (SOCKET)wParam;
switch(iEvent)
{
case FD_ACCEPT: //客户端连接请求
{
OnAccept();
break;
}
case FD_CLOSE: //客户端断开事件:
{
OnClose(pSock);
break;
}
case FD_READ: //网络数据包到达事件
{
OnReceive(pSock);
break;
}
case FD_WRITE: //发送网络数据事件
{
OnSend(pSock);
break;
}
default: break;
}
}
void OnAccept(SOCET pSock) //响应客户端连接请求函数
{
int len = sizeof(sockaddr);
//调用API函数,接受连接,并返回一个新套接字
//还可以获得客户端的IP地址
SOCKET clientSocket = accept(serverSocket,
(struct sockaddr*)&clientaddr, &len);
//为新的socket注册异步事件,注意没有Accept事件
if(WSAAsyncSelect(clientSocket ,m_hWnd, IP_EVENT,
FD_CLOSE | FD_READ | FD_WRITE) == SOCKET_ERROR)
{
MessageBox("注册异步事件失败!");
return;
}
//自编函数,将此客户端的相关信息保存下来:套接字、
// IP地址、登陆时间
saveClientSocket(clientSocket,clientAddr,currentTimer);
}
void OnClose(SOCET pSock)
{
//自编函数,结束与相应的客户端的通信,释放相应资源并做相应处理
endClientSocket(pSock);
}
void OnSend(SOCET pSock)
{
//自编函数,在给客户端发数据时做一些预处理
handleOnSend(pSock);
}
void OnReceive(SOCET pSock)
{
recv(...); //调用API函数,读出网络缓冲区中的数据包
//自编函数,将此数据包和发出此数据的客户端
//clientSocket封装成一条网络消息
buildNetMsg(...);
//自编函数,将此网络消息放入一个消息队列中,由工作线程去处理
saveNetMsg(...);
SetEvent(...); //用事件对象触发工作线程
}
客户端登陆后,随即把自己的计算机名发给服务器,服务器接到后,把它保存下来。这样服务器就可以显示所有在线客户端的信息了,包括:客户端计算机名、IP地址、登陆时间等。
注意: 客户端没有OnAccept()函数,但有OnConnect()函数。
工作线程 —
在你的应用程序初始化时,创建并启动一个工作线程
AfxBeginThread(WorkThread,this,THREAD_PRIORITY_NORMAL);
//this可能为应用程序的主对话框或主窗口的句柄
UINT WorkThread(LPVOID pParam)
{
while(1)
{
//等待多重事件到来
int ret = WaitForMultipleObject(...);
switch(ret)
{
case OBJECT_0:
{
if(bNewNetMsg) //查看网络消息队列是否有新的网络消息
{
readNetMsg(...); //如有新的网络消息,则读出
handleNetMsg(...); //处理此网络消息
}
break;
}
case OBJECT_0 + 1:
{
//做退出处理
break;
}
default: break;
}
return 0;
}
客户端为单线程,登陆服务器时,用connect()函数给服务器发连接请求;
客户端没有OnAccept()函数,但有OnConnect()函数。
在OnConnect()函数里做发连接请求时的预处理;
在OnReceive()函数里响应并处理网络数据;
在OnClose()函数里响应服务器的关闭事件;
在OnSend()函数里做发数据时的预处理;
如果你还想实现各客户端之间的在线交流(即所谓的聊天室),你在客户端还可以基于UDP协议
再做一套多点对多点的局域网组播模型模型,以后在和你聊,你先把上面的程序实现。
以上的I/O异步模型基于Windows的消息机制,另外还可以用事件模型、重叠模型或完成端口模型,
建议你参考Windows网络编程指南之类的书。
如果你能对上面的机制很熟练,你肯定已经对Winsock编网络程序的机制有一定理解,接下来你可以进行更精彩的编程, 不仅可以在网上传输普通数据,而且还
以传输语音、视频数据,你还可以自己做一个聊天室,和你的同学在实验室的局域网里可以共同分享你的成果。
ysli
2001-10-08
打赏
举报
回复
可以可以可以,循环recv就行
liao2001
2001-10-07
打赏
举报
回复
没人回答,看来是不行.我现在用两个连接来实现,一个收,一个发.
2025最全CTF入门指南!小白入门必看!这种真实的
网络
对抗机会
请
别放过!
本文详细介绍CTF夺旗赛的起源、竞赛模式与主要题型,涵盖密码学、Web安全、逆向工程等核心技术领域,并为
初学
者提供系统化的学习路线和实战建议,助力
网络
安全技能提升。
专为
初学
者设计——最小的神经
网络
本文介绍了一个最小的神经
网络
,仅包含一个权重,旨在帮助
初学
者直观理解神经
网络
的工作原理。通过Keras构建和训练该
网络
,以实现数字符号反转的简单任务,展示了权重更新过程及
网络
学习能力。
初学
者如何理解
网络
协议?
本文旨在帮助
初学
者理解
网络
协议的本质。
网络
协议是通信的标准,通过类比语言交流解释其作用。协议的实现涉及软件和硬件环境中的翻译程序。协议分层便于技术管理,但不是必需的。作者建议
初学
者通过贴近生活的实例来理解
网络
协议,以简化学习过程。
初学
网络
流 最大流
本文详细介绍了
网络
流的基本概念及求解最大流的方法,包括残流
网络
的构造、增广路径的寻找以及最大流的计算。以POJ1273为例,提供了
初学
者的实践指南。
100个c#
初学
者编程实例_
请
不要退出-每个专家都曾经是
初学
者
本文作者Ayoub NEJJARI分享了自己作为编程
初学
者的挫折感,强调伟大的发展从来不会来自舒适区。他指出,虽然编程学习过程中遇到困难和挫折是正常的,但不应轻易放弃。通过扩散模式学习,反复阅读和理解概念,可以帮助新手逐步掌握知识。文章鼓励编程
初学
者保持耐心,不断实践,不要孤立工作,要勇于提问,因为每个专家都曾是
初学
者。
通信技术
4,394
社区成员
28,906
社区内容
发帖
与我相关
我的任务
通信技术
通信技术相关讨论
复制链接
扫一扫
分享
社区描述
通信技术相关讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章