winsock2之服务器程序的简单实现
1.在使用socket函数前需要定义一个结构体:
WSADATA wsaData;
2.对wsaData进行填充:
int wsaret=WSAStartup(0x101,&wsaData); // 第一个参数指定了程序允许使用的WinSock规范的最高版本
if (wsaret != 0) // 返回值为0则成功,否则失败
return;
3.声明套接字地址:
sockaddr_in local; // TCP/IP套接字地址
4.填充local结构体:
local.sin_family=AF_INET; // 地址族
local.sin_addr.s_addr=INADDR_ANY; // 网际IP地址
local.sin_port=htons((u_short)20248); // 使用的端口
5.创建Socket:
SOCKET server=socket(AF_INET,SOCK_STREAM,0);
if(server==INVALID_SOCKET) // 如果创建失败,则返回(~0)
return;
6.绑带套接字和地址:
if ( bind(server,(sockaddr*)&local,sizeof(local))!=0 ) // 填值的时候使用sockaddr_in结构,而作为函数的参数传入的 return; // 时候转换成sockaddr结构
7.监听来自客户端的连接:
if( listen(server,10)!=0 ) // 第二个参数为最大连接数,返回0则成功
return;
8.声明客户端变量:
SOCKET client;
sockaddr_in from;
int fromlen=sizeof(from);
9.保存客户端的套接字:
while(true) // 无限循环
{
char temp[512];
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); // 简单地向客户端发送这个字符串
closesocket(client); // 关闭客户端套接字
}
10.关闭服务器端套接字,并释放套接字描述符:
closesocket(server);
11.清除socket:
WSACleanUp();
应用程序或DLL在使用Windows Sockets服务之前必须要进行一次成功的WSAStartup()调用.当它完成了Windows Sockets的使用后,应用程序或DLL必须调用WSACleanup()将其从Windows Sockets的实现中注销,并且该实现释放为应用程序或DLL分配的任何资源.任何打开的并已建立连接的SOCK_STREAM类型套接口在调用WSACleanup()时会重置; 而已经由closesocket()关闭却仍有要发送的悬而未决数据的套接口则不会受影响--该数据仍要发送.
测试函数:
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
printf("Press ESCAPE to terminate program.\n");
AfxBeginThread(ServerThread,0);
while(_getch()!=27);
return nRetCode;
}
// ServerThread函数就是上面的步骤的整合

浙公网安备 33010602011771号