关于winsock的问题
写了个简单的tcp server,dev-cpp下无法生成.exe,麻烦大家指点迷津
//InitSock.h
#include <winsock2.h>
#pragma comment(lib, "WS2_32 ")
class CInitSock //初始化winsock
{
public:
CInitSock(BYTE minorVer=2,BYTE majorVer=2)
{
WSADATA wsaData;
WORD sockVersion=MAKEWORD(minorVer,majorVer);
if(::WSAStartup(sockVersion,&wsaData)!=0) //WSAStartup fill wsaData
exit(0);
}
~CInitSock()
{ ::WSACleanup();}
};
//TcpServer.cpp
#include "InitSock.h "
#include <iostream>
using namespace std;
CInitSock initSock;
int main()
{
SOCKET sListen=socket(AF_INET,SOCK_STREAM,0);// create sListen
if(sListen=INVALID_SOCKET)
{
cout < < "Failed socket()! " < <endl;
return 0;
}
sockaddr_in sin; //fill sin
sin.sin_family=AF_INET;
sin.sin_port=htons(4567);
sin.sin_addr.S_un.S_addr=INADDR_ANY;
if(::bind(sListen,(LPSOCKADDR)&sin,sizeof(sin))==SOCKET_ERROR) //bind
{
cout < < "Failed bind()! " < <endl;
return 0;
}
if(::listen(sListen,2)==SOCKET_ERROR) //listen
{
cout < < "Failed listen()! " < <endl;
return 0;
}
sockaddr_in remoteAddr;
int nAddrLen=sizeof(remoteAddr);
SOCKET sClient;
char szText[]= "TCP Server Demo!\n ";
while(TRUE) //循环接受连接
{
sClient=::accept(sListen,(SOCKADDR*)&remoteAddr,&nAddrLen);
if(sClient=INVALID_SOCKET)
{
cout < < "Failed accept()! " < <endl;
return 0;
}
cout < < "Receive an access: " < <inet_ntoa(remoteAddr.sin_addr) < <endl;
::send(sClient,szText,sizeof(szText),0);
::closesocket(sClient);
}
::closesocket(sListen);
return 0;
}
控制台下
D:\SOFTWA~1\SOURCE~1\design> g++ *.cpp
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp/ccAzaaaa.o(.text+0x145):TcpServer.cpp: undefined reference to `socket@12 '
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp/ccAzaaaa.o(.text$_ZN9CInitSockD1Ev[CInitSock::~CInitSock()]+0x7):TcpServer.cpp: undefined reference to `WSACleanup@0 '
C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp/ccAzaaaa.o(.text$_ZN9CInitSockC1Ehh[CInitSock::CInitSock(unsigned char, unsigned char)]+0x3f):TcpServer.cpp: undefined reference to `WSAStartup@8 '
collect2: ld returned 1 exit status
[解决办法]
g++ *.cpp -lwsock32
[解决办法]
在一个工程里吗?那就在 Project Options 对话框的 Parameters 的 Linker 里加上“-lws2_32”。
否则是单一文件的话,在 Complie Options 对话框中 Compiler 页中的“Add the following commands when calling compiler: ”一栏里加上“-lws2_32”,记得还要勾上啊。