Fxmles 发表于 2022-12-30 21:52

新手C++ WINsocket编程 卡在recv那里



#include <WinSock2.h>
void SocketTest(){
        WSADATA wsaData;
        //初始化socket库
        WSAStartup(MAKEWORD(2, 0), &wsaData);
        //创建
        SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        SOCKADDR_IN sa;
        sa.sin_family = AF_INET;
        //设置链接服务端的端口
        sa.sin_port = htons(80);//端口号

        sa.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

        //尝试连接服务器
        if (connect(sock, (SOCKADDR*)&sa, sizeof(sa)) == SOCKET_ERROR)
        {
                MessageBoxA(0, "卧槽 炸了", "", 0);
        }

        //与服务器进行通信
        char aSendString[] =
                "GET /announcement.html HTTP/1.1\r\n"
                "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/110.0\r\n";

        char result;
        send(sock, aSendString, sizeof(aSendString) - 1, 0);//发包测试

        recv(sock, result, sizeof(result) - 1, 0);
        MessageBoxA(0, result, 0, 0);
}

新手socket编程,执行到recv(sock, result, sizeof(result) - 1, 0);那一步就卡住 卡了几十秒后服务器就会返回一个408 然后软件这里提示一行乱码

Fxmles 发表于 2022-12-30 21:53

端口和ip我用浏览器连都是正常的
软件recv后服务器也有一条日志
127.0.0.1 - - "GET /announcement.html HTTP/1.1" 408 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/110.0"
但是就是返回408 recv卡死我也是服了

teety 发表于 2022-12-30 23:28

截取浏览器与服务器通信的HTTP包 一对比就知道了

tempd 发表于 2022-12-31 09:24

aSendString的结尾再增加"\r\n",应该就可以了,参见http协议的请求报文格式

michaelgao 发表于 2022-12-31 09:30

1》楼主的socket client代码没有大问题的,可以正常收发。(检查一下服务器代码)


2》测试代码
// TestSocketClinet.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "TestSocketClinet.h"
#include <WinSock2.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// 唯一的应用程序对象

CWinApp theApp;

using namespace std;

void SocketTest(){
        WSADATA wsaData;
        //初始化socket库
        WSAStartup(MAKEWORD(2, 0), &wsaData);
        //创建
        SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
        SOCKADDR_IN sa;
        sa.sin_family = AF_INET;
        //设置链接服务端的端口
        sa.sin_port = htons(80);//端口号

        sa.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");

        //尝试连接服务器
        if (connect(sock, (SOCKADDR*)&sa, sizeof(sa)) == SOCKET_ERROR)
        {
                MessageBoxA(0, "卧槽 炸了", "提示", 0);
        }

        //与服务器进行通信
        char aSendString[] =
                "GET /announcement.html HTTP/1.1\r\n"
                "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/110.0\r\n";

        char result = { 0 };
        //send(sock, aSendString, sizeof(aSendString)-1, 0);//发包测试
        send(sock, aSendString, strlen(aSendString), 0);//发包测试

        //recv(sock, result, sizeof(result)-1, 0);
        recv(sock, result, 128, 0);
        MessageBoxA(0, result, "提示", 0);
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
        int nRetCode = 0;

        HMODULE hModule = ::GetModuleHandle(NULL);

        if (hModule != NULL)
        {
                // 初始化 MFC 并在失败时显示错误
                if (!AfxWinInit(hModule, NULL, ::GetCommandLine(), 0))
                {
                        // TODO:更改错误代码以符合您的需要
                        _tprintf(_T("错误:MFC 初始化失败\n"));
                        nRetCode = 1;
                }
                else
                {
                        // TODO:在此处为应用程序的行为编写代码。
                        SocketTest();
                }
        }
        else
        {
                // TODO:更改错误代码以符合您的需要
                _tprintf(_T("错误:GetModuleHandle 失败\n"));
                nRetCode = 1;
        }

        return nRetCode;
}

3》sizeof是c语言函数,一般参数是数据类型或对象,目的求数据类型占用字节数。不要用于求数组大小。

顺祝楼主:学习进步、天天向上。

稻海香 发表于 2022-12-31 10:06

本帖最后由 稻海香 于 2022-12-31 10:26 编辑

michaelgao 发表于 2022-12-31 09:30
1》楼主的socket client代码没有大问题的,可以正常收发。(检查一下服务器代码)



正解,,应该是服务器问题。

xlhwxyh 发表于 2022-12-31 13:02

你没设置异步模式, 默认就是同步!
recv没收到消息肯定一直阻塞的!

Cool_Breeze 发表于 2022-12-31 15:18

可以使用select函数查询一下IO口是否可读。

Fxmles 发表于 2023-1-5 00:27

谢谢各位,解决了,确实是服务器的问题。
页: [1]
查看完整版本: 新手C++ WINsocket编程 卡在recv那里