高效网站推广公司/个人博客seo
前日看到听风大哥的帖子<初学黑客编程(1)>,写的是windows下的C/S程序的简易示例代码,顿时有了感觉。以前在linux下写过,但是不知道如何去实际应用,便放在了一边。昨晚认真的拜读、改写了一下。今日记录下来,作为保留。
代码如下:
服务端:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | /*Service*/ #include <winsock2.h> //初始化网络编程函数 #include <stdio.h> #pragma comment(lib,"ws2_32") //静态函数库的初始化 #define PORT 139 //这个是用端口扫描器扫描的结果中任选的一个 int main( int argc, char *argv[]) { system ( "cls" ); //清屏 //定义一个数据类型是DSADATA的wsaData的变量 //wsaData结构被用来保存AfxSocketlnit函数返回的Windows Sockets初始化信息 WSADATA wsaData; WORD sockVersion = MAKEWORD(2,2); //加载winsock库,初始化系统环境,以便以后关于网络的函数调用 if (WSAStartup(sockVersion,&wsaData)!=0) { return -1; } //创建一个套接字,也就是我们的监听的端口 SOCKET sListen = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP); //判断创建是否成功,失败返回INVALID_SOCKET if (sListen == INVALID_SOCKET) { printf ( "socket error !\n" ); return -1; } //在sockaddr_in结构中装入地址信息 sockaddr_in sin ; sin .sin_family = PF_INET; sin .sin_port = htons(PORT); //htons:将主机无符号短整型数转换成网络字节顺序 sin .sin_addr.S_un.S_addr = INADDR_ANY; //套接字和本地地址绑定 if (bind(sListen,(LPSOCKADDR)& sin , sizeof ( sin ))==SOCKET_ERROR) { printf ( "bind error !\n" ); closesocket(sListen); return -1; } //设置套接字进入监听模式 if (listen(sListen,1)==SOCKET_ERROR) { printf ( "listen error !\n" ); closesocket(sListen); return -1; } //接受客户端的连接请求 sockaddr_in remoteAddr; SOCKET sClient; int nAddrlen = sizeof (remoteAddr); char revData[255]; printf ( "等待连接..." ); //接受一个新连接 sClient = accept(sListen,(SOCKADDR *)&remoteAddr,&nAddrlen); if (sClient == INVALID_SOCKET) { printf ( "accept error !\n" ); closesocket(sListen); return -1; } //打印出连接者的ip printf ( "\n接收到一个连接:%s\r\n" ,inet_ntoa(remoteAddr.sin_addr)); int flag = 1; while (flag) { //直到连接到有效数据才打印出来 int ret = recv(sClient,revData, sizeof (revData),0); if (ret > 0) { // 为防止打印出错,把字符串结尾设为0x00 revData[ret] = 0x00; printf ( "Client : " ); printf ( "%s\n" ,revData); } if ( strcmp (revData, "quit\0" )==0) { closesocket(sClient); closesocket(sListen); WSACleanup(); exit (0); } memset (revData,0, sizeof (revData)); //清空缓冲区 char sendData[255]; printf ( "Service :" ); scanf ( "%s" ,sendData); //发送数据 send(sClient,sendData, sizeof (sendData),0); if ( strcmp (sendData, "quit\0" )==0) { closesocket(sClient); closesocket(sListen); WSACleanup(); exit (0); } memset (sendData,0, sizeof (sendData)); //清空缓冲区 } closesocket(sListen); WSACleanup(); return 0; } /* 调试提示:开始-->运行-->输入"cmd"-->找到生成的xxx.exe程序所在路径-->输入:xxx 就可以了 */ |
客户端:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | /*Client*/ #include <winsock2.h> #include <stdio.h> #pragma comment(lib,"ws2_32") #define PORT 139 //端口扫描结果任意选的一个,也可以自定义式用argv[2]参数,然后用bind()函数进行绑定 int main( int argc, char *argv[]) { system ( "cls" ); //清屏 WSADATA wsaData; WORD sockVersion = MAKEWORD(2,2); //加载winsock库 if (WSAStartup(sockVersion,&wsaData)!=0) { return -1; } //创建套接字 SOCKET sClient = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if (sClient == INVALID_SOCKET) { printf ( "socket error !\n" ); return -1; } //在sockaddr_in中装入服务器端的地址信息 sockaddr_in servAddr; servAddr.sin_family = AF_INET; servAddr.sin_port = htons(PORT); servAddr.sin_addr.S_un.S_addr = inet_addr(argv[1]); //连接到服务器端 if (connect(sClient,(sockaddr *)&servAddr, sizeof (servAddr))==SOCKET_ERROR) { printf ( "connect error !\n" ); closesocket(sClient); return -1; } printf ( "已连接到 : %s\n" ,argv[1]); int flag = 1; while (flag) { char sendData[255]; printf ( "Client : " ); scanf ( "%s" ,sendData); send(sClient,sendData, sizeof (sendData),0); if ( strcmp (sendData, "quit\0" )==0) { closesocket(sClient); WSACleanup(); exit (0); } memset (sendData,0, sizeof (sendData)); //清空缓冲区 char revData[255]; //直到接收到有效数据才打印出来 int ret = recv(sClient,revData, sizeof (revData),0); if ( strcmp (revData, "quit\0" )==0) { closesocket(sClient); WSACleanup(); exit (0); } if (ret > 0) { //为防止打印出错,字符串末尾加上0x00 revData[ret] = 0x00; printf ( "Service : %s\n" ,revData); } memset (revData,0, sizeof (revData)); //清空缓冲区 } closesocket(sClient); WSACleanup(); return 0; } /* 调试提示:开始-->运行-->输入"cmd"-->找到生成的xxx.exe程序所在路径-->输入:xxx 目标IP 就可以了 <需要:服务端先开启,客户端再连接> */ |
<编译环境:VC++ 6.0>
客户端进行连接时,自己只实现了在一台电脑开两个端口进行对话,两台电脑之间试了几次未成功,实在不知道如何做。
不满足于上面代码的简易,打算继续用进程进行改写一下,使之能够更人性化一些,结果发现windows下的进程创建并不是fork()函数那么简单,而是CreatProcess()函数,不知所云,没学过windows编程,只能暂时搁浅了。windows进程编程技术啊,一定得学会。不然以后能有啥发展前途。
路漫漫其修远兮...吾将上下而求索。
PS:初学黑客编程(1)帖子链接:
http://bbs.51cto.com/thread-1048530-1.html
享受阳光,享受生活。愿与大家共同进步。
本文转自 006玩命 51CTO博客,原文链接:http://blog.51cto.com/weiyuqingcheng/1377203,如需转载请自行联系原作者