使用Code::blocks在windows下写网络程序
使用Code::blocks在windows下写网络程序
|
作者 |
He YiJun – storysnail<at>hotmail.com |
||||
|
版权 |
转载请保留本声明! 本文档包含的原创代码根据General Public License,v3 发布 本文档根据GNU 文中所引用的软件版权详见各软件版权具体声明,文中所提及的所有商标均为各自商标所有人的财产。 |
||||
|
更新 |
|
前言:
这是一个用来读取指定网页内容的程序。当前还非常原始,但已经能完成基本的功能。未来我会在这个程序的基础上不断扩充,让这个程序变成一个可用的更新检测程序!
一:windows下用Code::blocks开发网络程序
1:
Code::blocks 中新建一个工程
2:
建完工程后点击Project菜单,选择Build
options...
3:
选择Linker
settings标签页,在Other
linker options:中添加:
-lwsock32

二 源代码
- /***********************************************************************
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
- Eabc-version-verfy.c
- Develop Team : ls
- Team Leader : He YiJun (storysnail<at>gmail.com)
- Main Programmer : He YiJun
- Programmer : Ling Ying
- Program comments : Ling Ying
- Dict Editor : Yang QiuXi
- Documents : Ling Ying、 Yang QiuXi
- Art Designer : He YiJun
- License : GPLv3
- Last Update : 2013-02-25
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
- *************************************************************************/
- #include <windows.h> // 新增 windows.h
- #include <winsock2.h>
- //#pragma comment(lib, "ws2_32.lib") // For VS
- #include <tchar.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <malloc.h>
- #include <io.h>
- #ifdef _MT
- #include <process.h>
- #endif
- /* DWORD_PTR (pointer precision unsigned integer) is used for integers
- * that are converted to handles or pointers
- * This eliminates Win64 warnings regarding conversion between
- * 32 and 64-bit data, as HANDLEs and pointers are 64 bits in
- * Win64 (See Chapter 16). This is enable only if _Wp64 is defined.
- */
- #if !defined(_Wp64)
- #define DWORD_PTR DWORD
- #define LONG_PTR LONG
- #define INT_PTR INT
- #endif
- #define MAX_RQRS_LEN 0x1000 //4096
- /* Required for sockets */
- #define SERVER_PORT 80
- typedef struct {
- LONG32 rsLen;
- BYTE record [MAX_RQRS_LEN];
- } RESPONSE;
- typedef struct {
- LONG32 rqLen;
- BYTE record [MAX_RQRS_LEN];
- } REQUEST;
- #define RQ_SIZE sizeof (REQUEST)
- #define RQ_HEADER_LEN RQ_SIZE-MAX_RQRS_LEN
- #define RS_SIZE sizeof (RESPONSE)
- #define RS_HEADER_LEN RS_SIZE-MAX_RQRS_LEN
- static BOOL SendRequest (REQUEST *, SOCKET);
- static BOOL ReceiveResponse (RESPONSE *, SOCKET);
- static VOID PrintError (LPCTSTR , DWORD , BOOL);
- struct sockaddr_in clientSAddr;
- int _tmain (int argc, LPSTR argv[])
- {
- SOCKET clientSock = INVALID_SOCKET;
- REQUEST request;
- RESPONSE response;
- WSADATA WSStartData; /* Socket library data structure */
- DWORD conVal;
- while (1) {
- _tprintf (_T("%s"), _T("\nEnter Command: "));
- _fgetts ((char *)request.record, MAX_RQRS_LEN-1, stdin);
- /* Get rid of the new line at the end */
- /* Messages use 8-bit characters */
- request.record[strlen((char *)request.record)-1] = '\0';
- if (strcmp ((char *)request.record, "$Quit") == 0)
- break;
- if (strncmp ((char *)request.record, "GET",3) == 0)
- request.record[strlen((char *)request.record)] = '\n';
- /* Initialize the WS library. Ver 2.2 */
- if (WSAStartup (MAKEWORD (2, 2), &WSStartData) != 0)
- PrintError (_T("Cannot support sockets"), 1, TRUE);
- /* Connect to the server */
- /* Follow the standard client socket/connect sequence */
- clientSock = socket(AF_INET, SOCK_STREAM, 0);
- if (clientSock == INVALID_SOCKET)
- PrintError (_T("Failed client socket() call"), 2, TRUE);
- memset (&clientSAddr, 0, sizeof(clientSAddr));
- clientSAddr.sin_family = AF_INET;
- //clientSAddr.sin_addr.s_addr = htonl(inet_addr ("121.127.248.96"));
- clientSAddr.sin_addr.s_addr = inet_addr ("121.127.248.96");
- clientSAddr.sin_port = htons(SERVER_PORT);
- conVal = connect (clientSock, (struct sockaddr *)&clientSAddr, sizeof(clientSAddr));
- if (conVal == SOCKET_ERROR) PrintError (_T("Failed client connect() call)"), 3, TRUE);
- SendRequest (&request, clientSock);
- ReceiveResponse (&response, clientSock);
- shutdown (clientSock, SD_BOTH); /* Disallow sends and receives */
- closesocket (clientSock);
- WSACleanup();
- close (clientSock);
- }
- _tprintf (_T("\n****Leaving client\n"));
- return 0;
- }
- // GET http://www.7fane.com/test.html
- BOOL SendRequest (REQUEST *pRequest, SOCKET sd)
- {
- /* Send the the request to the server on socket sd */
- BOOL disconnect = FALSE;
- LONG32 nRemainSend, nXfer;
- LPBYTE pBuffer;
- //char target[]="GET http://www.7fane.com/test.html\n";
- pRequest->rqLen = (DWORD)(strlen ((char *)pRequest->record) + 1);
- nRemainSend = pRequest->rqLen;
- pBuffer = (LPBYTE)pRequest->record;
- _tprintf (_T("%s%s"), _T("\nNow SendRequestMessage: "),pBuffer);
- while (nRemainSend > 0 && !disconnect) {
- nXfer = send (sd, (char *)pBuffer, nRemainSend, 0);
- //nXfer = send (sd, target, strlen(target), 0);
- if (nXfer == SOCKET_ERROR) PrintError (_T("client send() failed"), 5, TRUE);
- disconnect = (nXfer == 0);
- nRemainSend -=nXfer;
- pBuffer += nXfer;
- _tprintf (_T("%s%d"), _T("\nSend btyes: "),nXfer);
- //_tprintf (_T("%s%s"), _T("\nSend content: "),target);
- _tprintf (_T("%s%s"), _T("\nSend content: "),pRequest->record);
- }
- return disconnect;
- }
- BOOL ReceiveResponse (RESPONSE *pResponse, SOCKET sd)
- {
- BOOL disconnect = FALSE;
- LONG32 nRemainRecv, nXfer;
- LPBYTE pBuffer;
- _tprintf (_T("%s"), _T("\nNow ReceiveResponseMessage! "));
- while(!disconnect) {
- /* Read each response and send it to std out.*/
- memset (pResponse->record, 0, MAX_RQRS_LEN);
- nRemainRecv = MAX_RQRS_LEN;
- pBuffer = (LPBYTE)pResponse->record;
- while (nRemainRecv > 0 && !disconnect) {
- nXfer = recv (sd, (char *)pBuffer, nRemainRecv, 0);
- if (nXfer == SOCKET_ERROR) PrintError (_T("client response recv() failed"), 7, TRUE);
- disconnect = (nXfer == 0);
- nRemainRecv -=nXfer;
- pBuffer += nXfer;
- if(!disconnect) {
- _tprintf (_T("%s[%d]"), _T("\nReceive bytes: "),nXfer);
- _tprintf (_T("%s\n%s"), _T("\nReceive content: "),pResponse->record);
- }
- }
- }
- return disconnect;
- }
- VOID PrintError (LPCTSTR userMessage, DWORD exitCode, BOOL printErrorMessage)
- {
- DWORD eMsgLen, errNum = GetLastError ();
- LPTSTR lpvSysMsg;
- _ftprintf (stderr, _T("%s\n"), userMessage);
- if (printErrorMessage) {
- eMsgLen = FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
- NULL, errNum, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
- (LPTSTR) &lpvSysMsg, 0, NULL);
- if (eMsgLen > 0)
- {
- _ftprintf (stderr, _T("%s\n"), lpvSysMsg);
- }
- else
- {
- _ftprintf (stderr, _T("Last Error Number; %d.\n"), (int)errNum);
- }
- if (lpvSysMsg != NULL) LocalFree (lpvSysMsg); /* Explained in Chapter 5. */
- }
- if (exitCode > 0)
- ExitProcess (exitCode);
- return;
- }
三 运行截图
程序开始运行

输入命令和网址
注意下面截图的网址是我和泠在很久以前建的网站地址,目前已经失效了,所以你应该用一个有效的网址替换!

程序得到的网页内容

退出程序

下面是该程序的linux版本,这段程序是《使用C4droid和botbrew在andriod手机上编程 》这篇文章的两个示例程序之一,不过《使用C4droid和botbrew在andriod手机上编程 》这篇文章现在已经放弃维护了!
/********************************************************************************
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
get-www
main.c Develop Team : ls
Main Programmer : He YiJun (storysnail<at>gmail.com)
License : GPLv3
Last Update : 2013-03-03
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
*********************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h> static int gw_connect(char *domain,int port)
{
int sock_sd;
int i;
struct hostent *site_dns;
struct sockaddr_in s_addr;
site_dns = gethostbyname(domain);
if(site_dns == NULL) {
printf("gethostbyname error!\n");
return -;
}
printf("default ip: %s\n",inet_ntoa(*((struct in_addr *)site_dns->h_addr)));
for(i=; i< site_dns->h_length/sizeof(int); i++) {
printf("IP:%d:%s\n",i+,inet_ntoa(*((struct in_addr *)site_dns->h_addr_list[i])));
}
sock_sd = socket(AF_INET,SOCK_STREAM,);
if(sock_sd < ) {
printf ("socket error!");
return -;
}
memset(&s_addr,,sizeof(struct sockaddr_in));
memcpy(&s_addr.sin_addr,site_dns ->h_addr_list[],site_dns->h_length);
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(port);
printf("s_addr ip: %s",inet_ntoa(*((struct in_addr *)&s_addr.sin_addr)));
return (connect(sock_sd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr)) < ? - : sock_sd);
} static int gw_send(int sock_sd,char *fmt,...)
{
char buf [];
va_list argptr;
va_start(argptr,fmt);
vsprintf(buf,fmt,argptr);
va_end(argptr);
printf("Send:\n%s\n",buf);
return send(sock_sd,buf,strlen(buf),);
} void main(int argc,char **argv)
{
int sock_sd;
char rBuf[];
sock_sd = gw_connect("www.7fane.com",);
if(sock_sd < ) {
printf("connect error!\n");
return;
}
//注意:该网站只用于个人测试,在2013年11月末到期,
//如果你在之后的日期使用,请使用其它网页地址
gw_send(sock_sd,"GET http://www.7fane.com/test.html\n");
gw_send(sock_sd,"%c",);
while(read(sock_sd,rBuf,) > )
printf("%c",rBuf[]);
close(sock_sd);
return;
}
使用Code::blocks在windows下写网络程序的更多相关文章
- CentOS虚拟机如何设置共享文件夹,并在Windows下映射网络驱动器?
一.为什么要这么做? 最近在做Linux下的软件开发,但又想使用Windows下的编程工具“Source Insight”. 亲测有效. 要注意查看smb.conf.example,centos7的 ...
- [转]CentOS虚拟机如何设置共享文件夹,并在Windows下映射网络驱动器?
CentOS虚拟机如何设置共享文件夹,并在Windows下映射网络驱动器? 转自这里 一.为什么要这么做? 最近在做Linux下的软件开发,但又想使用Windows下的编程工具“Source Insi ...
- windows下写的脚本,在linux下执行失败
Windows中的换行符为CRLF, 即正则表达式的rn(ASCII码为13和10), 而Unix(或Linux)换行符为LF, 即正则表达式的n. 在Windows和Linux下协同工作的时候, 往 ...
- # 如何在Windows下运行Linux程序
如何在Windows下运行Linux程序 一.搭建 Linux 环境 1.1 安装 VMware Workstation https://www.aliyundrive.com/s/TvuMyFdTs ...
- Windows下,通过程序设置全屏抗锯齿(多重采样)的方法
这里说的全屏抗锯齿,不是基于着色器的FXAA之类的方式,而是兼容性更好的,基于固定管线的多重采样方式. 先来说一下开发环境,我用的是VC2013+GLEW1.11. 要通过程序设置多重采样,首先需要进 ...
- [MapReduce_add_1] Windows 下开发 MapReduce 程序部署到集群
0. 说明 Windows 下开发 MapReduce 程序部署到集群 1. 前提 在本地开发的时候保证 resource 中包含以下配置文件,从集群的配置文件中拷贝 在 resource 中新建 ...
- gcc和MinGW的异同(在cygwin/gcc做的东西可以无缝的用在linux下,没有任何问题,是在windows下开发linux程序的一个很好的选择)
cygwin/gcc和MinGW都是gcc在windows下的编译环境,但是它们有什么区别,在实际工作中如何选择这两种编译器. cygwin/gcc完全可以和在linux下的gcc化做等号,这个可以从 ...
- 【Code::Blocks】windows 环境下编译 Code::Blocks(已修正)
Code::Blocks 在2012-11-25发布了最新的12.11版本,相比上一个版本(10.05),Code::Blocks 进行了许多改进和更新(Change log). 引用 Wikiped ...
- 使用code::blocks编译windows的dll链接库
因为机子上没有安装Visual Studio,所以找到了一种通过code::blocks编译dll的方式,踩到的坑是code::blocks默认的compiler是32位的,这样编译出的dll也是32 ...
随机推荐
- php版本引起的const问题
刚刚遇到一个问题,类中定义了一个常量: const USER = ['aa', 'bb', 'cc']; 在类中的静态函数中调用以上常量不会出错.网站中所有的网页均能正常打开. 而当push到线上后, ...
- [技巧.Dotnet]轻松实现“强制.net程序以管理员身份运行”。
使用场景: 程序中不少操作都需要特殊权限,有时为了方便,直接让程序以管理员方式运行. (在商业软件中,其实应该尽量避免以管理员身份运行.在安装或配置时,提前授予将相应权限.) 做法: 以C#项目为例: ...
- yum源配置与使用
一.yum 简介 yum,是Yellow dog Updater, Modified 的简称,是杜克大学为了提高RPM 软件包安装性而开发的一种软件包管理器.起初是由yellow dog 这一发行版的 ...
- C++中虚继承派生类构造函数的正确写法
最近工作中某个软件功能出现了退化,追查下来发现是一个类的成员变量没有被正确的初始化.这个问题与C++存在虚继承的情况下派生类构造函数的写法有关.在此说明一下错误发生的原因,希望对更多的人有帮助. 我们 ...
- android shape使用总结
今天使用到shape,这个里面有很多属性,在这里我记录一下各个属性的使用的情况以及所代表的意思 <?xml version="1.0" encoding="utf- ...
- Linux中的输入重定向,变量
1 :分号 格式:命令1:命令2;命令3 说明:命令之间用分号隔开是顺序执行,命令之间没有任何逻辑关系 2 && 逻辑与 格式:命令1 && 命令2 说明:命令1正 ...
- [Note] FrameFab Interesting Cut Results
onelayer search really smart, good result in short time
- Xmanager远程Centos 7 Xfce
最近发现远程除了使用VNC还可以用Xmanager,孤陋寡闻了,通过这个远程软件,又把不怎么关注的Xwindow给了解了一遍. Xfce是一个自由软件,运行在类Unix操作系统 (如Linux.Fre ...
- Http协议的常见参数
Requests部分 Header 解释 示例 Accept 指定客户端能够接收的内容类型 Accept: text/plain, text/html Accept-Charset 浏览器可以接受的字 ...
- Java Struts2 POI创建Excel文件并实现文件下载
Java Struts2 POI创建Excel文件并实现文件下载2013-09-04 18:53 6059人阅读 评论(1) 收藏 举报 分类: Java EE(49) Struts(6) 版权声明: ...