随手写了一个简单的socket服务端和客户端

本文详细介绍了使用Winsock实现服务端与客户端通信的过程,包括服务端创建套接字、绑定、监听,以及客户端连接、接收和发送数据的方法。通过实例演示了如何在服务端接收客户端输入并响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先开启服务端,在开启客户端。向服务端命令窗口输入字符,按ENTER键,则字符发送子客户端。之后客户端也可以发送字符至服务端。

 

服务端程序:

#include <WINSOCK2.H>
#include <iostream.h>

main()
{
 SOCKET socknum, sendsocknum;                                                   //socket描述符
 struct sockaddr_in serveraddr, clientaddr;                                    //服务器地址结构体
 char* IPstring = "172.16.192.185";                                 //字符串形式的服务器IP地址
 int IP;                                                           //32位整形IP地址
 IP = inet_addr(IPstring);                                         //字符串形式的IP地址转换成32位整形IP地址
 WSADATA wsaData;
    WORD version = MAKEWORD(2,0);
    WSAStartup(version,&wsaData);

    WSASetLastError(963);
    cout<<"WSAGetLastError="<<WSAGetLastError()<<endl;

 socknum = socket(PF_INET,SOCK_STREAM,0);                  //创建一个套接字,并且返回描述符
 if(SOCKET_ERROR == socknum)
 {
  exit(0);
 }

 memset(&serveraddr, 0, sizeof(struct sockaddr_in));

 //填充服务器地址结构体的内容
 serveraddr.sin_family = AF_INET;                                   //填充协议地址
    serveraddr.sin_addr.s_addr = IP;                            //填充IP地址
 serveraddr.sin_port = htons(4000);                                 //填充端口号


 //绑定到服务器的指定网络地址
 int b;                             //当返回值为-1,说明绑定失败
 b = bind(socknum, (struct sockaddr *)&serveraddr, sizeof(struct sockaddr_in));
 
 //监听
 int c , d=sizeof(clientaddr);                            //当返回值为-1,说明绑定失败
 c = listen(socknum, 6);
   //若b=-1,c=-1,说明绑定和监听都失败
 cout<<"socknum="<<socknum<<endl<<"b="<<b<<endl<<"c="<<c<<endl<<"IP="<<IP<<endl;
    sendsocknum = accept(socknum, (struct sockaddr *)&clientaddr,&d);
 char SendBuffer[100];
 char RevBuffer[100];
 cout<<"客户端IP地址:"<<inet_ntoa((clientaddr.sin_addr))<<endl;
 while(1)
 {
    cin>>SendBuffer;

  send(sendsocknum, SendBuffer, strlen(SendBuffer), 0);
 memset(SendBuffer, 0, 100);
    // shutdown(sendsocknum, 1);
 memset(RevBuffer, 0, 100);
 recv(sendsocknum, RevBuffer, 100, 0);
 cout<<RevBuffer<<endl; 
 }

 while(1);
 closesocket(sendsocknum);
 WSACleanup();
}

 

 

客户端程序:

#include <WINSOCK2.H>
#include <iostream.h>

main()
{
 SOCKET clientsocknum;
 struct sockaddr_in serveraddr, clientaddr;
 char *IPstring = "172.16.192.185";
 int IP, b, len;
 IP = inet_addr(IPstring);
 
 WSADATA wsaData;
    WORD version = MAKEWORD(2,0);
 WSAStartup(version,&wsaData);

 clientsocknum = socket(AF_INET,SOCK_STREAM,0);
 memset(&serveraddr, 0, sizeof(struct sockaddr_in));
 serveraddr.sin_family = AF_INET;
    serveraddr.sin_addr.s_addr = IP;
 serveraddr.sin_port = htons(4000);
 b = connect(clientsocknum, (struct sockaddr *)&serveraddr, sizeof(struct sockaddr_in));

 getsockname(clientsocknum, (sockaddr*)(&clientaddr),&len);
 cout<<"本地地址:"<<inet_ntoa(clientaddr.sin_addr)<<endl<<"本地端口:"<<htons(clientaddr.sin_port)<<endl;

 cout<<"clientsocknum="<<clientsocknum<<endl<<"b="<<b<<endl;
 char RecvBuffer[100];
 char sendbuffer[100] ;
 memset(RecvBuffer, 0, 100);
    int recvnum;

 while(1)
 { 

  recvnum = recv(clientsocknum, RecvBuffer, 100, 0);
  cout<<RecvBuffer<<endl;
  memset(RecvBuffer, 0, 100);
  
  cin>>sendbuffer;
  send(clientsocknum, sendbuffer, strlen(sendbuffer), 0);
  memset(sendbuffer, 0, 100);
 }

 closesocket(clientsocknum);
 WSACleanup();

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值