基于tcp的简易聊天机器人,c++编写,客户端无法连续接收到消息?

客户端程序

#include "pch.h"
#include
#include
#include
#include
#define DATA_BUFFER 1024 //默认缓冲区大小
#pragma comment(lib, "wsock32.lib")
int main(int argc, char * argv[])
{
WSADATA wsaData;
SOCKET sClient;
int iPort = 5050;
int iLen;//从服务器端接收的数据长度
char buf[DATA_BUFFER];//接收数据的缓冲区
struct sockaddr_in ser;//服务器端地址
char szRecipient[128]; // 服务器地址
//判断参数输入是否正确:client [Server IP]
if (argc < 2)
{
//提示在命令行中输入服务器IP地址
strcpy_s(szRecipient, "127.0.0.1");
}
memset(buf, 0, sizeof(buf));//接收缓冲区初始化
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
printf("Failed to load Winsock.\n");
return -1;
}
//填写要连接的服务器地址信息

ser.sin_family = AF_INET;
ser.sin_port = htons(iPort);
//inet_addr()将命令行中输入的点分IP地址转换为二进制表示的网络字节序IP地址!

ser.sin_addr.s_addr = inet_addr("127.0.0.1");
//建立客户端流式套接口
sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //sClient为SOCKET返回值
if (sClient == INVALID_SOCKET)
{
    printf("socket() Failed: %d\n", WSAGetLastError());
    return -1;
}
//请求与服务器端建立TCP连接
if (connect(sClient, (struct sockaddr *)&ser, sizeof(ser)) == INVALID_SOCKET)
{
    printf("con0 nect() Failed: %d\n", WSAGetLastError());
    return -1;
}
else
{
    //从服务器端接收数据
    iLen = recv(sClient, buf, sizeof(buf), 0);
    if (iLen == 0)
        return -1;
    else if (iLen == SOCKET_ERROR)
    {
        printf("recv() Failed: %d\n", WSAGetLastError());
        return -1;
    }
    else
        printf("recv() data from server: %s\n", buf);
}
char sendbuf[100];
char recvbuf[100];
int Len = sizeof(ser);
while (1)
{
    printf("请输入信息:");
    gets_s(sendbuf);
    send(sClient, sendbuf, strlen(sendbuf) + 1, 0);
    recv(sClient, recvbuf, strlen(recvbuf) , 0);
    sprintf_s(buf, sizeof(buf), "%s 说:%s\n\0", "小朱", recvbuf);
    printf("%s\n", buf);
}
closesocket(sClient);
WSACleanup();
return 0;

}

服务端程序:

#include "pch.h"
#include
#include
#include
#include
#define DEFAULT_PORT 5050 //服务端默认端口
#pragma comment(lib, "wsock32.lib")
int main(int argc, char* argv[])
{
int iPort = DEFAULT_PORT;
WSADATA wsaData;
SOCKET sListen, sAccept; //sListen为创建服务器端套接字,sAccept为创建客户端套接字
int iLen; //客户地址长度
int iSend;//发送数据长度
char buf[] = "I am a server";//要发送给客户的信息
struct sockaddr_in ser, cli;//服务器和客户的地址
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
printf("Failed to load Winsock.\n");
return -1;
}
sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //创建服务器端套接口
if (sListen == INVALID_SOCKET)
{
printf("socket() Failed: %d\n", WSAGetLastError());
return -1;
}
//以下建立服务器端地址
//使用IP地址族
ser.sin_family = AF_INET;
//使用htons()把双字节主机序端口号转换为网络字节序端口号
ser.sin_port = htons(iPort);
// htonl()把一个四字节主机序IP地址转换为网络字节序主机地址
//使用系统指定的IP地址INADDR_ANY
ser.sin_addr.s_addr = htonl(INADDR_ANY);
//bind()函数进行套接定与地址的绑定
if (bind(sListen, (struct sockaddr*)&ser, sizeof(ser)) == SOCKET_ERROR)
{
printf("bind() Failed: %d\n", WSAGetLastError());
return -1;
}
//进入监听状态
if (listen(sListen, 5) == SOCKET_ERROR)
{
printf("lisiten() Failed: %d\n", WSAGetLastError());
return -1;
}
//初始化客户地址长度参数
iLen = sizeof(cli);
sAccept = accept(sListen, (struct sockaddr *)&cli, &iLen);
if (sAccept == INVALID_SOCKET)
{
printf("accept() Failed: %d\n", WSAGetLastError());
return -1;
}
//输出客户IP地址和端口号
printf("Accepted client IP:[%s], port : [%d]\n", inet_ntoa(cli.sin_addr), ntohs(cli.sin_port));
//给连接的客户发送信息
iSend = send(sAccept, buf, sizeof(buf)+1, 0);
if (iSend == SOCKET_ERROR)
{
printf("send() Failed: %d\n", WSAGetLastError());
}
else
{
printf("send() byte: %d\n", iSend);
}

char recvbuf[100] ;
//消息接收与发送
FILE    *f;     //定义文件指针f
char    szLine[MAX_PATH];   //MAX_PATH是#define指令定义的一个宏常量,它定义了编译器所支持的最长全路径名的长度,值为260
char    buffer[MAX_PATH];
fopen_s(&f, "D:\\001.txt", "r");    //以“只读”方式打开指针f所指的文件
if (f == NULL)  //指针文件为空
{
    printf("无法打开文件\n");
    return -1;
}
while (1)
{
    recv(sAccept, recvbuf, strlen(recvbuf), 0);
    printf("%s 说:%s\n", inet_ntoa(cli.sin_addr), recvbuf);
    fseek(f, 0, SEEK_SET);
    memset(szLine, 0, MAX_PATH);
    fgets(szLine, MAX_PATH, f);
    while (szLine[0] != '#')
    {
        if (szLine[0] == 'Q')
        {
            char szTemp[MAX_PATH] = {0};
            //复制字符串szLine + 2到缓冲区szTemp
            lstrcpyA(szTemp, szLine + 2);
            szTemp[lstrlenA(szTemp) - 1] = '\0';
            //匹配成功找到答案
            if (lstrcmpA(szTemp, recvbuf) == 0)
            {
                memset(szLine, 0, MAX_PATH);
                fgets(szLine, MAX_PATH, f);
                //参数 szLine+2欲连线的数据内容,参数flags 一般设0,
                //szLine加2的原因是从读取的字符的第三个字符开始输出,因为前两个字符为A:
                send(sAccept, szLine + 2, strlen(szLine) + 1, 0);
                break;
            }

        }
        memset(szLine, 0, MAX_PATH);
        fgets(szLine, MAX_PATH, f);
    }
    if (szLine[0] == '#')
    {
        memset(buffer, 0, MAX_PATH);
        sprintf_s(buffer, "小朱的功能还有待完善......\n");
        send(sAccept, buffer+2, strlen(buffer)+1, 0);
    }
}
closesocket(sAccept);
closesocket(sListen);
WSACleanup();
return 0;

}

我是通过在服务端插入一个文件是它们进行通话
D:\001.txt
图片说明图片说明!

c++
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐