note : basic socket opt
发布日期:2021-06-30 22:04:10
浏览次数:2
分类:技术文章
本文共 5213 字,大约阅读时间需要 17 分钟。
看到一个帖子, 让人生写一个简单的socket程序.
出于好奇, 试了一把.
试验结果,至少要有本地VS自带的MSDN, 才能写出socket程序~
我想, 能出这招的人,真是奇葩一朵~
// Client.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include#pragma comment(lib, "ws2_32.lib")#include #include "../common/constDefine.h"int _tmain(int argc, _TCHAR* argv[]){ BOOL bRc = FALSE; int iRc = 0; WSADATA wsaData; SOCKET sockClt = INVALID_SOCKET; sockaddr_in addr; TAG_CS_INFO info; ZeroMemory(&info, sizeof(TAG_CS_INFO)); iRc = WSAStartup(MAKEWORD(2, 2), &wsaData); if (NO_ERROR != iRc) { _tprintf(L"WSAStartup = %d\r\n", iRc); goto _tmain_END; } _tprintf(L"WSAStartup OK\r\n"); sockClt = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (INVALID_SOCKET == sockClt) { _tprintf(L"socket = INVALID_SOCKET\r\n"); goto _tmain_END; } _tprintf(L"socket OK\r\n"); addr.sin_family = AF_INET; addr.sin_addr.s_addr = inet_addr(SERVER_IP); addr.sin_port = htons(SERVER_PORT); iRc = connect(sockClt, (sockaddr *)&addr, sizeof(sockaddr)); if (NO_ERROR != iRc) { _tprintf(L"connect = %d\r\n", iRc); goto _tmain_END; } _tprintf(L"connect OK\r\n"); /// @todo 如果发送的内容较长, 需要考虑发送多次 iRc = send(sockClt, (const char *)&info, sizeof(TAG_CS_INFO), 0); if (sizeof(TAG_CS_INFO) != iRc) { _tprintf(L"send err : %d/%d\r\n", iRc, sizeof(TAG_CS_INFO)); goto _tmain_END; } _tprintf(L"send OK\r\n"); /// @todo 如果接收内容较长, 需要考虑接收多次,直到接收完全 iRc = recv(sockClt, (char *)&info, sizeof(TAG_CS_INFO), 0); if (sizeof(TAG_CS_INFO) != iRc) { _tprintf(L"recv err : %d/%d\r\n", iRc, sizeof(TAG_CS_INFO)); goto _tmain_END; } _tprintf(L"recv OK\r\n"); bRc = MakeAnswer(info.nFrame, info.dwInClient, info.dwOutServer); _tprintf(L"IsAnswerOK = %s\r\n", bRc ? L"TRUE" : L"FALSE");_tmain_END: if (INVALID_SOCKET != sockClt) closesocket(sockClt); WSACleanup(); _tprintf(L"END, press any key to quit\r\n"); getwchar(); return 0;}
// server.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include#pragma comment(lib, "ws2_32.lib")#include #include "../common/constDefine.h"int _tmain(int argc, _TCHAR* argv[]){ int iRc = 0; WSADATA wsaData; SOCKET sockSrv = INVALID_SOCKET; SOCKET sockTmp = INVALID_SOCKET; sockaddr_in addr; int iLenAddr = 0; TAG_CS_INFO info; iRc = WSAStartup(MAKEWORD(2, 2), &wsaData); if (NO_ERROR != iRc) { _tprintf(L"WSAStartup err\r\n"); goto _tmain_END; } sockSrv = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (INVALID_SOCKET == sockSrv) { _tprintf(L"INVALIDE_SOCKET == socket\r\n"); goto _tmain_END; } addr.sin_addr.s_addr = inet_addr(SERVER_IP); addr.sin_family = AF_INET; addr.sin_port = htons(SERVER_PORT); iRc = bind(sockSrv, (sockaddr *)&addr, sizeof(sockaddr_in)); if (NO_ERROR != iRc) { _tprintf(L"bind err\r\n"); goto _tmain_END; } iRc = listen(sockSrv, SOMAXCONN); if (NO_ERROR != iRc) { _tprintf(L"listen err\r\n"); goto _tmain_END; } while (1) { ZeroMemory(&info, sizeof(TAG_CS_INFO)); _tprintf(L"accept ...\r\n"); sockTmp = accept(sockSrv, NULL, NULL); if (INVALID_SOCKET == sockTmp) { _tprintf(L"INVALID_SOCKET == sockTmp\r\n"); continue; } _tprintf(L"accept OK\r\n"); /// @todo 需要考虑一次没收完的情况 iRc = recv(sockTmp, (char *)&info, sizeof(TAG_CS_INFO), 0); if (sizeof(TAG_CS_INFO) != iRc) { _tprintf(L"recv err : %d/%d\r\n", iRc, sizeof(TAG_CS_INFO)); continue; } _tprintf(L"recv OK\r\n"); /// 回答客户端 MakeAnswer(info.nFrame, info.dwInClient, info.dwOutServer); /// @todo 需要考虑数据没发完的情况 iRc = send(sockTmp, (char *)&info, sizeof(TAG_CS_INFO), 0); if (sizeof(TAG_CS_INFO) != iRc) { _tprintf(L"send err : %d/%d\r\n", iRc, sizeof(TAG_CS_INFO)); continue; } _tprintf(L"answer OK\r\n"); }_tmain_END: if (INVALID_SOCKET != sockSrv) closesocket(sockSrv); WSACleanup(); getwchar(); return 0;}
/// @file constDefine.h/// @brief 常量定义#ifndef __CONST_DEFINE_H__#define __CONST_DEFINE_H__#define SERVER_IP "127.0.0.1"#define SERVER_PORT 51000#pragma pack(1)/// 模拟C/S问答的结构typedef struct _tag_csInfo{ size_t nFrame; ///< 通讯祯号 DWORD dwInClient; ///< 客户端给出的数字 DWORD dwOutServer; ///< 服务器端根据dwInClient给出的数字}TAG_CS_INFO;#pragma pack()/// 客户端判断服务器回答是否正确BOOL IsAnswerOK(DWORD dwInClient, DWORD dwOutServer){ return ((dwInClient + 1) == dwOutServer);}/// 服务器段做答案BOOL MakeAnswer(size_t & nFrame, DWORD &dwInClient, DWORD &dwOutServer){ nFrame++; dwOutServer = dwInClient + 1; return TRUE;} #endif // #ifndef __CONST_DEFINE_H__
/// run result : serveraccept ...accept OKrecv OKanswer OKaccept ...
/// run result : clientWSAStartup OKsocket OKconnect OKsend OKrecv OKIsAnswerOK = TRUEEND, press any key to quit
转载地址:https://lostspeed.blog.csdn.net/article/details/13209043 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
表示我来过!
[***.240.166.169]2024年04月23日 06时21分45秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Seaborn + Pandas带你玩转股市数据可视化分析
2019-05-01
微软终于放大招了!这次能干掉Linux桌面?
2019-05-01
Python之父:Python 4.0可能不会来了
2019-05-01
Python爬虫快速入门,BeautifulSoup基本使用及实践
2019-05-01
PyTorch、TensorFlow最新版本对比,2021年了你选谁?
2019-05-01
深度学习图像标注工具labelme
2019-05-01
硅谷一万清华人,为何打不过印度人?
2019-05-01
太强了,用Python+Excel制作天气预报表!
2019-05-01
北大数学系“扫地僧”韦东奕爆红!拒绝哈佛 offer,留任北大,却因长相引热议...
2019-05-01
Python中文速查表来了!精心整理52张思维导图!
2019-05-01
别再问我Python打包成exe了!(终极版)
2019-05-01
当铛噹!Python字符串速查表来啦~
2019-05-01
收费的 XShell,我改用国产良心工具!
2019-05-01
想象中的论文答辩和真实的论文答辩!哈哈哈哈哈哈……
2019-05-01
基于 Python 的 11 种经典数据降维算法
2019-05-01
PyPy为什么能让Python原地起飞,速度比C还快!
2019-05-01
同样是技术出身,深夜看完王兴饭否的190条思考,越想越后怕!
2019-05-01
详尽实用的 PyCharm 教程,这篇文章值得一看
2019-05-01
Pyfolio一行代码实现专业量化回测图表
2019-05-01
Python正则表达式,这一篇就够了!
2019-05-01