Dev C++ WinSock編程入門——準(zhǔn)備工作和簡單的例子

使用Dev C++進(jìn)行WinSock編程前,需要進(jìn)行一些簡單的設(shè)置,我使用的是5.11版本,在“工具->編譯器選項->編譯器”中,勾選“編譯時加入以下指令”,同時添加-lwsock32,這樣就可以了,如下圖:


圖片.png

下面是服務(wù)端的代碼:

/*
WinSock 示例 服務(wù)端
使用工具 Dev C++ 5.11
請選中“工具->編譯選項->編譯器->編譯時加入以下命令”,并加入命令-lwsock32 
*/ 
#include<winsock2.h>
#include<stdio.h>
#include<iostream>
using namespace std;
int main() {
  SOCKET server_sockfd, client_sockfd;
  int server_len, client_len;
  struct sockaddr_in server_address;
  struct sockaddr_in client_address;
 
  // 注冊 Winsock DLL
  WSADATA wsadata;
  if(WSAStartup(0x101,(LPWSADATA)&wsadata) != 0) {
    printf("Winsock 錯誤\n");
    exit(1);                                         
  }
 
  // 初始化 server socket
  server_sockfd = socket(AF_INET, SOCK_STREAM, 0); // AF_INET(使用IPv4); SOCK_STREAM; 0(使用缺省方式TCP)
  if(server_sockfd == SOCKET_ERROR) {
    printf("Socket 錯誤\n");
    exit(1);
  }
 
  // struct sockaddr_in {
  //     short int               sin_family; /* AF_INT(使用IPv4) */
  //     unsigned short int sin_port;    /* Port(端口號) */
  //     struct in_addr       sin_addr;   /* IP地址 */
  // };
  // sturct in_addr {
  //     unsigned long int s_addr;
  // };
  server_address.sin_family = AF_INET; // AF_INT(使用IPv4)
  server_address.sin_addr.s_addr = inet_addr("127.0.0.1"); // ip地址為本機(jī) 
  server_address.sin_port = 8899; //必須是本機(jī)沒有使用的端口號 
  server_len = sizeof(server_address);
  
  if(bind(server_sockfd, (struct sockaddr *)&server_address, server_len) < 0) {
    printf("綁定錯誤\n");
    exit(1);
  }

  if(listen(server_sockfd, 5) < 0) {
    printf("偵聽錯誤\n");
    exit(1);
  }
 
  while(1) {
    char ch[1024]; //接收緩存 
    printf("服務(wù)啟動,等待中...\n");
    client_len = sizeof(client_address);

    client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);
    if(client_sockfd == SOCKET_ERROR) {
      printf("Accept Error\n");
      exit(1);
    }

    int mess=recv(client_sockfd, ch, 1024, 0); 
    
    for(int i=0;i<mess;i++) cout<<ch[i];
    cout<<endl;
    
    string backmessage="Received" ;
    send(client_sockfd, backmessage.c_str(), backmessage.length(), 0); 
    closesocket(client_sockfd); 
  }
}

這里我們在本機(jī)進(jìn)行測試,因此地址使用127.0.0.1,如果需要接收其它機(jī)器的請求,需要綁定到網(wǎng)卡的地址,可以使用ipconfig進(jìn)行查看。端口使用8899,如果端口被其它應(yīng)用占用,運行時會出錯,需要換一個沒有被占用的端口??蛻舳说拇a如下:

#include<winsock2.h>
#include<stdio.h>
#include<iostream>
using namespace std;

int main() {
  SOCKET sockfd;
  int len;
  struct sockaddr_in address;
  int result;
  
  
  WSADATA wsadata;
  if(WSAStartup(0x101,(LPWSADATA)&wsadata) != 0) {
    printf("Winsock Error\n"); 
    exit(1);
  }
  sockfd = socket(AF_INET, SOCK_STREAM, 0);
  address.sin_family = AF_INET;
  address.sin_addr.s_addr = inet_addr("127.0.0.1");
  address.sin_port = 8899;
  len = sizeof(address);
 
  result = connect(sockfd, (struct sockaddr *)&address, len);  
  if(result == -1) {
    printf("Connetc Error");
    exit(1);
  }
  

  string inpu;
  cin>>inpu;
  send(sockfd, inpu.c_str(), inpu.length(), 0);
  
  char ba[1024];
  int reclen=recv(sockfd, ba, 1024, 0);
  for(int i=0;i<reclen;i++) cout<<ba[i];
  cout<<endl;
  closesocket(sockfd);
  exit(0);
}

服務(wù)端啟動后,進(jìn)入等待狀態(tài),啟動客戶端,輸入一個字符串,這時服務(wù)端會現(xiàn)實接收到的字符串,并給出回復(fù):


圖片.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容