论坛: 编程破解 标题: 在主机上开一个端口的代码例子 复制本贴地址    
作者: NetDemon [netdemon]    ADMIN   登录
刚刚在黑客技术版回复一个帖子,写了这个代码,就是在服务器上打开一个端口以等待连接,连接之后可以做什么,这你自己接着写下去,可以是任何一个和网络通信有关的程序,这里只是给出欢迎词 Hello World ,然后什么都不做

#define MYPORT 4000
/* 这个MYPORT 4000定义了端口为4000 ,换什么数字就是什么端口 */
#define BACKLOG 10
main()
{
int sock_fd , new_fd;
struct sockaddr_in my_addr;
struct sockaddr_in their_addr;
int sin_size;
if ((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socketerror");
exit(1);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(MYPORT);
my_addr.sin_addr.s_addr=INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if(bind(sockfd,(struct sockaddr*)&my_addr.sizeof((struct sockaddr)==-1)
{
perror("binderror");
exit(1);
}
if(listen(sockfd,BACKLOG)==-1)
{
perror("listen error");
exit(1);
}
while(1)
{
sin_size=sizeof(struct sockaddr_in);
if ((new_fd=accept(sockfd,(struct sockaddr*)&their_addr,&sin_size))==-1)
{
perror("accepterror");
continue;
}
printf("Server:got connection from %s\n",inet_ntoa(their_addr,sin_addr));
if(!fock())
{
if(send(new_fd,"hello,World! \n" 14,0)==-1)
{
perror("senderror");
}
close(new_fd);
exit(0);
}
close(new_fd);
}
}
while(waitpid(-1 ,NULL ,WNOHANG) > 0 );



地主 发表时间: 02/21 04:05

回复: 风之速 [kx3838438]   论坛用户   登录
虽然不不全懂!
但说声!  GOOD!

B1层 发表时间: 02/24 16:25

回复: 夕阳 [cimsxiyang]   版主   登录
我很佩服netdemon的技术,对你的帖子,我大概解释一下,不知道对不对,还请你多多指教.BEGIN:
#include <socket.h>
#include <netinet/in.h>
................(还有许多,为了增加可读性,netdemon省略了)

#define MYPORT 4000
/* 这个MYPORT 4000定义了端口为4000 ,换什么数字就是什么端口 */
#define BACKLOG 10
main()
{
int sock_fd , new_fd;
struct sockaddr_in my_addr;
struct sockaddr_in their_addr;
int sin_size;
/*以上为初始的一些定义*/
if ((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socketerror");
exit(1);
}
/*指定ipv4,字节流插口,socket()是个插口函数,sockfd就是socket的描述符,其他的api函数需要调用这个描述符来标识socket.如果该函数调用失败,那么返回-1,错误代码保存在errno中.在上面的语句中将会回显socketerror*/
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(MYPORT);
my_addr.sin_addr.s_addr=INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
/*指定ipv4,将端口号转换成网络字节顺序,指定通配地址,INADDR_ANY可以不用转换,因为INADDR_ANY的值等于0,sin_zero用来将sockaddr_in结构填充到与struct sockaddr相同的长度,bzero()函数将其置为0*/
if(bind(sockfd,(struct sockaddr*)&my_addr.sizeof((struct sockaddr)==-1)
{
perror("binderror");
exit(1);
}
/*sockfd,插口描述符,是socket()函数的成功返回值,这里面可能有点笔误,修改如下:
if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof((struct sockaddr))==-1))
{
perror("binderror");
exit(1);
}
第二个参数是指向与协议有关的地址结构的指针,第三个参数是地址长度*/

if(listen(sockfd,BACKLOG)==-1)
{
perror("listen error");
exit(1);
}
/*BACKLOG规定了内核为该socket排队的最大连接数.
给定的listen端口,内核要维护二个队列,1.未完成连接队列和已完成连接队列,已完成连接队列中存放那些已完成三次握手的连接,socket处于ESTABLLISHED状态,其他的connection均放在未完成连接队列.而BACKLOG是这二个队列的总和*/

while(1)
{
sin_size=sizeof(struct sockaddr_in);/*地址结构长度值*/
if ((new_fd=accept(sockfd,(struct sockaddr*)&their_addr,&sin_size))==-1)
/*,(struct sockaddr*)&their_addr,&sin_size分别用来返回对方进程的协议地址和地址长度*/
{
perror("accepterror");
continue;
}
printf("Server:got connection from %s\n",inet_ntoa(their_addr,sin_addr));/打印对方地址,这里也有一个笔误,正确的是:printf("Server:got connection from %s\n",inet_ntoa(their_addr.sin_addr));*/

if(!fock())
{
if(send(new_fd,"hello,World! \n" 14,0)==-1{
perror("senderror");
}
close(new_fd);
exit(0);
}
close(new_fd);
}
}
while(waitpid(-1 ,NULL ,WNOHANG) > 0 );

/*fork()会生成一个子进程来处理数据传输部分,其语句对于子进程返回的值为0。send函数的第四个参数是用来控制接受数据的方式.必须要close父进程和子进程所有的描述符,waitpid()等待子进程,而本身不受挡,值得一提的是第三个参数必须为WNOHANG,至于什么原因,还是请netdemon自己说吧,我现在的脑子很乱,当然,水平也非常有限*/
还请大家不吝指教!

end






[此贴被 夕阳(cimsxiyang) 在 2月26日23时51分 编辑过]

B2层 发表时间: 2/26 23:33

回复: 傲速 [sorcerer]   论坛用户   登录
夕阳很了不起,我很佩服你。可以认识一下吗?

B3层 发表时间: 02/28 13:25

回复: 夕阳 [cimsxiyang]   版主   登录
一个爱好网络的菜鸟罢了,
netdemon,晓澜等人才是很了不起的.

B4层 发表时间: 02/28 13:48

回复: 夕阳 [cimsxiyang]   版主   登录
建议大家多看看老大的这个帖子,很具有代表性

B5层 发表时间: 04/11 00:07

回复: icesky [icesky]   论坛用户   登录
 替换一下,把sockfd替换成sock_fd.( 可能是笔误)

B6层 发表时间: 04/11 12:26

回复: 夕阳 [cimsxiyang]   版主   登录
icesky说的不错
确实如此
老大,你看那么多人想揪你的小辫子
哎!·##¥%……%……~

B7层 发表时间: 04/11 12:34

回复: 玩玩而已 [yxh428]   论坛用户   登录
不错,很少看见老大们的帖子。

B8层 发表时间: 08/18 15:18

回复: TomyChen [tomychen]   论坛用户   登录
好像不能换任意数字吗...
至少1024以政下的:)

B9层 发表时间: 08/18 16:26

回复: 夕阳 [cimsxiyang]   版主   登录
可以换
只要不要有冲突就可以了


B10层 发表时间: 08/18 17:20

回复: mercybirth [mercybirth]   论坛用户   登录
为什么要帖一些简单的socket程式呢。好象到处都有哦,还是帖点协议驱动,IM Driver这种更稀罕的东东吧:)——

B11层 发表时间: 08/18 19:10

回复: 老实和尚 [ricky]   版主   登录
你的程序没有考虑两个很关键的问题:
1:大多数的机器不是一开机就上网的,对于后来拨号上网需要处理
2:对于多个ip的情况,必须在每个ip监听
哈哈,不过给菜鸟做个教材倒是不错

B12层 发表时间: 08/18 19:38

回复: mercybirth [mercybirth]   论坛用户   登录
其实做为简单的插口程序一般是不考虑这些问题。毕竟只是要示例一下如何写插口程序嘛

B13层 发表时间: 08/18 19:52

回复: 海鬼 [blindeaf]   论坛用户   登录
我刚学C,这对我的帮助太大了.多谢.

B14层 发表时间: 08/21 11:05

回复: BlueSnoopy [bluesnoopy]   论坛用户   登录
厉害的人越来越多了 !

B15层 发表时间: 08/25 12:49

回复: 54183710 [hcz]   论坛用户   登录
老大,ztmd牛

B16层 发表时间: 01/26 06:34

回复: 54183710 [hcz]   论坛用户   登录
老大,ztmd牛

B17层 发表时间: 01/26 06:34

回复: sunrain [sunrain]   论坛用户   登录
我刚学C,还看不懂!1

B18层 发表时间: 01/26 19:23

回复: shuaishuai [near]   论坛用户   登录
以后这样的东西一定要多给我帖一点呀!

特别是那些小而经典的程序一定要多弄点给我们看看呀!

B19层 发表时间: 02/11 09:49

回复: wjhwjh5 [wjhwjh5]   论坛用户   登录
 上面这个程序中使用的
socket()函数是有关windows socket编程的知识?还是 windows API 函数?

B20层 发表时间: 02/22 01:13

回复: cyh811122 [cyh811122]   论坛用户   登录
请问这是用C++写的吗?

B21层 发表时间: 02/22 19:21

回复: 仙屐奇缘 [coolcall]   论坛用户   登录
可以用TC写WINSOCK吗?

B22层 发表时间: 03/29 20:22

回复: liye9801 [liye9801]   论坛用户   登录
老大就是老大嘛!!



B23层 发表时间: 03/30 00:54

回复: abc0101 [abc0101]   论坛用户   登录
夕阳老大啊,好啊,下面是一个端口扫描器的源程序,一个典型的TCP connect()扫描,但小弟我还是有些地方看不动,希望老大解释一下!!!
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#include <netdb.h>
#include <signal.h>
int main(int argc, char **argv)
{
int probeport = 0;
struct hostent *host;
int err, i, net;
struct sockaddr_in sa;
startport=1;
endport=20000;
if(argc==3)
{
       startport=endport=atoi(argv[2]);
    }
if (argc==4)
    {
      startport=atoi(argv[2]);
      endport=atoi(argv[3]);
     }
for (i=startport;i<endport+1;i++)
    { 
     starncpy((char *&sa)," ",sizeof sa);
sa.sin_family=AF_INET;
if (isdigit(*argv[1]))
   sa.sin_addr.s_addr=inet_addr(argv[1]);
   else if ((host=gethostbyname(argv[1]))!=0)
         strncpy((char *)&sa.sin_addr, (char *)host->h_addr,sizeof sa.sin_addr);
  else {
  /*pherror(argv[1]);*/
printf("Error\n");
  exit(2);
}
sa.sin_port=host(i);
 net=socket(AF_INET,SOCK_STREAM,0);
 if (net<0)
{
  perror("\n socket");
  exit(2);
}
err=connect(net,(struct sockaddr *) &sa,sizeof sa );
if (err<0)
   {
  printf("%s%-5d%s\r",argv[1],I,strerror(errno));
  printf("\r");
  fflush(stdout);
  if (argc==3)
printf("%s%-5d refused.\n",argv[1],i);
}
  else 
{
printf("%s%-5d accepted.\n",argv[1],i);
if (shutdown(net ,2)
    {
       perror("\n shutdown");
       exit(2);
     }
  }
close(net);
}
printf("\r");
fflush(stdout);
return(0);
}


B24层 发表时间: 05/14 16:54

回复: 海格拉斯 [wolf520]   论坛用户   登录
老大,你这个程序可以在windows环境下编译吗???
关于UNIX网络编程的程序,怎么在windows环境编译???
非常感谢!!!



B25层 发表时间: 05/14 21:48

回复: 浪子 [luo2003]   论坛用户   登录
inaddr_any就是填入本机ip

B26层 发表时间: 07/05 01:56

回复: tetley [tetley]   论坛用户   登录
我也想问一下这个程序在WINDOWS底下怎么编? 

B27层 发表时间: 07/05 05:48

回复: leonshoh [leonshoh]   论坛用户   登录
为什么写的总是单线程???
怎么不用信号灯……来同步线程!

B28层 发表时间: 07/13 18:29

回复: 零下一度 [xiaoshi]   论坛用户   登录
以上两个程序我在tc下调试,有很多的错误,有的是.h文件没有,有的是结构体处的错误,不知是什么问题,是不是其他的问题 请告之。

B29层 发表时间: 07/15 21:36

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号