|
![]() | 作者: NetDemon [netdemon]
![]() |
登录 |
刚刚在黑客技术版回复一个帖子,写了这个代码,就是在服务器上打开一个端口以等待连接,连接之后可以做什么,这你自己接着写下去,可以是任何一个和网络通信有关的程序,这里只是给出欢迎词 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 [kx3838438] ![]() |
登录 |
虽然不不全懂! 但说声! GOOD! |
B1层 发表时间: 02/24 16:25 |
![]() | 回复: cimsxiyang [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 [sorcerer] ![]() |
登录 |
夕阳很了不起,我很佩服你。可以认识一下吗? |
B3层 发表时间: 02/28 13:25 |
![]() | 回复: cimsxiyang [cimsxiyang] ![]() |
登录 |
一个爱好网络的菜鸟罢了, netdemon,晓澜等人才是很了不起的. |
B4层 发表时间: 02/28 13:48 |
![]() | 回复: cimsxiyang [cimsxiyang] ![]() |
登录 |
建议大家多看看老大的这个帖子,很具有代表性 |
B5层 发表时间: 04/11 00:07 |
![]() | 回复: icesky [icesky] ![]() |
登录 |
替换一下,把sockfd替换成sock_fd.( 可能是笔误) |
B6层 发表时间: 04/11 12:26 |
![]() | 回复: cimsxiyang [cimsxiyang] ![]() |
登录 |
icesky说的不错 确实如此 老大,你看那么多人想揪你的小辫子 哎!・##¥%……%……~ |
B7层 发表时间: 04/11 12:34 |
![]() | 回复: yxh428 [yxh428] ![]() |
登录 |
不错,很少看见老大们的帖子。 |
B8层 发表时间: 08/18 15:18 |
![]() | 回复: TomyChen [tomychen] ![]() |
登录 |
好像不能换任意数字吗... 至少1024以政下的:) |
B9层 发表时间: 08/18 16:26 |
![]() | 回复: cimsxiyang [cimsxiyang] ![]() |
登录 |
可以换 只要不要有冲突就可以了 |
B10层 发表时间: 08/18 17:20 |
![]() | 回复: mercybirth [mercybirth] ![]() |
登录 |
为什么要帖一些简单的socket程式呢。好象到处都有哦,还是帖点协议驱动,IM Driver这种更稀罕的东东吧:)―― |
B11层 发表时间: 08/18 19:10 |
![]() | 回复: ricky [ricky] ![]() |
登录 |
你的程序没有考虑两个很关键的问题: 1:大多数的机器不是一开机就上网的,对于后来拨号上网需要处理 2:对于多个ip的情况,必须在每个ip监听 哈哈,不过给菜鸟做个教材倒是不错 |
B12层 发表时间: 08/18 19:38 |
![]() | 回复: mercybirth [mercybirth] ![]() |
登录 |
其实做为简单的插口程序一般是不考虑这些问题。毕竟只是要示例一下如何写插口程序嘛 |
B13层 发表时间: 08/18 19:52 |
![]() | 回复: blindeaf [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 [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 [wolf520] ![]() |
登录 |
老大,你这个程序可以在windows环境下编译吗??? 关于UNIX网络编程的程序,怎么在windows环境编译??? 非常感谢!!! |
B25层 发表时间: 05/14 21:48 |
![]() | 回复: luo2003 [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 [xiaoshi] ![]() |
登录 |
以上两个程序我在tc下调试,有很多的错误,有的是.h文件没有,有的是结构体处的错误,不知是什么问题,是不是其他的问题 请告之。 |
B29层 发表时间: 07/15 21:36 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号