这学期主要利用周末时间,做了个兼职,主要是帮那边的老师搭建个做实验的门户网站和有关信誉机制的实验的软件:包括客户端和服务端。
那么值得总结的只有两方面,一方面是socket变成,一方面是MFC的一些操作。
SOCKET:
sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程是采用的流式套接字。
服务器端编程的步骤:
1:加载套接字库,创建套接字(WSAStartup()/socket());
WSAStartup(MAKEWORD(2,2),&wsaData);
server =socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrInfo;
addrInfo.sin_family = AF_INET;
addrInfo.sin_port = htons(80);
addrInfo.sin_addr.S_un.S_addr = htons(INADDR_ANY);
2:绑定套接字到一个IP地址和一个端口上(bind());
bind(server,(SOCKADDR *)&addrInfo,sizeof(addrInfo);
3:将套接字设置为监听模式等待连接请求(listen());(非必须)
listen(socket,int);
4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());
SOCKADDR_IN addAddr;
int addAddrLen = sizeof(addAddr);
memset(&addAddr,0,addAddrLen);
client[connectedNum] = accept(server,(SOCKADDR*)&addAddr,&addAddrLen);
5:用返回的套接字和客户端进行通信(send()/recv());
send(client[num],(char*)&tsocksend,sizeof(sockSend),0);
6:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
客户端编程的步骤:
1:加载套接字库,创建套接字(WSAStartup()/socket());
WSADATA wasdata;
WORD ver = MAKEWORD(2,2);
SOCKADDR_IN addr;
// initialize
if (WSAStartup(ver,&wasdata))
{
MessageBox(NULL,L"wsastartup wrong",NULL,NULL);
}
//socket
//CString cip;
client = socket(AF_INET,SOCK_STREAM,0);
addr.sin_family = AF_INET;
addr.sin_port = htons(80);
addr.sin_addr.S_un.S_addr = inet_addr(tip);//最简单的处理方式
2:向服务器发出连接请求(connect());
connect(client,(SOCKADDR*)&addr,sizeof(addr));
3:和服务器端进行通信(send()/recv());
同服务端处理!
4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。
除此之外,还涉及到阻塞模式和非阻塞模式。以recv函数为例,简单的说,阻塞模式会一直等待套接字发送过来的信息,如果没等到就会一直等,直到收到信息;而非阻塞模式会设置一个超时时间,超过时间了就不再等,返回-1.
unsigned long ul=1;
int ret;
ret=ioctlsocket(client[connectedNum],FIONBIO,(unsigned long *)&ul);//设置成非阻塞模式。
int nNetTimeout=3000;//3秒
//设置接收超时
setsockopt(client[connectedNum],SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout, sizeof(int));