天天看点

winsocket 的最简单的一个例子

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])

{

int nRetCode = 0;

cout << "Press ESCAPE to terminate program/r/n";

AfxBeginThread(ServerThread,0);

while(_getch()!=27);

return nRetCode;

}

UINT ServerThread(LPVOID pParam)

{

// SOCKET其实是unsigned int的一个typedef。

// 在Unix中,套接字句柄就像文件句柄一样,都是unsigned int。

// 既然在Windows下这些不是真的,那么我们就定义了一种新的数据类型,名为SOCKET。

SOCKET server;

// WSADATA是一个struct,WSAStartup的调用将会填充之。

WSADATA wsaData;

// sockaddr_in为TCP/IP套接字指定了套接字的地址。

// 其它的协议都使用相似的结构。

sockaddr_in local;

// WSAStartup为程序调用WinSock进行了初始化。

// 第一个参数指定了程序允许使用的WinSock规范的最高版本。

int wsaret=WSAStartup(0x101,&wsaData);

// 如果成功,WSAStartup返回零。

// 如果失败,我们就退出。

if(wsaret!=0)

{

return 0;

}

// 现在我们来为sockaddr_in结构赋值。

local.sin_family=AF_INET; // 地址族

local.sin_addr.s_addr=INADDR_ANY; // 网际IP地址

local.sin_port=htons((u_short)20248); // 使用的端口

// 由socket函数创建我们的SOCKET。

server=socket(AF_INET,SOCK_STREAM,0);

// 如果socket()函数失败,我们就退出。

if(server==INVALID_SOCKET)

{

return 0;

}

// bind将我们刚创建的套接字和sockaddr_in结构联系起来。

// 它主要使用本地地址及一个特定的端口来连接套接字。

// 如果它返回非零值,就表示出现错误。

if(bind(server,(sockaddr*)&local,sizeof(local))!=0)

{

return 0;

}

// listen命令套接字监听来自客户端的连接。

// 第二个参数是最大连接数。

if(listen(server,10)!=0)

{

return 0;

}

// 我们需要一些变量来保存客户端的套接字,因此我们在此声明之。

SOCKET client;

sockaddr_in from;

int fromlen=sizeof(from);

while(true) // 无限循环

{

char temp[512];

// accept()将会接收即将到来的客户端连接。

client=accept(server,

(struct sockaddr*)&from,&fromlen);

sprintf(temp,"Your IP is %s/r/n",inet_ntoa(from.sin_addr));

// 我们简单地向客户端发送这个字符串。

send(client,temp,strlen(temp),0);

cout << "Connection from " << inet_ntoa(from.sin_addr) <<"/r/n";

// 关闭客户端套接字

closesocket(client);

}

// closesocket()关闭套接字,并释放套接字描述符。

closesocket(server);

// 最初这个函数也许有些用处,现在保留它只是为了向后兼容。

// 但是调用它可能会更安全,因为我相信某些实现会使用它来结束WS2_32.DLL的使用。

WSACleanup();

return 0;

}

运行这个服务器,并在它运行的时候使用telnet来连接机器的20248端口。如果你是在同一台机器上使用,那么就连接到localhost。

示例输出

我们将会在服务器上看到这样的输出:

E:/work/Server/Debug>server

Press ESCAPE to terminate program

Starting up TCP server

Connection from 203.200.100.122

Connection from 127.0.0.1

E:/work/Server/Debug>

这是客户端得到的:

[email protected]:~$ telnet 202.89.211.88 20248

Trying 202.89.211.88...

Connected to 202.89.211.88.

Escape character is '^]'.

Your IP is 203.200.100.122

Connection closed by foreign host.

[email protected]:~$