Socket编程客户端原理简单介绍

和服务端原理差不多,只是少了两个步骤.

客户端:
初始化套接字(WSAStartup)->创建套接字(socket)->连接服务器(connect)->发送/接收数据(send/recv)->关闭连接(closesocket,WSACleanup)

1.初始化套接字,也是获取套接字.
WSADATA是一个存放套接字信息的结构
利用WSAStartup函数来获取套接字信息并且存放到WSADATA

  //成功返回0,失败返回非零
  int WSAStartup(
  WORD wVersionRequested,  //需要的版本
  LPWSADATA lpWSAData      //套接字信息结构
);

获取到套接字信息后还要判断是否获取的是2.2版本的.
方法如下:

    //判断版本
    if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
    {
        printf("wVersion was not 2.2\n");
        return -1;
    }

2.创建套接字

//成功返回一个套接字,失败返回INVLID_SOCKET
SOCKET socket(
  int af,     // AF 表示ADDRESS FAMILY 地址族
  int type,   //套接字的类型
  int protocol//使用的传输协议
);

其中af的值可以是如下几个常用的:
AF_UNIX(本机通信)
AF_INET(TCP/IP – IPv4)
AF_INET6(TCP/IP – IPv6)
type的值可以是如下几个:
SOCK_STREAM(TCP流)
SOCK_DGRAM(UDP数据报)
SOCK_RAW(原始套接字)

注意:客户端的af,type都要和服务器的一样
3.连接服务器

//成功返回0,失败返回SOCKET_ERROR
int connect(
  SOCKET s,      //客户端套接字
  const struct sockaddr FAR* name,//服务器地址
  int namelen                     //长度
);

4.发送/接收数据

//成功返回发送的bytes失败返回SOCKET_ERROR
int send(
  SOCKET s,           //第二步创建的套接字
  const char FAR* buf,//要发送的数据
  int len,            //数据的长度
  int flags           //设为0
);
//成功返回接受到的bytes,连接关闭则返回0,失败返回SOCKET_ERROR 
int recv(
  SOCKET s,     //第二步创建的套接字
  char FAR* buf,//接收数据的缓存区
  int len,      //缓存区大小
  int flags     //设为0 
);

5.关闭所有连接并清理

`
//成功返回0,失败返回SOCKET_ERROR
int closesocket(
SOCKET s
);

WSACleanup();//清理

你可能感兴趣的:(编程,socket,服务器,客户端)