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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:资料搜索 tips
下一篇:windbg : set message break point on win7x64

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月23日 06时21分45秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章