网络编程基础

本文详细介绍了Socket编程的基本模型BerkeleySocket的实现流程,包括初始化Winsock、创建套接字、绑定和监听套接字,以及接受客户端连接并接收数据的过程。文章还特别说明了使用本地IP地址和指定端口的重要性,并提供了关键步骤的错误处理和日志记录。

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

Socket 编程最基本的模型就是 Berkeley Socket

          具体的实现也就是按这个流程图来做的,这里重点是服务端的实现

int APIENTRY _tWinMain(HINSTANCE hInstance,
                      HINSTANCE hPrevInstance,
                      LPTSTR     lpCmdLine,
                     int        nCmdShow)
{
            ofstream logfile("LogFile.txt");
           //Initialize winsock
            WSADATA wsaData;
            int iResult = WSAStartup( MAKEWORD(2,2), &wsaData);
            if(iResult != NO_ERROR)
             {
                     logfile<<"Error at WSAStartup() ";    
                     logfile.close();
                    return 1;
             }
            else    
                    logfile<<"Initialize WSAStartup OK!";
    
             // Create a socket.
             SOCKET serverSocket;
             serverSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

             if(serverSocket == INVALID_SOCKET) 
              {    
                      logfile<<"Error at socket():"<<WSAGetLastError()<<endl;;
                      logfile.close();
                      WSACleanup();
                      return 1;
              }
             else
             {
                      logfile<<"Create socket OK!";
              }

            // Bind the socket.
              sockaddr_in service;

              service.sin_family=AF_INET;
              service.sin_addr.s_addr=inet_addr(HostIp.c_str());
              service.sin_port=htons(PORT);

              if (bind(serverSocket,(SOCKADDR*)&service,sizeof(service))==SOCKET_ERROR)
              {
                       logfile<<"bind() failed"<<GetLastError()<<endl;
                       closesocket(serverSocket);
                       logfile.close();
                      return 1;
              }
             else
              {
             logfile<<"Binding OK!"<<endl;
               }
    
    
              // Listen on the socket.
               if(listen(serverSocket,1)==SOCKET_ERROR)
               { 
                       logfile<<"Error listening on socket"<<GetLastError()<<endl;
                       logfile.close();
                }
               else
                {
                       logfile<<"Listening..."<<endl;
                 }

                // Accept connections.
                 SOCKET clientSocket;
                 sockaddr_in clientAddr;
                int clientAddrLen=sizeof(clientAddr);
   
                while(true)
                 {
                            clientSocket = SOCKET_ERROR;
                           while(clientSocket==SOCKET_ERROR) 
                            {
                                   clientSocket=accept(serverSocket,(struct sockaddr*)&clientAddr,&clientAddrLen);      
                             }
                            ReceiveData(clientSocket);    
                   }   

                   closesocket(serverSocket);
                   closesocket(clientSocket); 

                  return 0;
}

//Receive the data
void ReceiveData(SOCKET& clientSocket)
{    
            int bytesSent;
            int bytesRecv=SOCKET_ERROR;
            string sendbuf="";
            char recvbuf[32]="";
    
            while(bytesRecv ==SOCKET_ERROR)
             {
                       bytesRecv=recv(clientSocket,recvbuf,32,0);
    
                        sendbuf="Received: "+(string)recvbuf;
                        bytesSent=send(clientSocket,sendbuf.c_str(),(unsigned int)(sendbuf.size()),0);

                        bytesRecv=SOCKET_ERROR;
                        memset(recvbuf,'\0',32);
             }
            return;
}

在接收客户端发来数据的地方要做成死循环,如果需要断开连接,则由客户断发送特定的消息然后进行处理。还有需要注意的是上面的HostIp是本机的IP地址,PORT是套接字需要绑定的端口。

点击打开链接


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值