本文來自:查看原文,請點此處O(∩_∩)O哈!
本文以windows socket 進行講解, 開發環境VS2010,測試平台 windows 7
眾所周知TCP(Transmission Control Protocol )是一種連線導向的、可靠的、基於位元組流的通訊協定。而開發TCP socket應用程式是一件比較簡單的事情。下面就用一個比較簡單的demo 講解開發的過程。
該程式分為用戶端和伺服器端,用戶端主要是向伺服器端發送資料,伺服器端主要是對於接收的資料進行顯示。
TCP伺服器端和用戶端的主要流程:
伺服器端:1 建立通訊端 2 綁定 3 監聽 4 接受串連 5 收發資料 6 關閉
用戶端: 1 建立通訊端 2 串連 3 收發資料 4 關閉
實現中用到的主要函數及
伺服器: 1 WSAStartup() 2 socket() 3 bind() 4 listen() 5 accept() 6 recv() 7 closesocket() 8 WSACleanup()
用戶端: 1 WSAStartup() 2 socket() 3 connect() 4 send() 5 closesocket() 6 WSACleanup()
下面是server 和 client 的實現代碼,啟動並執行時候首先啟動server,然後再啟動client, 則在server部分列印出“hello world” 。
Server.cpp 源碼
#include "stdafx.h"#define BUF_SZIE 64#include "winsock2.h"#pragma comment(lib, "ws2_32.lib") int main(int argc, char* argv[]){ WSADATA wsd; /*初始化套結字動態庫*/ if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) { printf("WSAStartup failed!\n"); return 1; } /*建立通訊端*/ SOCKET sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(INVALID_SOCKET == sServer) { printf("socket failed!\n"); WSACleanup(); return -1; } /*伺服器通訊端地址*/ SOCKADDR_IN addrServ; addrServ.sin_family = AF_INET; addrServ.sin_port = htons(4999); addrServ.sin_addr.s_addr = INADDR_ANY; /*綁定通訊端*/ int retVal = bind(sServer, (LPSOCKADDR)&addrServ, sizeof(SOCKADDR_IN)); if (SOCKET_ERROR == retVal) { closesocket(sServer); WSACleanup(); return -1; } /*開始監聽*/ retVal = listen(sServer, 1); if(SOCKET_ERROR == retVal) { closesocket(sServer); WSACleanup(); return -1; } /*接受用戶端請求*/ sockaddr_in addrClient; int addrClientlen = sizeof(addrClient); SOCKET sClient = accept(sServer,(sockaddr FAR*)&addrClient, &addrClientlen); if(INVALID_SOCKET == sClient) { closesocket(sServer); WSACleanup(); return -1; } /*接收用戶端資料*/ char buf[BUF_SZIE]; ZeroMemory(buf, BUF_SZIE); retVal = recv(sClient, buf, BUF_SZIE, 0); if (SOCKET_ERROR == retVal) { closesocket(sServer); closesocket(sClient); WSACleanup(); return -1; } printf("%s\n", buf); /*退出*/ closesocket(sServer); closesocket(sClient); WSACleanup(); getchar(); return 0;}
Client.cpp 源碼
#include "stdafx.h"#define BUF_SZIE 64#include "winsock2.h"#pragma comment(lib, "ws2_32.lib") int main(int argc, char* argv[]){ WSADATA wsd; if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) { printf("WSAStartup failed!\n"); return -1; } /*建立通訊端*/ SOCKET sHost = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(INVALID_SOCKET == sHost) { WSACleanup(); return -1; } /*設定伺服器位址*/ SOCKADDR_IN servAddr; servAddr.sin_family =AF_INET; servAddr.sin_addr.s_addr = inet_addr("127.0.0.1"); servAddr.sin_port = htons((short)4999); int nServAddlen = sizeof(servAddr); /*串連伺服器*/ int retVal = connect(sHost, (LPSOCKADDR)&servAddr, sizeof(servAddr)); if(SOCKET_ERROR == retVal) { closesocket(sHost); WSACleanup(); return -1; } /*向伺服器發送資料*/ char buf[BUF_SZIE]; ZeroMemory(buf, BUF_SZIE); strcpy(buf, "Hello world"); retVal = send(sHost, buf, strlen(buf), 0); if (SOCKET_ERROR == retVal) { closesocket(sHost); WSACleanup(); return -1; } /*退出*/ closesocket(sHost); WSACleanup(); getchar(); return 0;}
PS : 想多說一句,如果一直無法實現通訊,不妨換個連接埠試試~~~
我弄了好久。。。。才發現那個連接埠被佔用了。。。。額。。。。╮(╯▽╰)╭