【求助】SDK Socket循环接收和退出的问题

liying520 2009-04-02 04:51:24
最近学习Socket 想从最简单的Socket聊天开始

我要实现的功能是可以一直发送信息给服务端
并且当客户端断开连接后不要一直循环输出最后收到的信息。。
最好可以实现要退出的时候发送一个Exit或者quit就可以断开连接就好了。
希望大家告诉我如何修改和实现我要的功能

客户端代码如下
#include "stdafx.h"
#include <stdio.h>
#include <Winsock2.h>
#pragma comment (lib,"ws2_32.lib")
void main()
{
WORD wVersionRequested;//加载套接字库,创建套接字
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);//端口6000
int retval;
retval=connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
if (SOCKET_ERROR==retval)
{
closesocket(sockClient);
printf("连接失败!\n");
return;
}
else
{
printf("连接成功!\n");
char sendBuf[50];
//char recvBuf[50];
while(true)
{

printf("请输入要发送的内容:");
scanf("%s",sendBuf);
send(sockClient,sendBuf,strlen(sendBuf)+1,0);

//recv(sockClient,recvBuf,50,0);
//printf("%s\n",recvBuf);

}

}

closesocket(sockClient);
// WSACleanup();
}


服务器端代码如下

#include "stdafx.h"
#include <stdio.h>
#include <Winsock2.h>
#pragma comment (lib,"ws2_32.lib")
void main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;

wVersionRequested = MAKEWORD( 1, 1 );

err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
printf("建立套接字失败...");
return;
}

if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
int retval;
retval=bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
if(SOCKET_ERROR==retval)
{
closesocket(sockSrv);
printf("端口绑定失败");
return;
}
printf("绑定成功开始监听...\n");
listen(sockSrv,5);

SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
char sendBuf[50];
char recvBuf[50];
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
while(true)
{


//sprintf(sendBuf,"服务端IP:%s\n连接成功!\n",inet_ntoa(addrClient.sin_addr));
//send(sockConn,sendBuf,strlen(sendBuf)+1,0);
recv(sockConn,recvBuf,50,0);
char * a=recvBuf;
printf("对方发送消息:%s\n",recvBuf);
}
closesocket(sockConn);
}
...全文
126 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
2010-10-27
  • 打赏
  • 举报
回复
err = WSAStartup( wVersionRequested, &wsaData );
初始化有作用域吗(姑且这么叫)
zbing0203 2009-04-02
  • 打赏
  • 举报
回复
你这服务端只能对一个呀
循环accept
liying520 2009-04-02
  • 打赏
  • 举报
回复

while(true)
{
int recvid=recv(sockConn,recvBuf,50,0);
if(SOCKET_ERROR!=recvid)
{
printf("对方发送消息:%s\n",recvBuf);
recvBuf[0]='\0';
continue;
}
}

这样可以一直监听。但是一旦推出。再开启客户端程序可以连接成功。但是已经无法发送信息了。
是因为特定的SOCKET通道被关闭了?
liying520 2009-04-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hai040 的回复:]
recv有返回值吧
出错的话就退出
[/Quote]

通过recv的返回值退出?我试试。。
不过还是希望可以通过判断发送来的字符串判断是否退出。。。
希望帮我调试下问题在哪里。
liying520 2009-04-02
  • 打赏
  • 举报
回复
是可以循环发送和接收都没问题
退出的地方我判断recvBuf=="exit"
结果没有被识别
不知道为什么。。。。
hai040 2009-04-02
  • 打赏
  • 举报
回复
recv有返回值吧
出错的话就退出
  • 打赏
  • 举报
回复
你的client现在已经是循环发送了,还要什么功能?
退出你就加一个在while里加个判断break就可以了啊

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧