计算机网络 socket编程实现服务器端与客户端连接(C语言版)

计算机网络 socket编程实现服务器端与客户端连接

服务器端

#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>

int main()
{
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2,2),&wsaData);
    if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)
    {
        printf("fail");
        return -1;
    }

    SOCKET serverSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    SOCKADDR_IN serverAddr;     //声明一个SOCKADDR_IN变量,表示服务器
    serverAddr.sin_family = AF_INET;  //必须和创建socket的IP协议一致
    serverAddr.sin_port=htons(8888);  // //服务器端口,客户端通过这个端口连接
    serverAddr.sin_addr.s_addr = htonl(INADDR_ANY); //ip用宏INADDR_ANY代替,代表0.0.0.0,表明所有地址

   if(SOCKET_ERROR == bind(serverSocket , (SOCKADDR*)&serverAddr , sizeof(serverAddr))) //绑定
    {
        printf("绑定失败\n");
        closesocket(serverSocket);  //释放socket
        WSACleanup();  //关闭套接字
        return -1;
	}

     printf("绑定成功\n");

    listen(serverSocket, 10);//置socket为被动方式
    //等待客户连接
    SOCKADDR_IN clientAddr;
    int len = sizeof(clientAddr);

    //接受连接
    SOCKET clientSocket = accept(serverSocket,(SOCKADDR*)&clientAddr, &len);    //阻塞函数
    if(clientSocket == INVALID_SOCKET)
    {
      printf("连接失败");
     closesocket(serverSocket);    //释放socket
     WSACleanup();   //关闭套接字
      return -1 ;
    }
    printf("连接成功\n");
    printf("客户端地址为: %s\n" , inet_ntoa(clientAddr.sin_addr));

    char recvBuff[128] = {};
    //开始通讯
    while(1)
    {
      memset(recvBuff, 0 , sizeof(recvBuff));  //初始化recvBuff
      if(recv(clientSocket , recvBuff, sizeof(recvBuff)-1 , 0) >0)  //阻塞函数
      {
           printf("我是服务器,我收到客户端的信息为:  %s\n" , recvBuff);
      }
      else printf("我是服务器,未收到客户端信息");

      if(strcmp(recvBuff,"exit")==0) break; //客户端发送exit时,结束通信

      char sendBuff[128] = {};
      memset(sendBuff, 0 , sizeof(sendBuff)); //初始化sendBuff
      printf("\n服务器准备向客户端发送信息......\n");
      printf("请输入要发送的信息:\n");
      scanf("%s" , sendBuff);
      if(strcmp(sendBuff,"exit")==0) break; //服务器发送exit时结束通信
      //一次收发
      send(clientSocket , sendBuff, strlen(sendBuff), 0);
    }
    //关闭socket
    closesocket(clientSocket);
    closesocket(serverSocket);
    WSACleanup();
    return 0;
}

客户端

#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
int main()
{
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2,2),&wsaData);
    if(LOBYTE(wsaData.wVersion)!=2 || HIBYTE(wsaData.wVersion)!=2)
    {
      printf("请求版本失败");
      return -1;
    }

    SOCKET clientSocket= socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(INVALID_SOCKET == clientSocket)
    {
       printf("套接字创建失败");
       return -1;
     }
    SOCKADDR_IN clientAddr; //初始化协议地址
    clientAddr.sin_family = AF_INET;//必须和创建socket的IP协议一致
    clientAddr.sin_port = htons(8888);    //服务器端口,客户端通过这个端口连接

    //ip地址是点分格式的字符串 , 用inet_addr来转换整数
    clientAddr.sin_addr.S_un.S_addr =inet_addr("127.0.0.1");
 if( connect(clientSocket , (SOCKADDR *)&clientAddr , sizeof(clientAddr))<0)
    {
      printf("连接失败");
      closesocket(clientSocket);    //释放socket
      WSACleanup();   //关闭套接字
      return -1 ;
    }
    printf("连接成功\n\n");
    char sendBuff[128] = {};
    //开始通讯
    while(1)
    {
      memset(sendBuff, 0 , sizeof(sendBuff)); //初始化sendBuff
      printf("请输入客户端向服务器发送的信息:\n");
      scanf("%s" , sendBuff);
      //一次收发
      send(clientSocket , sendBuff, strlen(sendBuff), 0);

      char recvBuff[128] = {};
      memset(recvBuff, 0 , sizeof(recvBuff)); //初始化recvBuff
      if(recv(clientSocket , recvBuff, sizeof(recvBuff)-1 , 0) >0)  //阻塞函数
      {
           printf("我是客户端,收到的服务器信息为:%s\n" , recvBuff);
      }
      else printf("客户端未收到服务器信息");
    }
    return 0;
}

使用cmd运行即可


版权声明:本文为qq_44885161原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。