在 DEV-C++ 中要使用 Windows Socket Programming 必須要連結 Winsock 函式庫。連結函示庫的方法說明如下:
 
Step 1. 開啟工具列中的「專案」> 「專案選項」
Step 2. 在「專案選項」視窗中選擇「參數」頁面
Step 3. 按下「參數」頁面中的「新增函式庫或 Obj 檔」
Step 4. 選擇 [DEV-C++安裝目錄]\lib\libwsock32.a並按下「開啟」
Step 5. 如果在「連結器」文字框中會出現 ..\lib\libwsock32.a,則按下「確定」
 
完成以上步驟後就可以開始撰寫 Windows Socket 程式。
 

簡單的 server 程式

#include<winsock2.h>
#include<stdio.h>
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 Error\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 Error\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位址
  server_address.sin_port = 9734; //設定埠號
  server_len = sizeof(server_address);
 
  if(bind(server_sockfd, (struct sockaddr *)&server_address, server_len) < 0) {
    printf("Bind Error\n");
    exit(1);
  }

  if(listen(server_sockfd, 5) < 0) {
    printf("Listen Error\n");
    exit(1);
  }
 
  while(1) {
    char ch;
    printf("Server waiting...\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);
    }

    recv(client_sockfd, &ch, 1, 0); // Linux socket programming 為 read
    ch++;
    send(client_sockfd, &ch, 1, 0); // Linux socket programming 為 write
    closesocket(client_sockfd); // Linux socket programming 為 close
  }
}
 

簡單的 client 程式

#include<winsock2.h>
#include<stdio.h>
int main() {
  SOCKET sockfd;
  int len;
  struct sockaddr_in address;
  int result;
  char ch = 'A';
 
  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 = 9734;
  len = sizeof(address);
 
  result = connect(sockfd, (struct sockaddr *)&address, len);  
  if(result == -1) {
    printf("Connetc Error");
    exit(1);
  }
 
  send(sockfd, &ch, 1, 0);
  recv(sockfd, &ch, 1, 0);
  printf("char from server = %c\n", ch);
  closesocket(sockfd);
  exit(0);
}

 

 

 

轉貼自 https://sites.google.com/site/ucanlab/Home/chimain/opensource/scocket-programming-with-dev-c


文章標籤
創作者介紹

經驗交流分享與備忘

Frank 發表在 痞客邦 PIXNET 留言(0) 人氣()