C++ socket编程 实现服务端与客户端的通讯
生活随笔
收集整理的這篇文章主要介紹了
C++ socket编程 实现服务端与客户端的通讯
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
//?Server.cpp?:?Defines?the?entry?point?for?the?console?application.?? //?? ?? #include?"winsock2.h"?? #pragma?comment(lib,?"ws2_32.lib")?? #include?<iostream>?? using?namespace?std;?? int?main(int?argc,?char*?argv[])?? {?? ????const?int?BUF_SIZE?=?64;?? ????WSADATA?????????wsd;????????????//WSADATA變量?? ????SOCKET??????????sServer;????????//服務器套接字?? ????SOCKET??????????sClient;????????//客戶端套接字?? ????SOCKADDR_IN?????addrServ;;??????//服務器地址?? ????char????????????buf[BUF_SIZE];??//接收數據緩沖區?? ????char????????????sendBuf[BUF_SIZE];//返回給客戶端得數據?? ????int?????????????retVal;?????????//返回值?? ????//初始化套結字動態庫?? ????if?(WSAStartup(MAKEWORD(2,2),?&wsd)?!=?0)?? ????{?? ????????cout?<<?"WSAStartup?failed!"?<<?endl;?? ????????return?1;?? ????}?? ?????? ????//創建套接字?? ????sServer?=?socket(AF_INET,?SOCK_STREAM,?IPPROTO_TCP);?????? ????if(INVALID_SOCKET?==?sServer)?? ????{?? ????????cout?<<?"socket?failed!"?<<?endl;?? ????????WSACleanup();//釋放套接字資源;?? ????????return??-1;?? ????}?? ?????? ????//服務器套接字地址??? ????addrServ.sin_family?=?AF_INET;?? ????addrServ.sin_port?=?htons(4999);?? ????addrServ.sin_addr.s_addr?=?INADDR_ANY;???????? ????//綁定套接字?? ????retVal?=?bind(sServer,?(LPSOCKADDR)&addrServ,?sizeof(SOCKADDR_IN));?? ????if(SOCKET_ERROR?==?retVal)?? ????{????? ????????cout?<<?"bind?failed!"?<<?endl;?? ????????closesocket(sServer);???//關閉套接字?? ????????WSACleanup();???????????//釋放套接字資源;?? ????????return?-1;?? ????}?? ?????? ????//開始監聽??? ????retVal?=?listen(sServer,?1);?? ????if(SOCKET_ERROR?==?retVal)?? ????{?? ????????cout?<<?"listen?failed!"?<<?endl;????????? ????????closesocket(sServer);???//關閉套接字?? ????????WSACleanup();???????????//釋放套接字資源;?? ????????return?-1;?? ????}?? ?????? ????//接受客戶端請求?? ????sockaddr_in?addrClient;?? ????int?addrClientlen?=?sizeof(addrClient);?? ????sClient?=?accept(sServer,(sockaddr?FAR*)&addrClient,?&addrClientlen);?? ????if(INVALID_SOCKET?==?sClient)?? ????{?? ????????cout?<<?"accept?failed!"?<<?endl;????????? ????????closesocket(sServer);???//關閉套接字?? ????????WSACleanup();???????????//釋放套接字資源;?? ????????return?-1;?? ????}?? ?????? ????while(true)?? ????{?? ????????//接收客戶端數據?? ????????ZeroMemory(buf,?BUF_SIZE);?? ????????retVal?=?recv(sClient,?buf,?BUF_SIZE,?0);?? ????????if?(SOCKET_ERROR?==?retVal)?? ????????{?? ????????????cout?<<?"recv?failed!"?<<?endl;??????? ????????????closesocket(sServer);???//關閉套接字?? ????????????closesocket(sClient);???//關閉套接字??????? ????????????WSACleanup();???????????//釋放套接字資源;?? ????????????return?-1;?? ????????}?? ????????if(buf[0]?==?'0')?? ????????????break;?? ????????cout?<<?"客戶端發送的數據:?"?<<?buf?<<endl;?? ?????????? ????????cout?<<?"向客戶端發送數據:?"?;?? ????????cin?>>?sendBuf;?? ?????????? ????????send(sClient,?sendBuf,?strlen(sendBuf),?0);?? ????}?? ?????? ????//退出?? ????closesocket(sServer);???//關閉套接字?? ????closesocket(sClient);???//關閉套接字?? ????WSACleanup();???????????//釋放套接字資源;?? ?????? ????return?0;?? }??
#include?"winsock2.h"?? #include?<iostream>?? #pragma?comment(lib,?"ws2_32.lib")?? ?? using?namespace?std;?? BOOL?RecvLine(SOCKET?s,?char*?buf);?//讀取一行數據?? ?? int?main(int?argc,?char*?argv[])?? {?? const?int?BUF_SIZE?=?64;?? ?? WSADATA?wsd;?//WSADATA變量?? SOCKET?sHost;?//服務器套接字?? SOCKADDR_IN?servAddr;?//服務器地址?? char?buf[BUF_SIZE];?//接收數據緩沖區?? char?bufRecv[BUF_SIZE];?? int?retVal;?//返回值?? //初始化套結字動態庫?? if?(WSAStartup(MAKEWORD(2,2),?&wsd)?!=?0)?? {?? cout?<<?"WSAStartup?failed!"?<<?endl;?? return?-1;?? }?? //創建套接字?? sHost?=?socket(AF_INET,?SOCK_STREAM,?IPPROTO_TCP);?? if(INVALID_SOCKET?==?sHost)?? {?? cout?<<?"socket?failed!"?<<?endl;?? WSACleanup();//釋放套接字資源?? return??-1;?? }?? ?? //設置服務器地址?? 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);?? ?? //連接服務器?? retVal=connect(sHost,(LPSOCKADDR)&servAddr,?sizeof(servAddr));?? if(SOCKET_ERROR?==?retVal)?? {?? cout?<<?"connect?failed!"?<<?endl;?? closesocket(sHost);?//關閉套接字?? WSACleanup();?//釋放套接字資源?? return?-1;?? }?? while(true)?? {?? //向服務器發送數據?? ZeroMemory(buf,?BUF_SIZE);?? cout?<<?"?向服務器發送數據:??";?? cin?>>?buf;?? retVal?=?send(sHost,?buf,?strlen(buf),?0);?? if?(SOCKET_ERROR?==?retVal)?? {?? cout?<<?"send?failed!"?<<?endl;?? closesocket(sHost);?//關閉套接字?? WSACleanup();?//釋放套接字資源?? return?-1;?? }?? //RecvLine(sHost,?bufRecv);?? ZeroMemory(bufRecv,?BUF_SIZE);?? recv(sHost,?bufRecv,BUF_SIZE?,?0);?//?接收服務器端的數據,?只接收5個字符?? cout?<<?endl?<<"從服務器接收數據:"<<?bufRecv;?? cout<<"\n";?? }?? //退出?? closesocket(sHost);?//關閉套接字?? WSACleanup();?//釋放套接字資源?? return?0;?? }??
服務器端程序:
[cpp]?view plaincopy
客戶端程序:
[cpp]?view plaincopy
總結
以上是生活随笔為你收集整理的C++ socket编程 实现服务端与客户端的通讯的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TS流头部的调整字段
- 下一篇: C++经典书籍和相关内容