您的位置:首页 > 编程语言

Windows下VC编程(SOCKET)

2016-08-23 17:20 423 查看
一、原理

1.基于TCP协议的服务器端程序流程:

1)创建套接字(socket)

2)绑定套接字(bind)

3)将套接字设为监听,准备接收客户请求(listen)

4)等待客户请求的到来,当请求到来后,接受请求,返回一个对应于此次连接的套接字(accept)

5)用返回的套接字与客户端进行通信(send/recv)

6)返回,等待另一客户请求

7)关闭套接字

2.基于TCP协议的客户端程序流程

1)创建套接字(socket)

2)向服务器发出连接请求(connect)

3)和服务器端进行通信(send/recv)

4)关闭套接字

在服务器端调用accept函数时,程序就会等待客户端调用connect函数发出连接请求,然后接收请求,于是

双方就建立了连接,之后,服务器端和客户端就可以利用send和recv函数进行通信了。

3.基于UDP的服务器端编写

1)创建套接字(socket)

2)绑定(bind)

3)等待接收数据(recvfrom)

4)关闭套接字

4.基于UDP的客户端编写

1)创建套接字(socket)

2)向服务器发送数据(sendto)

3)关闭套接字

在所有的套接字编程中第一步都是加载套接字库(WSAStartup)

对于每一个WSAStartup函数的成功调用,在最后都要对应一个WSACleanUp调用。

二、源码:

1.TCP服务器端:

#include <Winsock2.h>
#include <stdio.h>

void main()
{

 WORD wVersionRequested;

 WSADATA wsaData;

 int err;

 

 wVersionRequested = MAKEWORD( 1, 1 );

 

 err = WSAStartup( wVersionRequested, &wsaData );

 if ( err != 0 ) {

  return;

 }

 

 if ( LOBYTE( wsaData.wVersion ) != 1 ||

        HIBYTE( wsaData.wVersion ) != 1 ) {

  WSACleanup( );

  return; 

 }

 SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);

 SOCKADDR_IN addrSrv;

 addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

 addrSrv.sin_family=AF_INET;

 addrSrv.sin_port=htons(6000);

 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

 listen(sockSrv,5);

 SOCKADDR_IN addrClient;

 int len=sizeof(SOCKADDR);

 while(1)

 {

  SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);

  char sendBuf[100];

  sprintf(sendBuf,"Welcome
%s to http://weigongwan.cublog.cn", 
   inet_ntoa(addrClient.sin_addr));

  send(sockConn,sendBuf,strlen(sendBuf)+1,0);

  char recvBuf[100];

  recv(sockConn,recvBuf,100,0);

  printf("%s\n",recvBuf);

  closesocket(sockConn);

 }
}

2.TCP客户端:

#include <Winsock2.h>
#include <stdio.h>

void main()
{

 WORD wVersionRequested;

 WSADATA wsaData;

 int err;

 

 wVersionRequested = MAKEWORD( 1, 1 );

 

 err = WSAStartup( wVersionRequested, &wsaData );

 if ( err != 0 ) {

  return;

 }

 

 if ( LOBYTE( wsaData.wVersion ) != 1 ||

        HIBYTE( wsaData.wVersion ) != 1 ) {

  WSACleanup( );

  return; 

 }

 SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);

 SOCKADDR_IN addrSrv;

 addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

 addrSrv.sin_family=AF_INET;

 addrSrv.sin_port=htons(6000);

 connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

 char recvBuf[100];

 recv(sockClient,recvBuf,100,0);

 printf("%s\n",recvBuf);

 send(sockClient,"This
is lisi",strlen("This
is lisi")+1,0);

 closesocket(sockClient);

 WSACleanup();
}

3.UDP服务器端

#include <Winsock2.h>
#include <stdio.h>

void main()
{

 WORD wVersionRequested;

 WSADATA wsaData;

 int err;

 

 wVersionRequested = MAKEWORD( 1, 1 );

 

 err = WSAStartup( wVersionRequested, &wsaData );

 if ( err != 0 ) {

  return;

 }

 

 if ( LOBYTE( wsaData.wVersion ) != 1 ||

        HIBYTE( wsaData.wVersion ) != 1 ) {

  WSACleanup( );

  return; 

 }

 SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);

 SOCKADDR_IN addrSrv;

 addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

 addrSrv.sin_family=AF_INET;

 addrSrv.sin_port=htons(6000);

 bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

 SOCKADDR_IN addrClient;

 int len=sizeof(SOCKADDR);

 char recvBuf[100];

 recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);

 printf("%s\n",recvBuf);

 closesocket(sockSrv);

 WSACleanup();
}

 

4.UDP客户端

 
#include <Winsock2.h>
#include <stdio.h>

void main()
{

 WORD wVersionRequested;

 WSADATA wsaData;

 int err;

 

 wVersionRequested = MAKEWORD( 1, 1 );

 

 err = WSAStartup( wVersionRequested, &wsaData );

 if ( err != 0 ) {

  return;

 }

 

 if ( LOBYTE( wsaData.wVersion ) != 1 ||

        HIBYTE( wsaData.wVersion ) != 1 ) {

  WSACleanup( );

  return; 

 }

 SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);

 SOCKADDR_IN addrSrv;

 addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

 addrSrv.sin_family=AF_INET;

 addrSrv.sin_port=htons(6000);

 sendto(sockClient,"Hello",strlen("Hello")+1,0,

  (SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

 closesocket(sockClient);

 WSACleanup();
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: