Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 在服务器-客户端连接(windows)中接收消息时出现问题_Sockets - Fatal编程技术网

Sockets 在服务器-客户端连接(windows)中接收消息时出现问题

Sockets 在服务器-客户端连接(windows)中接收消息时出现问题,sockets,Sockets,我最近一直在做一个项目,通过本地wifi/连接连接到计算机,并来回发送消息。另一个要求是它必须在windows上。经过大量的教程,阅读材料等,我几乎完成了。最后要实现的是使用多个线程的双向同时连接 现在,我相信我已经能够实现这一点,但我只剩下一个小问题。一旦我从服务器或客户端输入任何内容,它就会在控制台屏幕上连续打印出来。我相信程序的“接收”部分会不断地在相同的数据上循环并打印出来。它同时影响这两种情况的原因是,如果客户端发送消息,则该消息将同时显示在客户端和服务器屏幕上 我认为在每次循环迭代中

我最近一直在做一个项目,通过本地wifi/连接连接到计算机,并来回发送消息。另一个要求是它必须在windows上。经过大量的教程,阅读材料等,我几乎完成了。最后要实现的是使用多个线程的双向同时连接

现在,我相信我已经能够实现这一点,但我只剩下一个小问题。一旦我从服务器或客户端输入任何内容,它就会在控制台屏幕上连续打印出来。我相信程序的“接收”部分会不断地在相同的数据上循环并打印出来。它同时影响这两种情况的原因是,如果客户端发送消息,则该消息将同时显示在客户端和服务器屏幕上

我认为在每次循环迭代中清除缓冲区可以解决这个问题,但这没有用

仅供参考:Thread1用于发送数据,Thread2用于接收数据

下面分别是完整服务器/客户端代码的两个链接。您可以尝试运行它,但最好是在VisualStudio中运行,因为win32lib要求。否则,您必须手动链接到该库

-客户 -服务器

这是线程代码的外观:

string thread1(SOCKET sock) {
//SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
    char buf[4096];
    ZeroMemory(buf, 4096);
    while (true) {
        string userInput;
        cout << ">";
        gets_s(buf);
 
        ofstream myfile;
        myfile.open("C://Users/Home/Desktop/chat.txt", ios::app);
        int sendResult = send(sock, buf, sizeof(buf), 0);
        myfile << buf << endl;
        myfile.close();
 
        //return userInput;
        memset(buf, 0, sizeof(buf));
    }
    return "";
}
 
string thread2(SOCKET sock) {
    char buf[4096] = { 0 };
    ZeroMemory(buf, 4096);
    char prev[4096] = { 0 };
    //SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
    while (true) {
 
        int bytesReceived = recv(sock, buf, 4096, 0);
        if (prev == buf) {
            continue;
        }
        strcpy_s(prev, buf);
        //if (string(buf, 0, bytesReceived)  NULL) {
            //continue;
        //}
        //cout << bytesReceived << endl;
        if (bytesReceived == -1) {
            continue;
        }
 
        cout << "SERVER> " << string(buf, 0, bytesReceived) << endl;
 
        ofstream myfile;
        myfile.open("C://Users/Home/Desktop/chat.txt", ios::app);
        int sendResult = send(sock, buf, sizeof(buf), 0);
        myfile << buf << endl;
        myfile.close();
 
        //return string(buf, 0, bytesReceived);
        memset(buf, 0, sizeof(buf));
    }
    return "";
}
string thread1(承插式袜子){
//SOCKET sock=SOCKET(AF\u INET,sock\u STREAM,0);
char-buf[4096];
零内存(buf,4096);
while(true){
字符串用户输入;
库特