winsocket <研究了一天的成果>

首先,这都是套路( ▼-▼ )

头文件     #include <WinSock.h>

#include <Winsock2.h> 用这个,这个是升级版

各个函数解释

1、WSAStartup:

初始化套接字环境,本函数必须是应用程序或DLL调用的第一个Windows Sockets函数.它允许应用程序或DLL指明Windows Sockets API的版本号及获得特定Windows Sockets实现的细节.应用程序或DLL只能在一次成功的WSAStartup()调用之后才能调用进一步的Windows Sockets API函数.

int WSAStartup(WORD  wVersionRequested,  LPWSADATA  lpWSAData);

实际用例

//begin 初始化网络环境
int err = WSAStartup(MAKEWORD(2, 2), &wsaData);
if ( err != 0)
{
    printf("WSAStartup failed with error: %d\n", err);
    return -1;
}//end

2、WSACleanup:

清理套接字环境,和上面的WSAStartup相反,该函数是在程序不在对任何Windows Sockets函数调用后,用其来清理套接字环境的
int  WSACleanup (void);

3、SOCKET socket(int af, int type, int protocol);

建立套接字 参数af用于指定网络地址类型,一般取AF_INET,表示该套接字在Internet域中,进行通信。 参数type用于知道套接字的类型,若取SOCK_STREAM表示创建的套接字是流套接字,而取SOCK_DGRAM创建数字报套接字。参数protocol用于指定网络协议,一般取0,表示默认为TCP/IP协议。 若套接字创建成功则该函数返回创建的套接字句柄SOCKET,否则产生INVALID_SOCKET错误。

实际用例

//begin socket 一个套接字
hTcpSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (INVALID_SOCKET == hTcpSocket)
{
MJS_LOG_ERROR("socket failed with error: \n");
WSACleanup();
return -1 ;
}//end

4、int listen(SOCKET s, int backlog);

将套接字置入监听模式并准备接受连接请求。其中,参数s是服务器端套接字,于指定正在等待连接的最大队列长度。如无错误发生,listen函数返回0,失败则返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。

5、SOCKET accept( SOCKET s, struct sockaddr* addr, int* addrlen );

参数s同上,addr是一个有效的SOCKADDR_IN结构的地址,而addrlen是sockaddr_in结果的长度。accept函数返回后,addr参数变量中会包含发出连接请求的那个客户机的IP地址信息,而addrlen参数则指出该结构的长度,并返回一个新的套接字描述符,它对应于已经接受的那个客户机连接。

6、 int bind( SOCKET s, const struct sockaddr* name, int namlen );

绑定到本地,name中指定的IP应该是当前运行该程序机器的IP。

7、int connect( SOCKET s, const struct sockaddr FAR* name, int namelen );

连接到服务器

实际用例

int ServePort=20000;
char ServeIP[32]="192.168.1.200";
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(ServePort);
addr.sin_addr.S_un.S_addr = inet_addr(ServeIP);
//连接服务器
if (connect(hTcpSocket, (sockaddr*)&addr, sizeof(sockaddr)) == -1)
{
    closesocket(hTcpSocket);
    printf("connect Tradesys failed with error%d,%s,%d: \n",ServePort,ServeIP,GetLastError());
    WSACleanup();
    return -1;
}
else
{
    printf("connect Tradesys sucessed,%d,%s: \n",ServePort,ServeIP);
}

若无错误发生,则connect()返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。对阻塞套接口而言,若返回值为SOCKET_ERROR则应用程序调用WSAGetLsatError()。如果它指出错误代码为WSAEWOULDBLOCK,则您的应用程序可以:

1.用select(),通过检查套接口是否可写,来确定连接请求是否完成。或者,

2.如果您的应用程序使用基于消息的WSAAsynSelect()来表示对连接事件的兴趣,则当连接操作完成后,您会收到一个FD_CONNECT消息。

8、 int send( SOCKET s, const char* buf, int len, int flags );

失败时返回 -1/SOCKET_ERROR

sockfd:已建立连接的发送端套接字描述符(非监听描述符)

buf:应用要发送数据的缓存

len:实际要发送的数据长度

flags:一般设置为0。  flags可取的值有:0、MSG_DONTROUTE或MSG_OOB或这些标志的按位或运算。

9、int recv( SOCKET s, char* buf, int len, int flags );

s是准备接收数据的套接字,buf是即将收到数据的字符缓冲区,而len则是准备接受的字节数或buf缓冲的长度。flags一般指定为0.参数可以是0、MSG_PEEK或MSG_OOB或这些标志的按位“或”运算。

表示从接收缓冲区拷贝数据。成功时,返回拷贝的字节数,失败返回-1。阻塞模式下,recv/recvfrom将会阻塞到缓冲区里至少有一个字节(TCP)/至少有一个完整的UDP数据报才返回,没有数据时处于休眠状态。若非阻塞,则立即返回,有数据则返回拷贝的数据大小,否则返回错误-1,置错误码为EWOULDBLOCK。

10、int shutdown( SOCKET s, int how );

其中,how参数用于描述禁止哪些操作,它可取的值有:SD_RECEIVE、SD_SEND或SD_BOTH。 如果是SD_RECEIVE,就表示不允许再调用接收函数, 如果选择SD_SEND,表示不允许再调用发送函数, 如果是SD_BOTH, 则表示取消连接两端的收发操作。 如果没有错误发生,shutdown()返回0,否则返回SOCKET_ERROR错误。

11、 int closesocket(SOCKET s );

s是要关闭的套接字描述字,再利用套接字执行调用就会失败。

12 int gethostname(char *name, size_t len):

这个函数,调用后,会将主机名保存在name里面。而len是name的大小。该函数返回0表示成功,否则失败。

13、struct hostent *gethostbyname(const char *name);
hostent结构:

struct hostent
{
     char *h_name;           //*h_name 表示的是主机的规范名
     char **h_aliases;       //h_aliases 表示的是主机的别名
     int h_addrtype;          //地址类型AF_INET,还是AF_INET6
     int h_length;             //IP地址占字节数
     char **h_addr_list;   //IP地址列表
};

int   **h_addr_lisst 表示的是主机的ip地址 注意 是以网络字节序存储的。

14、const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt) ;

这个函数,是将类型为af的网络地址结构src,转换成主机序的字符串形式,存放在长度为cnt的字符串中。这个函数,其实就是返回指向dst的一个指针。如果函数调用错误,返回值是NULL。

15、struct hostent FAR *PASCAL FAR gethostbyaddr(const char FAR * addr, int len, int type);

参数addr:指向网络字节顺序地址的指针。 参数len: 地址的长度,在PF_INET类型地址中为4。 参数type:指地址类型AF_INET、IF_INET6

16、inet_ntoa( char FAR* PASCAL FAR inet_ntoa( struct in_addr in);

将网络地址转换成“.”点隔的字符串格式。本函数将一个用in参数所表示的Internet地址结构转换成以“.” 间隔的诸如“a.b.c.d”的字符串形式。请注意inet_ntoa()返回的字符串存放在WINDOWS套接口实现所分配的内存中。应用程序不应假设该内存是如何分配的。在同一个线程的下一个WINDOWS套接口调用前,数据将保证是有效。

参数in:一个表示Internet主机地址的结构。

返回值:若无错误发生,inet_ntoa()返回一个字符指针。否则的话,返回NVLL。其中的数据应在下一个WINDOWS套接口调用前复制出来。

17、unsigned long inet_addr(  const char   FAR *cp);

将点格式的IP地址转换为无符号类型存储。

18、u_short PASCAL FAR htons( u_short hostshort);

作用是将主机的无符号短整形数转换成网络字节顺序。

19、 u_short PASCAL FAR ntohs( u_short netshort);

20、u_long PASCAL FAR htonl( u_long hostlong);

本函数将一个32位数从主机字节顺序转换成网络字节顺序。

实际用例

//将主机的unsigned long值转化为网络字节顺序(32位),使用函数htonl()
//参数hostlong标识主机字节顺序的数字,函数返回一个网络字节顺序的数字
#include <winsock.h>
#include <stdio.h>
#pragma comment (lib,"ws2_32.lib")
void main()
{
u_long a = 0x12345678;
u_long b = htonl(a);
printf("%u/n",a);
printf("%x/n",a);
printf("%u/n",b);
printf("%x/n",b);
}

21、u_long PASCAL FAR ntohl( u_long netlong);
将一个无符号长整形数从网络字节顺序转换为主机字节顺序。
参数netlong:一个以网络字节顺序表达的32位数。
返回值:ntohl()返回一个以主机字节顺序表达的数。

//将32位网络字节转换为主机字节,使用函数ntohl()
//定义如下
u_long ntohl(u_long netlong);
#include <WINSOCK2.H>
#include
<stdio.h>
#pragma comment(lib,"ws2_32.lib")
void
main()
{
u_long a = 0x12345678;
u_long b =
ntohl(a);
printf("%u/n",a);
printf("%x/n",a);
printf("%u/n",b);
printf("%x/n",b);
}

错误代码:

WSANOTINITIALISED:在使用此API之前应首先成功地调用WSAStartup()。

WSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。

WSAEINVAL:超时时间值非法。

WSAEINTR:通过一个WSACancelBlockingCall()来取消一个(阻塞的)调用。

WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。

WSAENOTSOCK:描述字集合中包含有非套接口的元素。

WSAEADDRINUSE:所指的地址已在使用中。

WSAEADDRNOTAVAIL:在本地机器上找不到所指的地址。

WSAENOTSUPPORT:所指族中地址无法与本套接口一起使用。

WSAECONNREFUSED:连接尝试被强制拒绝。

WSAEDESTADDREQ:需要目的地址。

WSAEFAULT:namelen参数不正确。

WSAEINVAL:套接口没有准备好与一地址捆绑。

WSAEISCONN:套接口早已连接。

WSAEMFILE:无多余文件描述字。

WSAENETUNREACH:当前无法从本主机访问网络。

WSAENOBUFS:无可用缓冲区。套接口未被连接。

WSAENOTSOCK:描述字不是一个套接口。

WSAETIMEOUT:超时时间到。

WSAEWOULDBLOCK:套接口设置为非阻塞方式且连接不能立即建立。可用select()调用对套接口写,因为select()时会进行连接。

时间: 2024-10-27 03:06:57

winsocket <研究了一天的成果>的相关文章

关于埃博拉(Ebola)病毒的基础研究

2005年,美国哈佛大学医学研究院(Harvard Medical School)James Cunningham教授关于埃博拉病毒有一项基础研究,研究成果发表于当年的<科学>杂志上,此项研究受到美国国家卫生部的支持.请见文章:Scientists discover how Ebola virus infects cells(发表于2005年4月16日). "how Ebola virus infects cells"(埃博拉病毒怎样感染细胞),这是一个基本问题.这是解决治

知识图谱研究进展

在原文<知识图谱研究进展>基础上上做了相应的调整和补充 本文首先简要回顾知识图谱的历史,探讨知识图谱研究的意义.其次,介绍知识图谱构建的关键技术,包括实体关系识别技术.知识融合技术.实体链接技术和知识推理技术等.然后,给出现有开放的知识图谱数据集的介绍.最后,给出知识图谱在情报分析中的应用案例. - 漆桂林.高桓.吴天星 东南大学计算机科学与工程学院 本文节选自<情报工程>2017 年第 1 期,知识图谱专题稿件. 1 知识图谱构建技术 ??本节首先给出知识图谱的技术地图,然后介绍

王立铭、饶毅、张向南三人谈:“大学的意义”

撰文 | 王立铭(浙江大学生命科学研究院教授) 责编 | 李晓明 其实从感情角度说,我支持几位教授的忧虑和呼吁. 我是一个晚辈科学家和大学教授,我热爱我的工作,我也觉得探索未知世界真的是这世界上最美好的事业.平心而论,如果我的学生有一天告诉我,他或者她对自己的研究心生厌倦,或是在锱铢必较地比较两份工作合同的薪水高低,我应该也会觉得有点沮丧和失望.我也同样相信,我们这个古老国家的复兴历程里,离不开科学精神的再次启蒙,离不开基础研究的兴盛发达. 但是就像罗素说过的,须知参差多态,乃是幸福的本源. 我

【本/硕毕业生】开题报告及论文指导思路和撰写事项的整理

开题报告及论文撰写注意事项 作者 白宁超 2015年11月5日22:31:32 摘要:对于大多本科毕业生或者硕士毕业生,文档和论文是最为头疼的事情.倘若提及技术,莫不是浑身充满力气,打了鸡血一样兴奋.特别有几个技术圈子的朋友,路上,餐厅都还是技术的话题.然而,面临大四的毕业生,论文该如何写,什么样的思路?怎样的格式?诸如此类对大多数应届毕业生都是一个考验.即便硕士,面对研二的开题,研三的课题研究和论文,也会面临同样的问题.笔者最近在做开题方面的工作,整理了一些不错的开题和论文方面的资料与大家共享

基金申请

完全转自小木虫http://emuch.net/html/201108/3526317.html 1.立项依据:     立项依据是开篇第一项,主要说明是WHAT和WHY的问题,即这个申请要做什么,为什么要研究这个东西.有人说立项依据像综述,但是我感觉它应该比综述更 全面.我们看综述,是通过检索文献来查找自己感兴趣的主题,进行主动式的阅读.也就是说在阅读这个综述之前我们已经有了较好的阅读基础.但是基金的立项依 据不同,作为评审人他没有主动选择看这个或看那个项目申请书的权利,他只能被动地接收分配给

国外免费空间以及申请免费域名建站

搜索了一下,国外各大免费空间 包括freehostia,host1free,x10hosting,可惜这三个网站在公司打不开: 另外还有付费的Godaddy,Bluehost,Hostgator,没有仔细看过: 其他还有很多网友用别称称呼的,并没有百度到: 比较出名的好像是000webhost,有网友称为三蛋... 最后发现了这个sourceforge.net,有很多人在用的PHP空间,决定去申请一下. 以下属于COPY内容,仅供参考: 谷歌10GB免费空间Google App Engine注册

【抽象代数】 03 - 商群和直积

1. 陪集 现在继续研究群的分解,先来讨论一般子群之间.以及子群和父群的关系.首先根据子群的判定条件,如果\(H,K\leqslant G\),则很容易有\(H\cap G\leqslant G\).那么\(H\cup G\)呢?当然这里\(H,K\)都是真子群,并且不互相包含.从\(H\)中取元素\(h\not\in K\),从\(K\)中取元素\(k\not\in H\),则容易证明\(hk\not\in H\cup G\),从而\(H,K\)一定不是\(G\)的子集. 如果再把\(hk\)

神经网络训练中的Tricks之高效BP(反向传播算法)

神经网络训练中的Tricks之高效BP(反向传播算法) 神经网络训练中的Tricks之高效BP(反向传播算法) [email protected] http://blog.csdn.net/zouxy09 Tricks!这是一个让人听了充满神秘和好奇的词.对于我们这些所谓的尝试应用机器学习技术解决某些问题的人,更是如此.曾记得,我们绞尽脑汁,搓手顿足,大喊“为什么我跑的模型不work?”,“为什么我实现的效果那么差?”,“为什么我复现的结果没有他论文里面说的那么好?”.有人会和你说“你不懂调参!

脑科学与云计算,大数据,互联网

摘要 : 研究者已经从不同方面对物联网,云计算,大数据进行了深入研究并取得诸多成果.但还存在一些问题等待解决,例如,物联网,云计算,大数据与互联网是怎样的关系,它们之间又是如何区分和关联的.本世纪初开始的互联网与脑科学的交叉对比研究,为分析物联网,云计算,大数据与互联网的关系奠定了基础. 1   脑科学与互联网 本世纪初,随着互联网的发展,不断有新的应用和概念诞生,其中物联网,云计算和大数据得到了研究者的重点关注,并引起广泛的研究热潮. 研究者已经从不同方面对物联网,云计算,大数据进行了深入研究