8244 发表于 2018-10-22 13:27:22

socket编程(实现简单的client与server相互通信)

  最近发现基础忘得差不多了,特来温故一下socket编程
  client端:
  1、初始化socket:
  SOCKET Client_st = socket(AF_INET, SOCK_STREAM, 0);    //AF_INET表示internet协议,SOCK_STREAM表示TCP协议(UDP协议:SOCK_DGRAM(好久没看,不知道写错了没))
  2、创建一个SOCKADDR_IN:
  SOCKADDR_IN addrSrv;
  addrSrv.sin_family = AF_INET;
  addrSrv.sin_port = htons(6000);
  addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");//服务器端的IP地址(127.0.0.1表示本机)
  3、连接服务端:

  connet(Client_st, (SOCKET_ADDR *)&addrSrv,>  4、向服务器发送消息/接收来自服务器的消息:
  send(Client_st, sendBuf, strlen(sendBuf) + 1, 0);    //这里的第三个参数一般用strlen(sendBuf) + 1(网络上的传输,所以不用sizeof,要尽量节省啊~)
  recv(Client_st, recvBuf, 256, 0)    //这里接收消息的长度就不用斤斤计较了
  5、最后一步,关闭socket
  closesocket(Client_st);
  server端:其实服务端和客户端大致流程相同,只是服务端多了几个步骤
  1、初始化socket:
  SOCKET server_st = socket(AF_INET, SOCK_STREAM, 0);    //AF_INET表示internet协议,SOCK_STREAM表示TCP协议(UDP协议:SOCK_DGRAM(好久没看,不知道写错了没))
  2、创建一个SOCKADDR_IN:
  SOCKADDR_IN addrSrv;
  addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//转换Unsigned long型为网络字节序格
  addrSrv.sin_family = AF_INET;//指定地址簇
  addrSrv.sin_port = htons(6000);
  3、将套接字绑定到一个端口号和本地地址上(如果缺失了这一步,会出现一个不必现的问题,试试吧)

  bind(socSrv, (SOCKADDR*)&addrSrv,>  4、开始监听
  listen(socSrv, 5);    //第二个参数表示同时监听的最大客户端数量
  5、创建并初始化接收客户端的socket
  SOCKET sockConn ;
  SOCKADDR_IN addrClient;//字义用来接收客户端Socket的结构体

  int len =>  memset((void *)&addrClient,0,sizeof(addrClient));
  sockConn = accept(socSrv, (SOCKADDR*)&addrClient, &len);
  (这里我以前迷糊了好久,开始不是已经创建了一个socket了吗?怎么又创建一个socket?这第二个socket才是用于接收客户端的socket)
  6、发送/接收数据
  send(sockConn, sendBuf, strlen(sendBuf)+1, 0);//多发送一个字节
  recv(sockConn, recvBuf, 100, 0);
  7、关闭socket
  closesocket(sockConn);
  closesocket(socSrv);
  传上windows下的客户端与服务端程序:

页: [1]
查看完整版本: socket编程(实现简单的client与server相互通信)