黑客X档案官方论坛's Archiver

梦我心永恒 发表于 2008-4-24 12:59

这里有个C语言问题,大家帮帮忙!谢谢!

我刚学C没多久,下了一个C语言源代码,分析如下,大家看看有没有错!还有其中有些问题……
#include <stdafx.h>                这个头文件是干什么的?
#include <stdio.h>                   头文件
#include <string.h>                  这个头文件是干什么的?
#include <winsock.h>                 这个头文件是干什么的?
#pragma comment (lib,"ws2_32.lib")       这里是什么意思啊?
int main(int argc, char *argv[])                 定义main函数
{
int mysocket;                                       定义了一个整型变量mysocket
int pcount = 0;                                      定义了一个整型变量pcount ,并赋初值
struct sockaddr_in my_addr;                这里是什么意思?
WSADATA wsaData;
WORD wVersionRequested=MAKEWORD(1,1);
                                                                                         以上两句是什么意思?
if(argc < 3)                                                                       IF语句
{
printf("usage: %s <host> <maxport>\n", argv[0]);              汗,这里输出argv[0]?<host> <maxport>原样输出?
exit(1);                                                                             exit(1); 是什么东西?
}

if (WSAStartup(wVersionRequested , &wsaData))                 这里是个IF语句,但是没看懂,大家看看!
{
printf("Winsock Initialization failed.\n");
exit(1);
}

for(int i=1; i < atoi(argv[2]); i++)
{
if((mysocket = socket(AF_INET, SOCK_STREAM,0)) == INVALID_SOCKET){ s
printf("Socket Error");
exit(1);
}

my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(i);
my_addr.sin_addr.s_addr = inet_addr(argv[1]);                          这里是什么意思?

if(connect(mysocket, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == SOCKET_ERROR)
closesocket(mysocket);
else
{                                                          这里?
pcount++;
printf("Port %d - open\n", i);
#include <stdafx.h>
#include <stdio.h>
#include <string.h>                              怎么这里又是一些C头文件?
#include <winsock.h>
#pragma comment (lib,"ws2_32.lib")
int main(int argc, char *argv[]) {
int mysocket;
int pcount = 0;
struct sockaddr_in my_addr;
WSADATA wsaData;
WORD wVersionRequested=MAKEWORD(1,1);

if(argc < 3) {
printf("usage: %s <host> <maxport>\n", argv[0]);
exit(1);
}

if (WSAStartup(wVersionRequested , &wsaData)){
printf("Winsock Initialization failed.\n");
exit(1);
}

for(int i=1; i < atoi(argv[2]); i++){
if((mysocket = socket(AF_INET, SOCK_STREAM,0)) == INVALID_SOCKET){
printf("Socket Error");
exit(1);
}

my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(i);
my_addr.sin_addr.s_addr = inet_addr(argv[1]);

if(connect(mysocket, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == SOCKET_ERROR)
closesocket(mysocket);
else{
pcount++;
printf("Port %d - open\n", i);
}}

printf("%d ports open on host - %s\n", pcount, argv[1]);
closesocket(mysocket);
WSACleanup();
return 0;
}
}}

printf("%d ports open on host - %s\n", pcount, argv[1]);
closesocket(mysocket);
WSACleanup();
return 0;
}

flyli 发表于 2008-4-24 20:42

楼主需要系统的学习下了哦,你问的问题都太基本了,书本上基本全都有了
#include <stdafx.h>                这个头文件是干什么的?这个在vc中是必须包含的,一般是用来配置的
#include <stdio.h>                   头文件/这个你知道是什么意思吗?其实就是std通道的io函数库
剩下的头文件我不像说了,需要使用什么的函数库,就加载什么样的头文件~
比如你要使用printf你就需要加载stdio一样
加入你不加载#include <winsock.h>你又怎样进行套字节编程呢?即时是牛人我也没见过自己用汇编写套子节的了
其他的东西也没有必要一一解答了,你到百度上找,全是答案
给你个方向
有以下几方面你需要了解
1.主函数的参数传递
2.if语句中加入条件是个函数的话,函数返回0表示条件不成立,返回其他的表示条件成立
3.你这个是两个程序的代码,你竟然没有给他分开
4.你这个程序本身还是有些技术含量的,表现在使用了套子节,怎么说也是个网络编程嘛,不过你问的问题都是些基本的程序语法问题。。。
我对你的建议是,稳重一些,先把基础学好了在搞这些高档些的东东,不要被浮躁的社会所影响,另外学程序是需要买书的,比较重要的一点是,买书要买至少500页以上的,而且讲的知识点很少的,这样才能详细的学习。

hldidi 发表于 2008-4-26 21:28

以下很多是我个人的理解,不一定很准确,可以参考更多的资料!

#include <stdafx.h>               
hc--没有函数库,只是定义了一些环境参数,使得编译出来的程序能在32位的操作系统环境下运行。Standard Application Fram Extend

#include <stdio.h>                  
hc--标准输入输出函数的头  input&output

#include <string.h>                  
hc--处理字符串的

#include <winsock.h>                 我也不知道,很少用这个

#pragma comment (lib,"ws2_32.lib")      
hc--pragma是为了让编译器编译出的C或C++程序与机器硬件和操作系统保持完全兼容而定义的宏扩展,#pragma是和特定编译器相关的
                                
struct sockaddr_in my_addr;                hc--取my_addr的地址,再将其转换为指向struct sockaddr_in的指针

WSADATA wsaData;
WORD wVersionRequested=MAKEWORD(1,1);
WSADATA是一种数据结构,可以参考MSDN
typedef   struct   WSAData   {   
   
                  WORD                                         wVersion;   
                  WORD                                         wHighVersion;   
                  char                                         szDescription[WSADESCRIPTION_LEN+1];   
                  char                                         szSystemStatus[WSASYS_STATUS_LEN+1];   
                  unsigned   short                     iMaxSockets;   
                  unsigned   short                     iMaxUdpDg;   
                  char   FAR   *                             lpVendorInfo;   
  }   WSADATA,   FAR   *   LPWSADATA;   

if(argc < 3)                                                                    
{
printf("usage: %s <host> <maxport>\n", argv[0]);            
exit(1);                                                                             
}
argc 和 argv都是在main()里面出现的,实际上是表示输入变量和输出变量的个数。
exit:在main函数中我们通常使用return (0);这样的方式返回一个值。
但这是限定在非void情况下的也就是void main()这样的形式。
exit()通常是用在子程序中用来终结程序用的,使用后程序自动结束跳会操作系统。
但在如果把exit用在main内的时候无论main是否定义成void返回的值都是有效的,并且exit不需要考虑

hldidi 发表于 2008-4-26 21:34

剩下的问题lz自己找答案吧,不能什么都靠别人,有些问题是自己可以解决的,何必要来浪费别人的时间,况且自己自学可能更加的深刻,二楼把该说的都说了,以baidu为老师就行了。

梦我心永恒 发表于 2008-4-27 13:44

谢谢大家啊!我才开始学C,现在只学到指针这章,这是我从网上下载的!自己研究了下,大多看不懂,就发上来了!

梦我心永恒 发表于 2008-4-27 13:46

现在才发觉,我的基本C知识还没学好,不能操之过急!还需要进一步提高!谢谢上面的朋友!

花想容 发表于 2008-4-30 16:56

LZ的问题真多哦~!::08::                     exit(0)   是退出程序的函数.~~!!

ydzj 发表于 2008-5-2 19:44

天那,学C一年多了,也不知道这些东东
看来真得去好好补补课了

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.