給予SOCKET套接字的網絡編程總結

基於DOS平臺下SOCKET編程

首先創建服務器端程序

void main()

{

     //首先加載套接字庫,我這裏用的是1.1版本,有興趣的可以聯2.0庫,可以獲得更多功能啊

WORD wVersionRequested;
WSADATA wsaData;
int err;
 wVersionRequested = MAKEWORD( 1, 1 );
 err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
           return false;
}
 
if ( LOBYTE( wsaData.wVersion ) != 2 ||
        HIBYTE( wsaData.wVersion ) != 2 ) {
    WSACleanup( );
    return false;
}

//創建套接字,在這之前,還要加兩個頭文件和一個庫文件,分別是

#include <Winsock2.h>

#include <stdio.h>

庫文件要在設置.工程裏面的連接選項中加入Use Ws2_32.lib

SOCKET s=socket(AF_INET,SOCK_DGRAM,0);

SOCKADDR_IN sockAddr;
 sockAddr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
 sockAddr.sin_family = AF_INET;
 sockAddr.sin_port = htons(5000);//這裏的端口可以隨便設置,但必須和客戶端的一致

//綁定套接字

bind(s,(sockaddr*)&sockAddr,sizeof(sockaddr));
    char recvBuff[100];
 char sendBuff[100];
 char tempBuff[100];
 SOCKADDR_IN sockFrom;
 int len = sizeof(sockaddr);
    while(true)
 {
  ::recvfrom(s,recvBuff,100,0,(sockaddr*)&sockFrom,&len);
  if('q' == recvBuff[0])
  {
   printf("Chat end!/n");
   sendto(s,"q",strlen("q")+1,0,(sockaddr*)&sockFrom,len);
   break;
  }
        sprintf(tempBuff,"%s say: %s",inet_ntoa(sockFrom.sin_addr),recvBuff);
  printf("%s/n",tempBuff);
        gets(sendBuff);
        sendto(s,sendBuff,strlen(sendBuff)+1,0,(sockaddr*)&sockFrom,len);
 }
    closesocket(s);
    WSACleanup( );

}

再來編寫客戶端代碼

再先前的工作空間中建立一個工程UdpClient,至於加入頭文件客庫文件和服務器端一模一樣

void main()

{

WORD wVersionRequested;
 WSADATA wsaData;
 int err;
    wVersionRequested = MAKEWORD( 1,1 );
 err = WSAStartup( wVersionRequested, &wsaData );
 if ( err != 0 ) {
     return ;
 }
 if ( LOBYTE( wsaData.wVersion ) != 1 ||
        HIBYTE( wsaData.wVersion ) != 1 ) {
     WSACleanup( );
  return ;
 }

 SOCKET s = socket(AF_INET,SOCK_DGRAM,0);
 SOCKADDR_IN sockAddr;
 sockAddr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
 sockAddr.sin_family = AF_INET;
 sockAddr.sin_port = htons(5000);

 char sendBuff[100];
 char recvBuff[100];
 char tempBuff[100];
 printf("聊天通道已經完成,開始吧!/n");
    SOCKADDR_IN sockFrom;
 int len = sizeof(sockaddr);
 while(true)
 {
  gets(sendBuff);
  sendto(s,sendBuff,strlen(sendBuff)+1,0,(sockaddr*)&sockAddr,sizeof(sockaddr));
        recvfrom(s,recvBuff,100,0,(sockaddr*)&sockFrom,&len);
  if('q' == recvBuff[0])
  {
   printf("Chat End!/n");
   sendto(s,"q",strlen("q")+1,0,(sockaddr*)&sockFrom,sizeof(sockaddr));
   break;
  }
  sprintf(tempBuff,"%s say: %s",inet_ntoa(sockFrom.sin_addr),recvBuff);
  printf("%s/n",tempBuff);
 }
 closesocket(s);
    WSACleanup( );

}

這樣,一個簡單的聊天程序就完成了,但是它還有很多缺陷,比如說基於DOS的,客戶端必須先發送數據,然後纔是服務器端,交互性很差,由於它是基於UDP協議的,穩定性不是很理想,但作爲初期的網絡編程練習,我覺得還是恨道的,希望對你有幫助!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章