1.基于TCP协议的“hello world!”

1)服务器端:WSAStartup()->socket()->bind()->listen()->accept()->send()/recv()->closesocket()->WSACleanup().

 #include <WinSock2.h>
#pragma comment (lib,"ws2_32") int main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(,),&wsaData); SOCKET s=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP); sockaddr_in sockaddr;
sockaddr.sin_family=PF_INET;
sockaddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
sockaddr.sin_port=htons(); bind(s,(SOCKADDR*)&sockaddr,sizeof(SOCKADDR)); listen(s,); SOCKADDR clientAddr;
int nSize=sizeof(SOCKADDR);
SOCKET clientSock;
clientSock=accept(s,(SOCKADDR*)&clientAddr,&nSize); send(clientSock,"hello client \r\n",strlen("hello client \r\n")+sizeof(char),NULL); closesocket(clientSock);
closesocket(s); WSACleanup();
return ;
}

2)客户端:WSAStartup()->socket()->connect()->recv()/send()->closesocket()->WSACleanup().

 #include <stdio.h>
#include <WinSock2.h>
#pragma comment (lib,"ws2_32") int main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(,),&wsaData); SOCKET s=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP); sockaddr_in sockAddr;
sockAddr.sin_family=PF_INET;
sockAddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
sockAddr.sin_port=htons(); connect(s,(SOCKADDR*)&sockAddr,sizeof(SOCKADDR)); char szBuffer[MAXBYTE]={}; recv(s,szBuffer,MAXBYTE,NULL); printf("szBuffer=%s \r\n",szBuffer); closesocket(s); WSACleanup();
return ;
}

2.基于UDP协议的“hello world!”

1)服务器端:

 #include <WinSock2.h>
#include <stdio.h>
#pragma comment (lib,"ws2_32") int main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(,),&wsaData); SOCKET s=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP); sockaddr_in sockAddr;
sockAddr.sin_family=PF_INET;
sockAddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
sockAddr.sin_port=htons(); bind(s,(SOCKADDR*)&sockAddr,sizeof(SOCKADDR)); sockaddr_in clientAddr;
int len=sizeof(sockaddr_in);
char buf[MAXBYTE]={};
recvfrom(s,buf,MAXBYTE,,(SOCKADDR*)&clientAddr,&len);
printf("%s \r\n",buf); sendto(s,"hello world client",strlen("hello world client")+sizeof(char),,(SOCKADDR*)&clientAddr,sizeof(SOCKADDR)); closesocket(s); WSACleanup();
return ;
}

2)客户端:

 #include <Winsock2.h>
#include <stdio.h>
#pragma comment (lib,"ws2_32") int main()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(,),&wsaData); SOCKET s=socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP); sockaddr_in sockAddr;
sockAddr.sin_family=PF_INET;
sockAddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
sockAddr.sin_port=htons(); sendto(s,"hello world server",strlen("hello world server")+sizeof(char),,(SOCKADDR*)&sockAddr,sizeof(SOCKADDR));
sockaddr_in clientAddr;
int len=sizeof(sockaddr_in);
char buf[MAXBYTE]={};
recvfrom(s,buf,MAXBYTE,,(SOCKADDR*)&clientAddr,&len);
printf("%s \r\n",buf); closesocket(s); WSACleanup();
return ;
}

3.Winsock的相关函数:

1)初始化ws2_32.dll的函数:int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);

参数说明:1> wVersionRequested:Windows Sockets API提供的调用方可使用的最高版本号。

     2> lpWSAData:指向WSADATA结构的指针,用来接收Windows Sockets实现的细节。

2)释放ws2_32.dll的函数:int WSACleanup(void);

3)创建套接字:SOCKET socket(int af,int type,int protocol);

参数说明:1> af:指定应用程序使用的通信协议簇,对于TCP/IP协议簇,该参数始终为PF_INET。

     2> type:指定套接字的类型,流套接字为SOCK_STREAM,为TCP协议使用;数据包套接字为SOCK_DGRAM,为UDP协议使用。

     3> protocol:指定应用程序所使用的通信协议。TCP:IPPROTO_TCP; UDP:IPPROTO_UDP。

4)关闭套接字:int closesocket(SOCKET s);

参数说明:s:套接字描述符。

5)绑定IP地址和端口号:int bind(SOCKET s,const struct sockaddr FAR *name,int namelen);

参数说明:1> s;指定待绑定的Socket描述符。

       2> name:指定一个sockaddr结构:

 struct sockaddr{
u_short sa_family;
char sa_data[];
};

实际使用过程中,结构体是sockaddr_in:

  struct sockaddr_in{
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[];
};

成员变量sin_family设置为PF_INET;sin_port设置为端口号;sin_addr结构体中只包含一个公用体:

 struct in_addr{
union{
struct { u_char s_b1, s_b2, s_b3, s_b4;} S_un_b;
struct { u_short s_w1, s_w2; } S_un_w;
u_long S_addr;
}S_un;
};

该成员变量为一个整数,一般用函数inet_addr()把字符串形式的IP地址转换为unsigned long整型的整数值。

      3> namelen:指定name缓冲区的长度。

6)监听端口:int listen(SOCKET s,int backlog);

参数说明:1> s:使套接字s处于监听状态。

       2> backlog:为s维护一个客户连接请求队列。

7)接受请求:SOCKET accept(SOCKET s,struct sockaddr FAR *addr,int FAR *addrlen);

参数说明:1> s:指定处于监听状态的套接字。

     2> addr:用来返回新创建的套接字的地址。

       3> addrlen:addr的长度。

8)连接:int connect(SOCKET s,const struct sockaddr FAR *name,int namelen);

参数说明:1> s:客户端创建的套接字。

       2> name:该结构中包含了服务器端中的IP地址和端口号。

       3> namelen:指定name缓冲区的长度。

9)基于TCP的发送函数:int send(SOCKET s,const char FAR *buf,int len,int flags);

参数说明:1> s:指定发送端套接字描述符。

     2> buf:指明一个存放应用程序要发送数据的缓冲区。

     3> len:指明实际要发送的数据的字节数。

       4> flags:一般设置为0。

10)基于TCP的接收函数:int recv(SOCKET s,char FAR *buf,int len,int flags);

参数说明:1> s:指定接收端套接字描述符。

     2> buf:指定一个存放接收到的数据的缓冲区。

     3> len:指定缓冲区长度。

       4> flags:一般设置为0。

11)基于UDP的发送函数:int sendto(SOCKET s,const char FAR *buf,int len,int flags,const struct sockaddr FAR *to,int tolen);

12)基于UDP的接收函数:int sendto(SOCKET s,char FAR *buf,int len,int flags,struct sockaddr FAR *from,int FAR *fromlen);

13)数据存储的字节顺序:本地字节顺序根据CPU架构的不同可能是小尾方式,也可能是大尾方式,如在x86CPU架构上使用小尾顺序,即高位存放高字节,低位存放低字节。而网络字节顺序一定是大尾方式。

本地字节顺序转换为网络字节顺序的函数:u_short htons(u_short hostshort);     u_long htonl(u_long hostlong);

网络字节顺序转换为本地字节顺序的函数:u_short ntohs(u_short netshort);     u_long ntohl(u_long netlong);

        

Winsock版本的“hello world!”的更多相关文章

  1. WinSock网络编程基础(1)

    记录学习windows网络编程过程中遇到的问题和相关笔记 基本概念: Socket: socket起源于UNIX,Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.基于&qu ...

  2. winsock编程IOCP模型实现代码

    winsock编程IOCP模型实现代码 话不多说,上代码.借鉴<windows核心编程>部分源码和CSDN小猪部分代码. stdafx.h依赖头文件: #include <iostr ...

  3. Winsock网络编程

    Winsock是Windows下网络编程的标准接口.使用Winsock编程的步骤一般是比较固定的. 首先要包含头文件#include <WinSock2.h>,同时要添加WS2_32.li ...

  4. Winsock 示例

    #include "stdafx.h" #include <Windows.h> #include <iostream> #pragma comment(l ...

  5. Windows平台VC++ 6.0 下的网络编程学习 - 简单的测试winsock.h头文件

    最近学习数据结构和算法学得有点累了(貌似也没那么累...)...找了本网络编程翻了翻当做打一个小基础吧,打算一边继续学习数据结构一边也看看网络编程相关的... 简单的第一次尝试,就大致梳理一下看书+自 ...

  6. Windows 网络编程

    网络编程 API ,失败返回 -,错误代码 WSASYSNOTREADY 表示基础网络子系统没有准备好网络通行,WSAVERNOTSUPPORTED 表示 Socket 版本不支持,WSAEINPRO ...

  7. linux tcp/ip编程和windows tcp/ip编程差别以及windows socket编程详解

    最近要涉及对接现有应用visual c++开发的tcp客户端,花时间了解了下windows下tcp开发和linux的差别,从开发的角度而言,最大的差别是头文件(早期为了推广尽可能兼容,后面越来越扩展, ...

  8. INADDR_ANY的确切含义

    INADDR_ANY就是inet_addr("0.0.0.0") 首先,需要明确的是当服务器的监听地址是INADDR_ANY时设置的是服务器的IP地址. 其次,当服务器的监听地址是 ...

  9. 用C++实现网络编程---抓取网络数据包的实现方法

    一般都熟悉sniffer这个工具,它可以捕捉流经本地网卡的所有数据包.抓取网络数据包进行分析有很多用处,如分析网络是否有网络病毒等异常数据,通信协议的分析(数据链路层协议.IP.UDP.TCP.甚至各 ...

随机推荐

  1. python学习笔记--装饰器

    1.首先是一个很无聊的函数,实现了两个数的加法运算: def f(x,y): print x+y f(2,3) 输出结果也ok 5 2.可是这时候我们感觉输出结果太单一了点,想让代码的输出多一点看起来 ...

  2. k8s1.4.3安装实践记录(1)-etcd、docker、flannel安装配置

    虚拟机:VMware® Workstation 12 Pro 系统:CentOS Linux release 7.2.1511 (Core) 3.10.0-327.el7.x86_64 由于刚开始学习 ...

  3. 硬盘安装雨林木风Win7旗舰版系统教程

    硬盘安装雨林木风Win7旗舰版系统教程 安装完成,登录后报administrator无权限, F8 进入安全模式,修改administrator的权限.

  4. Oracle jdk 历史版本官方下载地址及下载方法

    Oracle jdk 历史版本官方下载地址及下载方法 原文转载至:http://blog.csdn.net/chwshuang/article/details/54925950 平时要新装一个系统环境 ...

  5. sql server不要插入大数据,开销太大

    sql server或者说关系型数据库中不要做一个字段存储大数据量的设计,比如要插入3000w条数据,然后每条数据中有一个文章字段,这个字段每条大概都需要存储几m的数据,那么算下来这个表就得有几百个G ...

  6. 转化Excel表格为php配置文件

    <?php     //建立reader对象 ,分别用两个不同的类对象读取2007和2003版本的excel文件    require("PHPExcel/Reader/Excel20 ...

  7. 数据库入门4 结构化查询语言SQL

    知识内容: 1.了解SQL 2.库.表操作及索引 3.select语句及insert语句 4.update语句与delete语句 5.SQL常用函数 6.多表连接及组合查询 7.视图操作及数据控制 参 ...

  8. tcpdump抓sql语句

    -A -n -i any |grep --color 'system_type' -n2 -- -E..,.@.@.f........ ...Ndh-....GP..:A.............. ...

  9. 今天练手了下mysqlbinlog,标记下

    1 首先查看是否开启了 bin log 登录mysql后  使用命令 show variables like "log_%"; show binary logs; 2  确认开启了 ...

  10. bootstrap file input 多图片上传编辑THINKPHP5

    {layout name="layout" title="文章添加" /} <form id="defaultForm" role=& ...