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- #pragma comment(lib,"Ws2_32.lib")
- #include <Winsock2.h>
- #include <iostream>
- using namespace std;
- #include <stdio.h>
- #include <string.h>
- int main()
- {
- //********獲取應用程式所需的Winsock DLL版本資訊
- WORD wVersionRequested;
- wVersionRequested = MAKEWORD(1, 1); //設定高位元組為1,低位元組為1的WORD型別,表示所需Windows Sockets的版本號為1.1
- WSADATA wsaData; //用來儲存獲取的Windows Sockets的資訊
- int err = WSAStartup(wVersionRequested, &wsaData); //初始化此程序的Winsock DLL的使用
- //初始化失敗,直接返回
- if (err != 0)
- {
- return 1;
- }
- //告訴使用者,找不到可用的Winsock DLL
- if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
- {
- WSACleanup();
- return 1;
- }
- //*********建立套接字
- SOCKET sockServer = socket(AF_INET, SOCK_STREAM, 0);
- //*********將套接字繫結到一個本地地址和埠上
- sockaddr_in addrServer; //儲存sock地址資訊
- addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //IP地址為INADDR_ANY,允許套接字向任何分配給本地機器的IP地址傳送或接收資料
- addrServer.sin_family = AF_INET; //地址簇
- addrServer.sin_port = htons(6000);
- bind(sockServer, (sockaddr *)&addrServer, sizeof(sockaddr));
- //*********將套接字設為監聽模式,準備接收客戶請求
- listen(sockServer, 5); //監聽的套接字最大數為5
- //*********等待客戶請求到來
- sockaddr_in addrClient; //儲存sock所連線的客戶端的地址資訊
- int addrlen = sizeof(sockaddr);
- while (1)
- {
- //當請求到來後,接受連線請求,返回一個新的對應於此次連線的套接字
- SOCKET sockConnect = accept(sockServer, (sockaddr *)&addrClient, &addrlen);
- //*********用返回的套接字和客戶端進行通訊
- char pBuffer[100];
- memset(pBuffer, 0, 100);
- strcat(pBuffer, "Welcome ");
- strcat(pBuffer, inet_ntoa(addrClient.sin_addr));
- strcat(pBuffer, " to http://www.sunxin.org!");
- send(sockConnect, pBuffer, (strlen(pBuffer) + 1) * sizeof(char), 0); //給客戶端傳送訊息
- char recvBuf[100];
- memset(recvBuf, 0, 100);
- recv(sockConnect, recvBuf, 100, 0); //接收客戶端發來的訊息
- //*********關閉socket連線
- closesocket(sockConnect);
- cout<<recvBuf<<endl;
- }
- return 0;
- }
客戶端,建立一個Win32的控制檯應用程式,新建一個cpp檔案,取名為Client.cpp,其程式碼如下:
[cpp] view plain copy- #pragma comment(lib,"Ws2_32.lib")
- #include <Winsock2.h>
- #include <iostream>
- using namespace std;
- #include <stdio.h>
- #include <string.h>
- int main()
- {
- //********獲取應用程式所需的Winsock DLL版本資訊
- WORD wVersionRequested;
- wVersionRequested = MAKEWORD(1, 1); //設定高位元組為1,低位元組為1的WORD型別,表示所需Windows Sockets的版本號為1.1
- WSADATA wsaData; //用來儲存獲取的Windows Sockets的資訊
- int err = WSAStartup(wVersionRequested, &wsaData); //初始化此程序的Winsock DLL的使用
- //初始化失敗,直接返回
- if (err != 0)
- {
- return 1;
- }
- //告訴使用者,找不到可用的Winsock DLL
- if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
- {
- WSACleanup();
- return 1;
- }
- //*********建立套接字
- SOCKET sockClient = socket(AF_INET, SOCK_STREAM, 0);
- //*********向伺服器發出連線請求
- sockaddr_in addrServer; //儲存伺服器端的sock地址資訊
- addrServer.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //伺服器IP地址,此處伺服器為本機
- addrServer.sin_family = AF_INET; //地址簇
- addrServer.sin_port = htons(6000);
- connect(sockClient, (sockaddr *)&addrServer, sizeof(sockaddr));
- //*********和伺服器端進行通訊
- char *pBuffer = "This is liuxijiao.";
- send(sockClient, pBuffer, (strlen(pBuffer) + 1) * sizeof(char), 0); //給伺服器傳送訊息
- char recvBuf[100];
- memset(recvBuf, 0, 100);
- recv(sockClient, recvBuf, 100, 0); //接收伺服器發來的訊息
- //*********關閉socket連線
- closesocket(sockClient);
- WSACleanup();
- cout<<recvBuf<<endl;
- system("PAUSE");
- return 0;
- }
首先執行伺服器端的程式,然後再執行客戶端的程式。
在伺服器端收到客戶端傳送來的訊息:
在客戶端收到伺服器端傳送來的訊息:
(2)基於UDP的Socket程式設計
伺服器端,建立一個Win32的控制檯應用程式,新建一個cpp檔案,取名為Server.cpp,其程式碼如下:
[cpp] view plain copy- #pragma comment(lib, "Ws2_32.lib")
- #include <Winsock2.h>
- #include <iostream>
- using namespace std;
- #include <stdio.h>
- #include <string.h>
- int main()
- {
- //********獲取應用程式所需的Winsock DLL版本資訊
- WORD wVersionRequested;
- wVersionRequested = MAKEWORD(1, 1); //設定高位元組為1,低位元組為1的WORD型別,表示所需Windows Sockets的版本號為1.1
- WSADATA wsaData; //用來儲存獲取的Windows Sockets的資訊
- int err = WSAStartup(wVersionRequested, &wsaData); //初始化此程序的Winsock DLL的使用
- //初始化失敗,直接返回
- if (err != 0)
- {
- return 1;
- }
- //告訴使用者,找不到可用的Winsock DLL
- if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
- {
- WSACleanup();
- return 1;
- }
- //***********建立套接字
- SOCKET sockServer = socket(AF_INET, SOCK_DGRAM, 0);
- //***********將套接字繫結到一個本地地址和埠上
- sockaddr_in addrServer;
- addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
- addrServer.sin_family = AF_INET;
- addrServer.sin_port = htons(6000);
- bind(sockServer, (sockaddr *)&addrServer, sizeof(sockaddr));
- //***********等待接收資料
- char pBuffer[100];
- memset(pBuffer, 0, 100);
- sockaddr_in addrClient;
- int len = sizeof(sockaddr_in);
- recvfrom(sockServer, pBuffer, 100, 0, (sockaddr *)&addrClient, &len); //接受客戶端發來的訊息
- //***********關閉套接字
- closesocket(sockServer);
- cout<<pBuffer<<endl;
- system("PAUSE");
- return 0;
- }
客戶端,建立一個Win32的控制檯應用程式,新建一個cpp檔案,取名為Client.cpp,其程式碼如下:
相關推薦
windows下 socket程式設計
一、基於TCP的socket程式設計 伺服器端程式: 1)建立套接字(socket)。 此係統呼叫的實際效果是,請求作業系統把網路通訊所需要的一些系統資源(儲存器空間、CPU時間、網路寬頻等)分配給該應用程序。 2)將套接字繫結到一個本地地址和埠上(bind)。
UDP windows下socket程式設計例項
Server 端程式原始碼: #include <stdio.h> #include <Winsock2.h> void main() { SOCKET socket1; //InitWinsock(); WSADATA wsaData; int iErrorCode;
windows下socket程式設計,多執行緒
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 好了,繼上一篇說到多進程服務端也是有缺點的,每創建一個
python下socket程式設計之TCP連線狀態
1. 引言 python作為一門膠水語言,可以在各個領域上作為快速開發的工具,大大提高開發者處理事務的效率。在網際網路行業中,不管是對網路伺服器的開發,還是對網路客戶端,例如爬蟲的開發中,都會涉及到底層的執行原理,那就是socket程式設計,那麼今天,我們將對python下的socke
[原始碼和文件分享]基於C語言的Linux環境下socket程式設計
一 需求分析 柏克萊套接字,又稱為BSD 套接字是一種應用程式介面,用於網際插座與Unix域套接字,包括了一個用C語言寫成的應用程式開發庫,主要用於實現程序間通訊,在計算機網路通訊方面被廣泛使用。 使用Berkeley套接字的系統有很多,本系統是在Ubuntu下用C語言進行socket程式設
linux下socket程式設計基礎示例
本文主要用於記錄(因為有道雲容易丟失資料),程式碼並不規範,所有的內容都解除安裝main()函式裡面了,主要目的是為了方便自己理清流程。 服務端的程式碼: #include<unistd.h> #include<sys/types.h> #incl
linux下socket程式設計“Broken pipe”錯誤
工作需要,對接伺服器的時候,客戶端傳送資料報錯“Broken pipe” 原因是對一個已關閉的套接字write兩次 細節講解參考:https://www.cnblogs.com/jingzhishen/p/3453727.html demo 客戶端程式碼: #i
Windows下TCP程式設計的一些工具函式——應付大部分的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標準(
linux下socket程式設計和epoll的使用
這兩天在學Linux下的網路程式設計,於是便看了些關於socket和epoll的資料。 首先介紹socket,socket程式設計我之前也接觸過,不過是在windows下接觸的。和windows不同的是,windows下關於socket程式設計,
linux下socket程式設計 select實現非阻塞模式多臺客戶端與伺服器通訊
select函式原型如下: int select (int maxfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); select系統呼叫是用來讓我們的程式
Linux下socket程式設計之多執行緒TCP伺服器
程式碼如下: thread_server.c #include<string.h> #include<stdlib.h> #include<stdio.h> #include<sys/types.h> #i
C++伺服器(一):瞭解Linux下socket程式設計
最近想要用C++寫個socket的伺服器,用於日常的專案開發。 不過,我是新手,那就慢慢地學習一下吧。 Server #include<iostream> using namespace std; //head files of
Linux下socket程式設計之多程序TCP伺服器端
程式碼如下: tcp_server.c #include<string.h> #include<stdlib.h> #include<stdio.h> #include<sys/types.h> #includ
windows下socket開發tcp程式 簡單例子
Windows下的簡單tcp例子。 程式碼均在VC6.0下除錯過。 伺服器程式碼: //TCP server //listen port 9102 //receive string and display it //Visual C++ 6.0 #include &l
Linux下socket程式設計之UDP簡單實現
本文實現一個簡單的UDP小例子,來說明Linux下socket程式設計之UDP的簡單實現。本文主要包括三個部分:伺服器端的實現,客服端的實現和通訊測試。實現的功能:客服端傳送一條訊息給伺服器端,伺服器
windows下socket函式一直返回-1的問題
今天遇到了一個SOCKET初始化的問題,執行平臺在linux中,在windows中除錯,就出現了socket一直返回-1的錯誤。解決辦法是增加了兩段程式碼,在windows中要使用socket,需要先註冊。WORDwVersionRequested;WSADATAwsaDat
linux下socket程式設計常用標頭檔案
sys/types.h:資料型別定義 sys/socket.h:提供socket函式及資料結構 netinet/in.h:定義資料結構sockaddr_in arpa/inet.h:提供IP地址轉換函式 netdb.h:提供設定及獲取域名的函式 sys/ioct