昨天想用socket做一个简单的windows程序, 先拿来了以前在vc6.0上做的一小段代码, 竟然发现在vs2008上不能运行.出现了好多链接错误, 研究了好半天也没有发现是怎么回事.>下来是代码和 错误信息.
正在链接...>
1>tem.obj : error LNK2019: 无法解析的外部符号 __imp__closesocket@4,该符号在函数 _main 中被引用1>tem.obj : error LNK2019: 无法解析的外部符号 __imp__inet_ntoa@4,该符号在函数 _main 中被引用1>tem.obj : error LNK2019: 无法解析的外部符号 __imp__sendto@24,该符号在函数 _main 中被引用1>tem.obj : error LNK2019: 无法解析的外部符号 __imp__recvfrom@24,该符号在函数 _main 中被引用
1>tem.obj : error LNK2019: 无法解析的外部符号 __imp__bind@12,该符号在函数 _main 中被引用
1>tem.obj : error LNK2019: 无法解析的外部符号 __imp__htons@4,该符号在函数 _main 中被引用
1>tem.obj : error LNK2019: 无法解析的外部符号 __imp__htonl@4,该符号在函数 _main 中被引用
1>tem.obj : error LNK2019: 无法解析的外部符号 __imp__socket@12,该符号在函数 _main 中被引用
1>tem.obj : error LNK2019: 无法解析的外部符号 __imp__WSACleanup@0,该符号在函数 _main 中被引用
1>tem.obj : error LNK2019: 无法解析的外部符号 __imp__WSAStartup@8,该符号在函数 _main 中被引用
1>d:\My Documents\Visual Studio 2008\Projects\tem\Debug\tem.exe : fatal error LNK1120: 10 个无法解析的外部命令
代码是:
#include<Winsock2.h>
#include<stdio.h>
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return 1;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return 1;
}
SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);
sockaddr_in addrSrv;
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(4546);
bind(sockSrv,(sockaddr*)&addrSrv,sizeof(sockaddr));
char recvBuf[100];
char sendBuf[100];
char temBuf[200];
sockaddr_in addrClient;
int len=sizeof(sockaddr);
while(1){
recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR *)&addrClient,&len);
if('q'==recvBuf[0]){
sendto(sockSrv,"q",strlen("q")+1,0,(SOCKADDR *)&addrClient,len);
printf("Chat end!\n");
break;
}
sprintf(temBuf,"%s say: %s",inet_ntoa(addrClient.sin_addr),recvBuf);
printf("%s\n",temBuf);
printf("Please input da ta:\n");
gets(sendBuf);
sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR *)&addrClient,len);
}
closesocket(sockSrv);
WSACleanup();
}
编译没有问题的, 主要是链接上的错误,所以就去查msdn。第一次竟然没有发现是哪的错,后在csdn上search了一下后才发现好像是在08上写socket要加上新的链接库 Ws2_32.lib.再查msdn,要求如下:
Header Declared in Winsock2.h.
Library Use Ws2_32.lib.
DLL Requires Ws2_32.dll.
加上后果然成功了。
在新的08上要加入链接库 方法:项目>属性->配置属性->链接器->输入 :附加依赖项 中加入要链接的库即可。
本文还未找到源头