1. 程式人生 > >windows下 socket程式設計

windows下 socket程式設計

 一、基於TCP的socket程式設計

伺服器端程式:

1)建立套接字(socket)。

此係統呼叫的實際效果是,請求作業系統把網路通訊所需要的一些系統資源(儲存器空間、CPU時間、網路寬頻等)分配給該應用程序。

2)將套接字繫結到一個本地地址和埠上(bind)。

3)將套接字設為監聽模式,準備接收客戶請求(listen)。

4)等待客戶請求到來;當請求到來後,接受連線請求,返回一個新的對應於此次連線的套接字(accept)。

5)用返回的套接字和客戶端進行通訊(send/recv)。

6)返回,等待另一客戶請求。

7)關閉套接字(closesocket)。

此係統呼叫,通知作業系統回收與該套接字描述符相關的所有資源。

客戶端程式:

1)建立套接字(socket)。

2)向伺服器發出連線請求(connect)。

3)和伺服器端進行通訊(send/recv)。

4)關閉套接字(closesocket)。

二、基於UDP的socket程式設計

伺服器端(接收端)程式:

1)建立套接字(socket)。

2)將套接字繫結到一個本地地址和埠上(bind)。

3)等待接收資料(recvfrom)。

4)關閉套接字(closesocket)。

客戶端(傳送端)程式:

1)建立套接字(socket)。

2)向伺服器傳送資料(sendto)。

3)關閉套接字(closesocket)。

 三、相關函式   

1)int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData); //啟動程序使用ws2.dll

wVersionRequested引數:用於指定準備載入的Winsock庫的版本。高位位元組指定所需要的Winsock庫的副版本,而低位位元組則是主版本。可用MAKEWORD(x, y);(其中,x是高位位元組,y是低位位元組)方便地獲得wVersionRequested的正確值。

 lpWSAData引數:指向WSADATA結構的指標,WSAStartup用其載入的庫版本有關的資訊填在這個結構中。

2)SOCKET socket(int af, int type, int protocol); //建立與特定服務提供者繫結的套接字

af引數:指定地址族,對於TCP/IP協議的套接字,它只能是AF_INET(也可寫成PF_INET)。

type引數:指定Socket型別,對於1.1版本的Socket,它只支援兩種型別的套接字,SOCK_STREAM指定產生流式套接字,SOCK_DGRAM產生資料報套接字。

protocol引數:與特定的地址家族相關的協議,如果指定為0,那麼它就會根據地址格式和套接字類別,自動為你選擇一個合適的協議。這是推薦使用的一種選擇協議的方法。

3)int bind(SOCKET s, const struct sockaddr FAR *name, int namelen); //將套接字和本地地址聯絡起來

s引數:指定要繫結的套接字。

name引數:指定了該套接字的本地地址資訊。

namelen引數:指定name所指向的sockaddr結構的長度。

四、例項

(1)基於TCP的Socket程式設計

伺服器端,建立一個Win32的控制檯應用程式,新建一個cpp檔案,取名為Server.cpp,其程式碼如下:

[cpp]  view plain copy
  1. #pragma comment(lib,"Ws2_32.lib")   
  2.   
  3. #include <Winsock2.h>  
  4. #include <iostream>  
  5. using namespace std;  
  6. #include <stdio.h>  
  7. #include <string.h>  
  8.   
  9. int main()  
  10. {  
  11.     //********獲取應用程式所需的Winsock DLL版本資訊  
  12.     WORD wVersionRequested;  
  13.     wVersionRequested = MAKEWORD(1, 1); //設定高位元組為1,低位元組為1的WORD型別,表示所需Windows Sockets的版本號為1.1  
  14.     WSADATA wsaData; //用來儲存獲取的Windows Sockets的資訊  
  15.     int err = WSAStartup(wVersionRequested, &wsaData); //初始化此程序的Winsock DLL的使用  
  16.       
  17.     //初始化失敗,直接返回  
  18.     if (err != 0)  
  19.     {  
  20.         return 1;   
  21.     }  
  22.   
  23.     //告訴使用者,找不到可用的Winsock DLL  
  24.     if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)  
  25.     {  
  26.         WSACleanup();  
  27.         return 1;  
  28.     }  
  29.   
  30.     //*********建立套接字  
  31.     SOCKET sockServer = socket(AF_INET, SOCK_STREAM, 0);  
  32.   
  33.     //*********將套接字繫結到一個本地地址和埠上  
  34.     sockaddr_in addrServer; //儲存sock地址資訊  
  35.     addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //IP地址為INADDR_ANY,允許套接字向任何分配給本地機器的IP地址傳送或接收資料  
  36.     addrServer.sin_family = AF_INET; //地址簇  
  37.     addrServer.sin_port = htons(6000);  
  38.   
  39.     bind(sockServer, (sockaddr *)&addrServer, sizeof(sockaddr));  
  40.   
  41.     //*********將套接字設為監聽模式,準備接收客戶請求  
  42.     listen(sockServer, 5); //監聽的套接字最大數為5  
  43.   
  44.     //*********等待客戶請求到來  
  45.     sockaddr_in addrClient; //儲存sock所連線的客戶端的地址資訊  
  46.     int addrlen = sizeof(sockaddr);  
  47.   
  48.     while (1)   
  49.     {  
  50.         //當請求到來後,接受連線請求,返回一個新的對應於此次連線的套接字  
  51.         SOCKET sockConnect = accept(sockServer, (sockaddr *)&addrClient, &addrlen);   
  52.   
  53.         //*********用返回的套接字和客戶端進行通訊  
  54.         char pBuffer[100];  
  55.         memset(pBuffer, 0, 100);  
  56.         strcat(pBuffer, "Welcome ");  
  57.         strcat(pBuffer, inet_ntoa(addrClient.sin_addr));  
  58.         strcat(pBuffer, " to http://www.sunxin.org!");  
  59.         send(sockConnect, pBuffer, (strlen(pBuffer) + 1) * sizeof(char), 0); //給客戶端傳送訊息  
  60.   
  61.         char recvBuf[100];  
  62.         memset(recvBuf, 0, 100);  
  63.         recv(sockConnect, recvBuf, 100, 0); //接收客戶端發來的訊息  
  64.   
  65.         //*********關閉socket連線  
  66.         closesocket(sockConnect);   
  67.   
  68.         cout<<recvBuf<<endl;  
  69.     }  
  70.   
  71.     return 0;  
  72. }  

客戶端,建立一個Win32的控制檯應用程式,新建一個cpp檔案,取名為Client.cpp,其程式碼如下:

[cpp]  view plain copy
  1. #pragma comment(lib,"Ws2_32.lib")   
  2.   
  3. #include <Winsock2.h>  
  4. #include <iostream>  
  5. using namespace std;  
  6. #include <stdio.h>  
  7. #include <string.h>  
  8.   
  9. int main()  
  10. {  
  11.     //********獲取應用程式所需的Winsock DLL版本資訊  
  12.     WORD wVersionRequested;  
  13.     wVersionRequested = MAKEWORD(1, 1); //設定高位元組為1,低位元組為1的WORD型別,表示所需Windows Sockets的版本號為1.1  
  14.     WSADATA wsaData; //用來儲存獲取的Windows Sockets的資訊  
  15.     int err = WSAStartup(wVersionRequested, &wsaData); //初始化此程序的Winsock DLL的使用  
  16.       
  17.     //初始化失敗,直接返回  
  18.     if (err != 0)  
  19.     {  
  20.         return 1;   
  21.     }  
  22.   
  23.     //告訴使用者,找不到可用的Winsock DLL  
  24.     if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)  
  25.     {  
  26.         WSACleanup();  
  27.         return 1;  
  28.     }  
  29.   
  30.     //*********建立套接字  
  31.     SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);  
  32.   
  33.     //*********向伺服器發出連線請求  
  34.     sockaddr_in addrServer; //儲存伺服器端的sock地址資訊  
  35.     addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //伺服器IP地址,此處伺服器為本機  
  36.     addrServer.sin_family = AF_INET; //地址簇  
  37.     addrServer.sin_port = htons(6000);  
  38.   
  39.     connect(sockClient, (sockaddr *)&addrServer, sizeof(sockaddr));  
  40.   
  41.     //*********和伺服器端進行通訊  
  42.     char *pBuffer = "This is liuxijiao.";  
  43.     send(sockClient, pBuffer, (strlen(pBuffer) + 1) * sizeof(char), 0); //給伺服器傳送訊息  
  44.   
  45.     char recvBuf[100];  
  46.     memset(recvBuf, 0, 100);  
  47.     recv(sockClient, recvBuf, 100, 0); //接收伺服器發來的訊息  
  48.   
  49.     //*********關閉socket連線  
  50.     closesocket(sockClient);   
  51.     WSACleanup();  
  52.   
  53.     cout<<recvBuf<<endl;  
  54.     system("PAUSE");  
  55.   
  56.     return 0;  
  57. }  

首先執行伺服器端的程式,然後再執行客戶端的程式。

在伺服器端收到客戶端傳送來的訊息:

在客戶端收到伺服器端傳送來的訊息:

(2)基於UDP的Socket程式設計

伺服器端,建立一個Win32的控制檯應用程式,新建一個cpp檔案,取名為Server.cpp,其程式碼如下:

[cpp]  view plain copy
  1. #pragma comment(lib, "Ws2_32.lib")  
  2.   
  3. #include <Winsock2.h>  
  4. #include <iostream>  
  5. using namespace std;  
  6. #include <stdio.h>  
  7. #include <string.h>  
  8.   
  9. int main()  
  10. {  
  11.     //********獲取應用程式所需的Winsock DLL版本資訊  
  12.     WORD wVersionRequested;  
  13.     wVersionRequested = MAKEWORD(1, 1); //設定高位元組為1,低位元組為1的WORD型別,表示所需Windows Sockets的版本號為1.1  
  14.     WSADATA wsaData; //用來儲存獲取的Windows Sockets的資訊  
  15.     int err = WSAStartup(wVersionRequested, &wsaData); //初始化此程序的Winsock DLL的使用  
  16.   
  17.     //初始化失敗,直接返回  
  18.     if (err != 0)  
  19.     {  
  20.         return 1;  
  21.     }  
  22.   
  23.     //告訴使用者,找不到可用的Winsock DLL  
  24.     if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)  
  25.     {  
  26.         WSACleanup();  
  27.         return 1;  
  28.     }  
  29.   
  30.     //***********建立套接字  
  31.     SOCKET sockServer = socket(AF_INET, SOCK_DGRAM, 0);  
  32.   
  33.     //***********將套接字繫結到一個本地地址和埠上  
  34.     sockaddr_in addrServer;  
  35.     addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);  
  36.     addrServer.sin_family = AF_INET;  
  37.     addrServer.sin_port = htons(6000);  
  38.     bind(sockServer, (sockaddr *)&addrServer, sizeof(sockaddr));  
  39.   
  40.     //***********等待接收資料  
  41.     char pBuffer[100];  
  42.     memset(pBuffer, 0, 100);  
  43.     sockaddr_in addrClient;  
  44.     int len = sizeof(sockaddr_in);  
  45.     recvfrom(sockServer, pBuffer, 100, 0, (sockaddr *)&addrClient, &len); //接受客戶端發來的訊息  
  46.   
  47.     //***********關閉套接字  
  48.     closesocket(sockServer);  
  49.   
  50.     cout<<pBuffer<<endl;  
  51.     system("PAUSE");  
  52.   
  53.     return 0;  
  54. }  

客戶端,建立一個Win32的控制檯應用程式,新建一個cpp檔案,取名為Client.cpp,其程式碼如下:

相關推薦

windows socket程式設計

 一、基於TCP的socket程式設計 伺服器端程式: 1)建立套接字(socket)。 此係統呼叫的實際效果是,請求作業系統把網路通訊所需要的一些系統資源(儲存器空間、CPU時間、網路寬頻等)分配給該應用程序。 2)將套接字繫結到一個本地地址和埠上(bind)。

UDP windowssocket程式設計例項

Server 端程式原始碼: #include <stdio.h> #include <Winsock2.h> void main() { SOCKET socket1; //InitWinsock();  WSADATA wsaData;     int iErrorCode;   

windowssocket程式設計,多執行緒

sercer端 #include <stdio.h> #include <process.h> #include <Winsock2.h> #pragma comment(lib,"ws2_32.lib") void send(void

windows環境Socket程式設計的幾種模型

阻塞模型, 這個模型是講解計算機網路時被作為例子介紹的,也是最簡單的。其基本原理是:首先建立一個socket連線,然後對其進行操作,比如,從該socket讀資料。因為網路傳輸是要一定的時間的,即使網路通暢的情況下,接受資料的操作也要花費時間。對於一個簡單的單執行緒程式,接收資料的過程是無法處理其他操作的。

c++ 網絡編程(四)TCP/IP LINUX/windows socket 基於I/O復用的服務器端代碼 解決多進程服務端創建進程資源浪費問題

linux系統中 cin 通過 sel print 大小 查看 服務 集合 原文作者:aircraft 原文鏈接:https://www.cnblogs.com/DOMLX/p/9613861.html 好了,繼上一篇說到多進程服務端也是有缺點的,每創建一個

pythonsocket程式設計之TCP連線狀態

1. 引言 python作為一門膠水語言,可以在各個領域上作為快速開發的工具,大大提高開發者處理事務的效率。在網際網路行業中,不管是對網路伺服器的開發,還是對網路客戶端,例如爬蟲的開發中,都會涉及到底層的執行原理,那就是socket程式設計,那麼今天,我們將對python下的socke

[原始碼和文件分享]基於C語言的Linux環境socket程式設計

一 需求分析 柏克萊套接字,又稱為BSD 套接字是一種應用程式介面,用於網際插座與Unix域套接字,包括了一個用C語言寫成的應用程式開發庫,主要用於實現程序間通訊,在計算機網路通訊方面被廣泛使用。 使用Berkeley套接字的系統有很多,本系統是在Ubuntu下用C語言進行socket程式設

linuxsocket程式設計基礎示例

本文主要用於記錄(因為有道雲容易丟失資料),程式碼並不規範,所有的內容都解除安裝main()函式裡面了,主要目的是為了方便自己理清流程。 服務端的程式碼: #include<unistd.h> #include<sys/types.h> #incl

linuxsocket程式設計“Broken pipe”錯誤

工作需要,對接伺服器的時候,客戶端傳送資料報錯“Broken pipe” 原因是對一個已關閉的套接字write兩次 細節講解參考:https://www.cnblogs.com/jingzhishen/p/3453727.html   demo 客戶端程式碼: #i

WindowsTCP程式設計的一些工具函式——應付大部分的Windows TPC程式設計場景。

首先是這些函式的定義: #define INTERNAL_LOG_ON 0 #define INTERNAL_LOG_OFF 1 #define INTERNAL_LOG_MODE INTERNAL_LOG_OFF //or INTERNAL_LOG_ON //#define INTE

Linux Socket程式設計基礎

作者: 東北大學秦皇島分校軟體中心技術研發部 敬茂華 1、 引言Linux的興起可以說是Internet創造的一個奇蹟。Linux作為一個完全開放其原始碼的免費的自由軟體,相容了各種UNIX標準(

linuxsocket程式設計和epoll的使用

這兩天在學Linux下的網路程式設計,於是便看了些關於socket和epoll的資料。 首先介紹socket,socket程式設計我之前也接觸過,不過是在windows下接觸的。和windows不同的是,windows下關於socket程式設計,

linuxsocket程式設計 select實現非阻塞模式多臺客戶端與伺服器通訊

select函式原型如下: int select (int maxfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); select系統呼叫是用來讓我們的程式

Linuxsocket程式設計之多執行緒TCP伺服器

程式碼如下: thread_server.c #include<string.h> #include<stdlib.h> #include<stdio.h> #include<sys/types.h> #i

C++伺服器(一):瞭解Linuxsocket程式設計

最近想要用C++寫個socket的伺服器,用於日常的專案開發。 不過,我是新手,那就慢慢地學習一下吧。 Server #include<iostream> using namespace std; //head files of

Linuxsocket程式設計之多程序TCP伺服器端

程式碼如下: tcp_server.c #include<string.h> #include<stdlib.h> #include<stdio.h> #include<sys/types.h> #includ

windowssocket開發tcp程式 簡單例子

Windows下的簡單tcp例子。 程式碼均在VC6.0下除錯過。 伺服器程式碼: //TCP server //listen port 9102 //receive string and display it //Visual C++ 6.0 #include &l

Linuxsocket程式設計之UDP簡單實現

本文實現一個簡單的UDP小例子,來說明Linux下socket程式設計之UDP的簡單實現。本文主要包括三個部分:伺服器端的實現,客服端的實現和通訊測試。實現的功能:客服端傳送一條訊息給伺服器端,伺服器

windowssocket函式一直返回-1的問題

今天遇到了一個SOCKET初始化的問題,執行平臺在linux中,在windows中除錯,就出現了socket一直返回-1的錯誤。解決辦法是增加了兩段程式碼,在windows中要使用socket,需要先註冊。WORDwVersionRequested;WSADATAwsaDat

linuxsocket程式設計常用標頭檔案

sys/types.h:資料型別定義 sys/socket.h:提供socket函式及資料結構 netinet/in.h:定義資料結構sockaddr_in arpa/inet.h:提供IP地址轉換函式 netdb.h:提供設定及獲取域名的函式 sys/ioct