by zxy,Java/C++编程交流群:168424095
(1) 介绍
面向连接的Socket通信时基于TCP的。
TCP:Transmission Control Protocol 传输控制协议。TCP是一种面向连接(连接导向)的、可靠的、基于字节流的运输层(Transport layer)通信协议。
(2)通信流程
服务器和客户端进程实现面向连接的Socket通信的过程及调用的函数
服务器程序要先于客户端程序启动。
(3)函数的使用方法
(3.1)socket()函数用于创建与指定的服务器提供者绑定套接字,函数原型:
SOCKET socket(int af,//指定协议的地址家族,对于TCP/IP协议族,该参数置AF_INET
int type,//指定套接字的类型
int protocol//套接字使用的协议,一般取0,系统会根据套接字的类型决定应使用的传输层协议
);
函数执行成功,返回新Socket的句柄,失败,返回INVALID_SOCKET。
套接字类型:
SOCK_STREAM 提供顺序、可靠、双向和面向连接的字节流数据传输机制,使用TCP
SOCK_DGRAM 支持无连接的数据报,使用UDP
SOCK_RAW 原始套接字,可以用于接收本机网卡上的数据帧或者数据包
#define IPPROTO_TCP 6 /* tcp */
#define IPPROTO_UDP 17 /* user datagram protocol */
举例:socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)
IPPROTO_TCP 指使用tcp协议
(3.2)bind()函数可以将本地地址与一个Socket绑定在一起,函数原型:
int bind()(
SOCKET s, //标识一个未绑定的Socket的描述符
const struct sockaddr FAR* name,//绑定到Sockets的sockaddr结构体地址
int namelen //参数name的长度
);
未发生错误返回0,否则返回SOCKET_ERROR
当使用Internet地址家族时,名称由地址家族、主机地址和端口号3部分组成。
ADDR_ANY,允许底层服务提供者使用任何适当的网络地址。
如:sockaddr_in addrSvr;
addrSvr.sin_family = AF_INET; //地址家族
addrSvr.sin_port = htons(port); //端口
addrSvr.sin_addr.s_addr = htonl(INADDR_ANY);//地址
(3.3)listen()函数可以将套接字设置为监听接入连接的状态,函数原型:
int listen(
SOCKET s,//指定一个已经绑定(执行了bind()函数)但尚未连接的套接字
int backlog //指定等待连接队列的最大长度
);
成功返回0,否则返回SOCKET_ERROR。
(3.4)accept()函数等待接受连接请求,函数原型:
SOCKET accept()(
SOCKET s,//通过调用listen()函数设置为监听状态的Socket
struct socka
想在Silverlight客户端显示服务系统当前时间,效果如下:
服务端DomService中代码如下:
public DateTime GetNow()
{
return DateTime.Now;
}
Silverlight端:
public static void GetSysDate(SelectOneHander<DateTime> so)
{
var m = DB.db.GetNow();
m.Completed += (a, b) => so(m.Value);
}
运行在本机上基本没有问题,今天到客户哪儿就是时间对不上,也没有找出问题的原因,不可替代的方法是将服务端返回的类型从DateTime改为String就可以了,修改后代码:
服务端DomService中代码如下:
public String GetNow()
{
return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
}
Silverlight端:
public static void GetSysDate(SelectOneHander<DateTime> so)
{
var m = DB.db.GetNow();
m.Completed += (a, b) => so(DateTime.Parse(m.Value));
}
记录一下,方便也碰到此问题的同学!
连连看的规则如下,两个相同的棋子必须有通路,且拐点不能超过两个就可以消掉,根据这个原理,也就是下面三种情况的棋子可以消掉
第一种:一条直线上的
就是两个棋子间没有其他任何棋子,这个很好判断,代码如下:(m,n为两个棋子的点坐标)
BOOL Cllk_assistV20Dlg::IsLine(CPoint m,CPoint n) { int min_num,max_num; if (m.x==n.x) { min_num=m.y>n.y?n.y:m.y; max_num=m.y>n.y?m.y:n.y; for (int i=min_num+1;i<max_num;i++) { if (chessdata_int[i][m.x]!=0) { return FALSE; } } return TRUE; } else if (m.y==n.y) { min_num=m.x>n.x?n.x:m.x; max_num=m.x>n.x?m.x:n.x; for (int i=min_num+1;i<max_num;i++) { if (chessdata_int[m.y][i]!=0) { return FALSE; } } return TRUE; } else return FALSE; }
第二种:一个拐角连通 这个可以先找到两个棋子所对应矩形的另外两个顶点t、s,然后用t和s分别和两个棋子做直线连接判断,只要t和s中有一个点能和两个棋子直线连通,说明,两个棋子是一个拐角连通,算法如下:BOOL Cllk_assistV20Dlg::IsOneCorner(CPoint m,CPoint n) { //点m,n不能在一条直线上 if (m.x==n.x||m.y==n.y) { return FALSE; } CPoint temp; temp.x=m.x; temp.y=n.y; if (IsLine(m,temp)&&IsLine(n,temp)&&PointIsEmpty(temp)) { return TRUE; } else { temp.x=n.x; temp.y=m.y; if (IsLine(m,temp)&&IsLine(n,temp)&&PointIsEmpty(temp)) { return TRUE; } } return FALSE;
第三种:两个拐角连通 和上面的类似,遍历其中一个棋子垂直方向的所有可到达坐标点,让每个坐标点和另外一个棋子做一个拐角连通判断,如果水平或者垂直方向上存在这样的坐标点,则两个棋子两个拐角连通BOOL Cllk_assistV20Dlg::IsTwoCorner(CPoint m,CPoint n) { for (int i=0;i<11;i++) //向上找 { if (i==m.y) { continue; } CPoint temp; temp.x=m.x; temp.y=i; if (IsLine(m,temp)&&IsOneCorner(temp,n)&&PointIsEmpty(temp)) { return TRUE; } } for (int i=0;i<19;i++) { if (i==m.x) { continue; } CPoint temp; temp.y=m.y; temp.x=i; if (IsLine(m,temp)&&IsOneCorner(temp,n)&&PointIsEmpty(temp)) { return TRUE; } } return FALSE; }
最后依次判断两个棋子是否符合这三种情况BOOL Cllk_assistV20Dlg::IsConnect(CPoint m,CPoint n) { if (IsLine(m,n)) { return TRUE; } else if (IsOneCorner(m,n)) { return TRUE; } else if (IsTwoCorner(m,n)) { return TRUE; } else return FALSE;}作者:txg703003659 发表于2013-1-5 16:10:58 原文链接阅读:0 评论:0 查看评论