为了在应用程序当中调用任何一个Winsock API函数[1],首先第一件事情就是必须通过WSAStartup函数完成对Winsock服务的初始化,因此需要调用WSAStartup函数。使用Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的版本信息。当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。
#include <winsock2.h>
#pragma comment(lib,"WS2_32")
class CInitSock
{
public:
CInitSock(BYTE minorVer=2,BYTE majorVer=2)
{
WSADATA wsaData;
WORD sockVersion=MAKEWORD(minorVer,majorVer);
if(::WSAStartup(sockVersion,&wsaData) !=0)
{
exit(0);
}
}
~CInitSock()
{
::WSACleanup();
}
};
#include "InitSock.h"
#include<stdio.h>
CInitSock initSock;
int main()
{
//创建套接字
SOCKET s=::socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
if(s==INVALID_SOCKET)
{
printf("Failed Socket\n");
return 0;
}
sockaddr_in servAddr;
servAddr.sin_family=AF_INET;
servAddr.sin_port=htons(4567);
servAddr.sin_addr.S_un.S_addr=inet_addr("172.16.73.239");
if(::connect(s,(sockaddr*)&servAddr,sizeof(servAddr))==-1)
{
printf("Failed connect()\n");
return 0;
}
//接收数据
char buff[256];
int nRecv=::recv(s,buff,256,0);
if(nRecv>0)
{
buff[nRecv]='\0';
printf("接收到数据:%s",buff);
}
//关闭套接字
::closesocket(s);
return 0;
}
在使用WSAStartup的使用出现了下面的问题: 源码:
#include < windows.h >
int
{
}
出现的错误信息:
错误1 error LNK2019: 无法解析的外部符号 _WSAStartup@8,该符号在函数 _main 中被引用 CompletePortDemo.obj CompletePortDemo
解决方法:添加#pragmacomment(lib,"ws2_32.lib")
正确代码:
#include < windows.h >
#pragma
int
{
}