none
window下网络编程问题 RRS feed

  • 问题

  • #include <iostream>
    #include <WinSock2.h>
    #include<stdlib.h>

    using namespace std;

    int main(int argc, char* argv[]) {
    WSADATA wsaData;
    SOCKET servSock;
    const int BUF_SIZE = 30;
    char message[BUF_SIZE];
    int strLen, clntAdrSz;
    SOCKADDR_IN servAddr, clntAddr;

    if (argc != 2)
    {
    cout << "Usage:" << argv[0] << "<port>" << endl;
    }
    if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    {
    cout << "WSAStartup() error" << endl;
    }

    servSock = socket(PF_INET, SOCK_STREAM, 0);
    if (servSock == INVALID_SOCKET)
    {
    cout << "UDP socket creation error" << endl;
    }
    memset(&servAddr, 0, sizeof(servAddr));
    servAddr.sin_family = AF_INET;
    servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servAddr.sin_port = htons(atoi(argv[1]));

    while (1)
    {
    clntAdrSz = sizeof(clntAddr);
    strLen = recvfrom(servSock, message, BUF_SIZE, 0, (SOCKADDR*)&clntAddr, &clntAdrSz);
    sendto(servSock, message, strLen, 0, (SOCKADDR*)&clntAddr, sizeof(clntAddr));
    }
    closesocket(servSock);
    WSACleanup();

    system("pause");
    return 0;

    }
    2019年9月29日 9:00

答案

  • 你好,

    感谢你在此发帖。

    >>servAddr.sin_port = htons(atoi(argv[1]));

    让我们把这一步拆分一下进行分析。

            cout << argv[1] << endl;
    	auto a = atoi(argv[1]);
    	servAddr.sin_port = htons(a);

    问题并不出在servAddr.sin_port = htons(char *)上。这里发生了访问冲突,可以预见数组越界访问了。也就是char* argv[]这个数组只有一个元素。

    以下信息解释了参数的含义,仅供参考。

    argv[]:保存命令行参数的字符串指针,其中第0个参数是程序的全名,以后的参数为命令行后面跟的用户输入的参数,argv参数是字符串指针数组,其各元素值为命令行中各字符串(参数均按字符串处理)的首地址。 指针数组的长度即为参数个数argc。数组元素初值由系统自动赋予。

    sin_port:传输协议端口号。

    我注意到很多Winsock配置都提供了本段代码作为范例,但是作者并没有提供他的命令配置,导致了没有设置过命令参数的用户进行测试时,发生越界访问。如果你想验证你的配置已完成,我觉得你完成了附加依赖项的添加就可以了。

    Best Regards,

    Suarez Zhou

    2019年9月30日 2:20

全部回复

  • 新人求解,这一行servAddr.sin_port = htons(atoi(argv[1]));的端口号一定要自己指定吗?

    vs2017中运行报错

    2019年9月29日 9:01
  • 你好,

    感谢你在此发帖。

    >>servAddr.sin_port = htons(atoi(argv[1]));

    让我们把这一步拆分一下进行分析。

            cout << argv[1] << endl;
    	auto a = atoi(argv[1]);
    	servAddr.sin_port = htons(a);

    问题并不出在servAddr.sin_port = htons(char *)上。这里发生了访问冲突,可以预见数组越界访问了。也就是char* argv[]这个数组只有一个元素。

    以下信息解释了参数的含义,仅供参考。

    argv[]:保存命令行参数的字符串指针,其中第0个参数是程序的全名,以后的参数为命令行后面跟的用户输入的参数,argv参数是字符串指针数组,其各元素值为命令行中各字符串(参数均按字符串处理)的首地址。 指针数组的长度即为参数个数argc。数组元素初值由系统自动赋予。

    sin_port:传输协议端口号。

    我注意到很多Winsock配置都提供了本段代码作为范例,但是作者并没有提供他的命令配置,导致了没有设置过命令参数的用户进行测试时,发生越界访问。如果你想验证你的配置已完成,我觉得你完成了附加依赖项的添加就可以了。

    Best Regards,

    Suarez Zhou

    2019年9月30日 2:20
  • 感谢大佬
    2019年9月30日 5:40