C/S模型之TCP协议
2023-09-11 14:21:07 时间
服务端: // WSASever.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <WinSock2.h> #include <Windows.h> #pragma comment (lib,"wSock32.lib") int _tmain(int argc, _TCHAR* argv[]) { WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD(2, 2); err = WSAStartup(wVersionRequested, &wsaData); if (err != 0) { printf("WSAStartup failed with error: %d\n", err); return 1; } if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) { printf("Could not find a usable version of Winsock.dll\n"); WSACleanup(); return 1; } else printf("The Winsock 2.2 dll was found okay\n"); //程序开始 //创建socket->bing-》listen->accept->recv->send->closesocket SOCKET severSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (severSocket == INVALID_SOCKET) { printf("new socket error!"); } SOCKADDR_IN sockAddr; sockAddr.sin_port = htons(10086); sockAddr.sin_family = AF_INET; //IP地址表示方法 /*方法1: m_addr.sin_addr.S_un.S_un_b.s_b1 = 192; m_addr.sin_addr.S_un.S_un_b.s_b2 = 168; m_addr.sin_addr.S_un.S_un_b.s_b3 = 0; m_addr.sin_addr.S_un.S_un_b.s_b4 = 1; 方法2: m_addr.sin_addr.S_un.S_un_w.s_w1 = (168 << 8) | 192; m_addr.sin_addr.S_un.S_un_w.s_w2 = (1 << 8) | 0; 方法3: m_addr.sin_addr.S_un.S_addr = (1 << 24) | (0 << 16) | (168 << 8) | 192 方法4; service.sin_addr.s_addr = inet_addr("127.0.0.1"); */ //sockAddr.sin_addr.s_addr = inet_addr(INADDR_ANY); sockAddr.sin_addr.S_un.S_un_b.s_b1 = 127; sockAddr.sin_addr.S_un.S_un_b.s_b2 = 0; sockAddr.sin_addr.S_un.S_un_b.s_b3 = 0; sockAddr.sin_addr.S_un.S_un_b.s_b4 = 1; if (bind(severSocket, (sockaddr*)&sockAddr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR) { printf("bind error! %d\n", WSAGetLastError()); } //监听1个 if (listen(severSocket, 5) == SOCKET_ERROR) { printf("listen error!%d\n", WSAGetLastError()); } //创建一个一客户端连接的socket SOCKET sockLink = accept(severSocket, NULL, NULL); if (sockLink != INVALID_SOCKET) { printf("communication sucess!\n"); } int nErr=0; while (true) { char pSeverBuff[MAXBYTE] = { 0 }; nErr = recv(sockLink, pSeverBuff, MAXBYTE, 0); printf("%s(%d)%s\n", inet_ntoa(sockAddr.sin_addr), sockAddr.sin_port, pSeverBuff); send(sockLink, pSeverBuff, MAXBYTE, 0); //当客户端关闭时,服务端也随之关闭 if (nErr == INVALID_SOCKET) break; } closesocket(severSocket); closesocket(sockLink); WSACleanup(); return 0; }
客户端 // WASClient.cpp : 定义控制台应用程序的入口点。 // //#include <WinSock2.h>一定要在#include <Windows.h>前面 #include "stdafx.h" #include <WinSock2.h> #include <Windows.h> #pragma comment (lib,"wSock32.lib") int _tmain(int argc, _TCHAR* argv[]) { WORD wVersionRequested; WSADATA wsaData; int err; //版本检测 wVersionRequested = MAKEWORD(2, 2); err = WSAStartup(wVersionRequested, &wsaData); if (err != 0) { printf("WSAStartup failed with error: %d\n", err); return 1; } if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) { printf("Could not find a usable version of Winsock.dll\n"); WSACleanup(); return 1; } else printf("The Winsock 2.2 dll was found okay\n"); //程序开始 //创建socket-》连接connect-》发送send-》接受recv-》释放closesocke SOCKET clientSocket=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (clientSocket == INVALID_SOCKET) { printf("new socket error!"); } SOCKADDR_IN sockAddr; //一定要把主机字节序换成网络字节序 并是short类型 htons() sockAddr.sin_port = htons(10086); sockAddr.sin_family = AF_INET; //IP地址表示方法 /*方法1: m_addr.sin_addr.S_un.S_un_b.s_b1 = 192; m_addr.sin_addr.S_un.S_un_b.s_b2 = 168; m_addr.sin_addr.S_un.S_un_b.s_b3 = 0; m_addr.sin_addr.S_un.S_un_b.s_b4 = 1; 方法2: m_addr.sin_addr.S_un.S_un_w.s_w1 = (168 << 8) | 192; m_addr.sin_addr.S_un.S_un_w.s_w2 = (1 << 8) | 0; 方法3: m_addr.sin_addr.S_un.S_addr = (1 << 24) | (0 << 16) | (168 << 8) | 192*/ sockAddr.sin_addr.S_un.S_un_b.s_b1 = 127; sockAddr.sin_addr.S_un.S_un_b.s_b2 = 0; sockAddr.sin_addr.S_un.S_un_b.s_b3 = 0; sockAddr.sin_addr.S_un.S_un_b.s_b4 = 1; if (connect(clientSocket, (sockaddr*)&sockAddr, sizeof(SOCKADDR_IN)) != SOCKET_ERROR) { printf("communication sucess!\n"); } char pClientBuf[MAXBYTE] = {0}; //请求连接 while (TRUE) { gets_s(pClientBuf); send(clientSocket, pClientBuf, MAXBYTE, 0); recv(clientSocket, pClientBuf, MAXBYTE, 0); printf("return from sever:%s\n", pClientBuf); } WSACleanup(); closesocket(clientSocket); return 0; }
相关文章
- TCP拥塞机制
- Unity3D使用TCP/IP协议,传递protocol buffer消息protobuf-net
- 利尔达模组CAT1 UIS8910指令的 TCP相关中文解释
- TCP/IP 和 Socket 的关系
- tcp关闭连接:挥手讨论
- TCP断开连接的4次握手协议截图
- 网络之OSI七层协议模型、TCP/IP四层模型
- 什么是TCP/IP协议和举例
- TCP/IP协议
- 抓包整理————tcp 协议[八]
- 计算机网络再次整理————tcp例子前奏[三]
- TCP/IP协议资料图整理
- nodejs TCP服务器和客户端通信的socket结构
- UDP协议为什么比TCP协议快的原理
- Socket TCP协议通讯粘包算法
- UNIX网络编程卷1 时间获取程序server TCP 协议相关性
- WIZnet通过启动在线培训活动:计算机网络TCP/IP协议而事实上,现在的方法
- TCP/IP协议,HTTP协议
- 【转载】TCP协议要点和难点全解
- 高效的TCP数据拆包器
- tcp/ip协议listen函数中backlog參数的含义
- 太厉害了,终于有人能把TCP/IP协议讲的明明白白了! 转
- Nginx 中 fastcgi_pass 监听端口 unix socket和tcp socket差
- 网络协议 传输层协议 TCP:TCP 为什么握手是 3 次、挥手是 4 次?