吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 985|回复: 8
收起左侧

[求助] 新手C++ WINsocket编程 卡在recv那里

[复制链接]
Fxmles 发表于 2022-12-30 21:52


[C++] 纯文本查看 复制代码
#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[128];
	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 - - [30/Dec/2022:21:49:11 +0800] "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代码没有大问题的,可以正常收发。(检查一下服务器代码)
11.png

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[128+1] = { 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
谢谢各位,解决了,确实是服务器的问题。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 02:05

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表