请输入您要查询的百科知识:

 

词条 从容关闭
释义

从容关闭即按下菜单键选择关机,或用ALT+F4

SOCKET 编程套接字实现

closesocket(client);

WSACleanup();//关闭连接

CListBox 实现自动往下滚 m_list.SetCurSel(m_list.GetCount()-1);

10093

int shutdown(

__in SOCKET s,

__in int how

);//使SOCKET对象失去发送和接收对象的能力

根据参数的不同 效果也不懂 当 how 为SD_RECEIVE,SD_SEND,SD_BOTH 分别对作用是 失去 发送,接受,两者都不能的能力

一个完整的断开SOCKET的过程

1. Call WSAAsyncSelect to register for FD_CLOSE notification.//

第一步在用到以Windows消息为基础的网络事件通知的时候才用

2. Call shutdown with how=SD_SEND.

3. When FD_CLOSE received, call recv until zero returned, or SOCKET_ERROR.

4. Call closesocket.

WSACleanup 停止使用Winsock 2 DLL (Ws2_32.dll).

int WSACleanup(void);

printf遇0则结束

shutdown 后 还可以使用该SOCKET

if(printf("hello world\"),5<=1,5>2,5<6) 奇怪的if写法 只看最后表达式是否正确 正确后才执行 {}中的语句

创建用户列表(数组)客户端与客户端连接 链接数据库 存储聊天记录

用户信息表

用户名

聊天记录表结构

用户名ID 内容 时间

用户登录情况表

用户名ID 登录时间 登录IP

1、 S启动两个网络侦听,一个叫【主连接】侦听,一个叫【协助打洞】的侦听。

2、 A和B分别与S的【主连接】保持联系。

3、当A需要和B建立直接的TCP连接时,首先连接S的【协助打洞】端口,并发送协助连接申请。同时在该端口号上启动侦听。注意由于要在相同的网络终端上绑定到不同的套接字上,所以必须为这些套接字设置 SO_REUSEADDR 属性(即允许重用),否则侦听会失败。

4、 S的【协助打洞】连接收到A的申请后通过【主连接】通知B,并将A经过NAT-A转换后的公网IP地址和端口等信息告诉B。//每次connect时使用的都是不同的端口

5、 B收到S的连接通知后首先与S的【协助打洞】端口连接,随便发送一些数据后立即断开,这样做的目的是让S能知道B经过NAT-B转换后的公网IP和端口号。/////(同上 多余的吧)

6、 B尝试与A的经过NAT-A转换后的公网IP地址和端口进行connect,根据不同的路由器会有不同的结果,有些路由器在这个操作就能建立连接(例如我用的TPLink R4'02),大多数路由器对于不请自到的SYN请求包直接丢弃而导致connect失败,但NAT-A会纪录此次连接的源地址和端口号,为接下来真正的连接做好了准备,这就是所谓的打洞,即B向A打了一个洞,下次A就能直接连接到B刚才使用的端口号了。

7、 客户端B打洞的同时在相同的端口上启动侦听。B在一切准备就绪以后通过与S的【主连接】回复消息“我已经准备好”,S在收到以后将B经过NAT-B转换后的公网IP和端口号告诉给A。

8、 A收到S回复的B的公网IP和端口号等信息以后,开始连接到B公网IP和端口号,由于在步骤6中B曾经尝试连接过A的公网IP地址和端口,NAT-A纪录了此次连接的信息,所以当A主动连接B时,NAT-B会认为是合法的SYN数据,并允许通过,从而直接的TCP连接建立起来了。

// 客户节点信息

struct stUserListNode

{

char userName[10];

unsigned int ip;

unsigned short port;

};

CList是一个双向链表类。

1、头文件名不可少

Clist类定义在Afxtempl.h 头文件中,因此在使用该类时,需要加这个头文件名。

CList list;

CString str1="hello";

CString str2="world";

CString str3="my";

CString str4="life";

list.AddTail(str1);

list.AddTail(str2);

list.AddTail(str3);

list.AddTail(str4);

POSITION pos = list.GetHeadPosition();

while(pos!=NULL)

{

pDC->TextOut(200,200,GetNext( POSITION& rPosition ) );//假设代码是在View类中的OnDraw()

//函数里

}

//struct 结构定义

struct struct-name : inheritance-list {

public-members-list;

protected:

protected-members-list;

private:

private-members-list;

} object-list;

//object-list 对象类表

//inheritance-list 继承列表

//默认 public

//union 联合定义 和结构相比 没有继承特性 不能定义protected 保护成员

union union-name {

public-members-list;

private:

private-members-list;

} object-list;

struct stMessage

{

int iMessageType;

union _message

{

stLoginMessage loginmember;

stLogoutMessage logoutmember;

stP2PTranslate translatemessage;

}message;

};//奇怪的 数组定义方式

for(int i=0;i

{}//c++for语句是;隔开的

随便看

 

百科全书收录4421916条中文百科知识,基本涵盖了大多数领域的百科知识,是一部内容开放、自由的电子版百科全书。

 

Copyright © 2004-2023 Cnenc.net All Rights Reserved
更新时间:2024/11/16 13:39:00