c\c ++中socket编程的问题

par*_*ain 1 c c++ sockets winsock

#include "stdafx.h"
#include <windows.h>
#include <winsock.h>
#include <stdio.h>

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR IpCmdLine,int nCmdShow)
{
    WSADATA ws;
    char buf[100];

    WSAStartup(0x0101,&ws);

    sprintf(buf,"%d.%d",HIBYTE(ws.wVersion),LOBYTE(ws.wVersion));
    MessageBox(0,buf,"info",0);
    WSACleanup();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

此程序用于获取计算机中可用的wsock版本的信息.我不明白为什么"stdafx.h"包含在程序中.APIENTRY有什么意义?我们不能使用_stdcall吗?我也无法在VC++中编译它.代码有什么问题?

以下是执行程序时的错误,编译时没有错误.

--------------------Configuration: sa - Win32 Debug--------------------
Linking...
sa.obj : error LNK2001: unresolved external symbol _WSACleanup@0
sa.obj : error LNK2001: unresolved external symbol _WSAStartup@8
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/sa.exe : fatal error LNK1120: 3 unresolved externals
Error executing link.exe.

sa.exe - 4 error(s), 0 warning(s)
Run Code Online (Sandbox Code Playgroud)

Ecl*_*pse 8

  1. stdafx用于在VC++中实现预编译头.你可以将你的库标题如windows.h和winsock.h等放在那里,每次修改stdafx.h时它们只会被编译一次.

  2. APIENTRY通常只是__stdcall的定义,但有时它被定义为空白(例如,如果不支持__stdcall).这是为了使您的代码更具可移植性.

  3. 如果没有您遇到的实际错误,我将无法提供太多帮助.但我的第一个猜测是你的构建中有unicode,它抱怨MessageBoxW没有将char [100]作为参数.在这种情况下,要么在任何地方使用宽字符,要么关闭unicode,或使用MessageBoxA显式使用ASCII版本.

编辑:

现在有了错误,这很容易.在项目属性 - >链接器 - >输入 - >附加依赖项下,添加ws2_32.lib.所以你可以将Winsock函数链接到.

缺少的_main表示您正在构建应用程序作为控制台应用程序,而不是Windows应用程序.返回项目属性 - >链接器 - >系统并将子系统设置为Windows(/子系统:Windows)而不是控制台.或者,只需将WinMain重命名为int main()(确保删除APIENTRY).

此外,如果您正在使用MSVC++,您也可以使用更安全的sprintf_s:

sprintf_s(buf,100,"%d.%d",HIBYTE(ws.wVersion),LOBYTE(ws.wVersion));
Run Code Online (Sandbox Code Playgroud)