??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品亚发布,日本私人网站在线观看,亚洲人成人一区二区三区http://www.aygfsteel.com/smildlzj/category/27386.htmlLuLuzh-cnSat, 24 Nov 2007 01:25:35 GMTSat, 24 Nov 2007 01:25:35 GMT60详谈调用winpcap驱动写arp多功能工?/title><link>http://www.aygfsteel.com/smildlzj/articles/162010.html</link><dc:creator>smildlzj</dc:creator><author>smildlzj</author><pubDate>Wed, 21 Nov 2007 01:59:00 GMT</pubDate><guid>http://www.aygfsteel.com/smildlzj/articles/162010.html</guid><wfw:comment>http://www.aygfsteel.com/smildlzj/comments/162010.html</wfw:comment><comments>http://www.aygfsteel.com/smildlzj/articles/162010.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/smildlzj/comments/commentRss/162010.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/smildlzj/services/trackbacks/162010.html</trackback:ping><description><![CDATA[     摘要: 创徏旉Q?002-09-14 文章属性:原创 文章来源Q中华安全网 文章提交QTOo2y (too2y_at_safechina.net) 详谈调用winpcap驱动写arp多功能工? Author: TOo2y[原创] E-mail: TOo2y@safechina.net Homepage: www.safechina.net Date: 11-9-2002 一...  <a href='http://www.aygfsteel.com/smildlzj/articles/162010.html'>阅读全文</a><img src ="http://www.aygfsteel.com/smildlzj/aggbug/162010.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/smildlzj/" target="_blank">smildlzj</a> 2007-11-21 09:59 <a href="http://www.aygfsteel.com/smildlzj/articles/162010.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C语言函数集合http://www.aygfsteel.com/smildlzj/articles/161187.htmlsmildlzjsmildlzjSat, 17 Nov 2007 03:24:00 GMThttp://www.aygfsteel.com/smildlzj/articles/161187.htmlhttp://www.aygfsteel.com/smildlzj/comments/161187.htmlhttp://www.aygfsteel.com/smildlzj/articles/161187.html#Feedback0http://www.aygfsteel.com/smildlzj/comments/commentRss/161187.htmlhttp://www.aygfsteel.com/smildlzj/services/trackbacks/161187.html转换子程?函数库ؓmath.h、stdlib.h、ctype.h、float.h
char     *ecvt(double value,int ndigit,int *decpt,int *sign)
           QҎ(gu)value转换成字W串q返回该字符?br /> char     *fcvt(double value,int ndigit,int *decpt,int *sign)
           QҎ(gu)value转换成字W串q返回该字符?br /> char     *gcvt(double value,int ndigit,char *buf)
           数value转换成字W串q存于buf?q返回buf的指?br /> char    *ultoa(unsigned long value,char *string,int radix)
           无W号整型数value转换成字W串q返回该字符?radix{换时所用基?br /> char     *ltoa(long value,char *string,int radix)
           长整型数value转换成字W串q返回该字符?radix{换时所用基?br /> char     *itoa(int value,char *string,int radix)
           整数value转换成字W串存入string,radix{换时所用基?br /> double atof(char *nptr) 字W串nptr转换成双_ֺ?q返回这个数,错误q回0
int      atoi(char *nptr) 字W串nptr转换成整型数,    q返回这个数,错误q回0
long     atol(char *nptr) 字W串nptr转换成长整型?q返回这个数,错误q回0
double strtod(char *str,char **endptr)字W串str转换成双_ֺ?q返回这个数,
long     strtol(char *str,char **endptr,int base)字W串str转换成长整型?
                                                 q返回这个数,
int      toascii(int c)     q回c相应的ASCII
int      tolower(int ch)    若ch是大写字?'A'-'Z')q回相应的小写字?'a'-'z')
int     _tolower(int ch)    q回ch相应的小写字?'a'-'z')
int      toupper(int ch)    若ch是小写字?'a'-'z')q回相应的大写字?'A'-'Z')
int     _toupper(int ch)    q回ch相应的大写字?'A'-'Z')

诊断函数,所在函数库为assert.h、math.h
void     assert(int test) 一个扩展成if语句那样的宏Q如果test试p|Q?br />           显CZ个信息ƈ异常l止E序,无返回?br /> void     perror(char *string) 本函数将昄最q一ơ的错误信息Q格式如下:
          字符串string:错误信息
char     *strerror(char *str) 本函数返回最q一ơ的错误信息,格式如下:
          字符串str:错误信息
int      matherr(struct exception *e)
          用户修改数学错误q回信息函数(没有必要使用)
double _matherr(_mexcep why,char *fun,double *arg1p,
                  double *arg2p,double retval)
          用户修改数学错误q回信息函数(没有必要使用)

输入输出子程?函数库ؓio.h、conio.h、stat.h、dos.h、stdio.h、signal.h
int     kbhit()      本函数返回最q所敲的按键
int     fgetchar() 从控制台(键盘)M个字W,昄在屏q上
int     getch()      从控制台(键盘)M个字W,不显C在屏幕?br /> int     putch()      向控制台(键盘)写一个字W?br /> int     getchar()    从控制台(键盘)M个字W,昄在屏q上
int     putchar()    向控制台(键盘)写一个字W?br /> int     getche()     从控制台(键盘)M个字W,昄在屏q上
int     ungetch(int c) 把字Wc退回给控制?键盘)
char *cgets(char *string) 从控制台(键盘)d字符串存于string?br /> int     scanf(char *format[,argument…])从控制台d一个字W串,分别对各个参数进?br />          赋?使用BIOSq行输出
int     vscanf(char *format,Valist param)从控制台d一个字W串,分别对各个参数进?br />          赋?使用BIOSq行输出,参数从Valist param中取?br /> int     cscanf(char *format[,argument…])从控制台d一个字W串,分别对各个参数进?br />          赋?直接Ҏ(gu)制台作操?比如昄器在昄时字W时即ؓ直接写频方式昄
int     sscanf(char *string,char *format[,argument,…])通过字符串string,分别对各?br />          参数q行赋?br /> int     vsscanf(char *string,char *format,Vlist param)通过字符串string,分别对各?br />          参数q行赋?参数从Vlist param中取?br /> int     puts(char *string)    发关一个字W串stringl控制台(昄?,
         使用BIOSq行输出
void    cputs(char *string) 发送一个字W串stringl控制台(昄?,
         直接Ҏ(gu)制台作操?比如昄器即为直接写频方式显C?br /> int     printf(char *format[,argument,…]) 发送格式化字符串输出给控制?昄?
         使用BIOSq行输出
int     vprintf(char *format,Valist param) 发送格式化字符串输出给控制?昄?
         使用BIOSq行输出,参数从Valist param中取?br /> int     cprintf(char *format[,argument,…]) 发送格式化字符串输出给控制?昄?,
         直接Ҏ(gu)制台作操?比如昄器即为直接写频方式显C?br /> int     vcprintf(char *format,Valist param)发送格式化字符串输出给控制?昄?,
         直接Ҏ(gu)制台作操?比如昄器即为直接写频方式显C?
         参数从Valist param中取?br /> int     sprintf(char *string,char *format[,argument,…])
          字W串string的内定w新写为格式化后的字符?br /> int     vsprintf(char *string,char *format,Valist param)
          字W串string的内定w新写为格式化后的字符?参数从Valist param中取?br /> int     rename(char *oldname,char *newname)文件oldname的名U改为newname
int     ioctl(int handle,int cmd[,int *argdx,int argcx])
          本函数是用来控制输入/输出讑֤的,误下表Q?br />           ┌───┬────────────────────────────?br />           │cmd?│功?nbsp;                                                     ?br />           ├───┼────────────────────────────?br />           ?nbsp;   0     │取备信?nbsp;                                             ?br />           ?nbsp;   1     │设|设备信?nbsp;                                             ?br />           ?nbsp;   2     │把argcx字节d由argdx所指的地址                          ?br />           ?nbsp;   3     │在argdx所指的地址写argcx字节                              ?br />           ?nbsp;   4     │除把handle当作讑֤?0=当前,1=A,{?之外,均和cmd=2时一??br />           ?nbsp;   5     │除把handle当作讑֤?0=当前,1=A,{?之外,均和cmd=3时一??br />           ?nbsp;   6     │取输入状?nbsp;                                               ?br />           ?nbsp;   7     │取输出状?nbsp;                                               ?br />           ?nbsp;   8     │测试可换?只对于DOS 3.x                                  ?br />           ?nbsp;   11    │置分n冲突的重计?只对DOS 3.x                          ?br />           └───┴────────────────────────────?br /> int     (*ssignal(int sig,int(*action)())()执行软g信号(没必要?
int     gsignal(int sig)                     执行软g信号(没必要?

int     _open(char *pathname,int access)或写打开一个文?
          按后按access来确定是L件还是写文g,accessD下表
          ┌──────┬────────────────────?br />           │access?nbsp;     │意?nbsp;                                     ?br />           ├──────┼────────────────────?br />           │O_RDONLY      │读文g                                    ?br />           │O_WRONLY      │写文g                                    ?br />           │O_RDWR        │即M?nbsp;                                 ?br />           │O_NOINHERIT │若文g没有传递给子程?则被包含           ?br />           │O_DENYALL     │只允许当前处理必须存取的文?nbsp;             ?br />           │O_DENYWRITE │只允许从Q何其它打开的文件读              ?br />           │O_DENYREAD    │只允许从Q何其它打开的文件写              ?br />           │O_DENYNONE    │允许其它共享打开的文?nbsp;                   ?br />           └──────┴────────────────────?br /> int     open(char *pathname,int access[,int permiss])或写打开一个文?
          按后按access来确定是L件还是写文g,accessD下表
          ┌────┬────────────────────?br />           │access值│意义                                      ?br />           ├────┼────────────────────?br />           │O_RDONLY│读文g                                    ?br />           │O_WRONLY│写文g                                    ?br />           │O_RDWR    │即M?nbsp;                                 ?br />           │O_NDELAY│没有?对UNIXpȝ兼容                   ?br />           │O_APPEND│即M?但每ơ写L在文件尾d         ?br />           │O_CREAT │若文g存在,此标志无?若不存在,建新文g ?br />           │O_TRUNC │若文g存在,则长度被截ؓ0,属性不?nbsp;        ?br />           │O_EXCL    │未?对UNIXpȝ兼容                       ?br />           │O_BINARY│此标志可显C地l出以二q制方式打开文g    ?br />           │O_TEXT    │此标志可用于显C地l出以文本方式打开文g?br />           └────┴────────────────────?br />           permiss为文件属?可ؓ以下?
           S_IWRITE允许?nbsp;   S_IREAD允许?nbsp;   S_IREAD|S_IWRITE允许诅R写
int     creat(char *filename,int permiss)    建立一个新文gfilenameQƈ讑֮
         d性。permiss为文件读写性,可以Z下?br />           S_IWRITE允许?nbsp;   S_IREAD允许?nbsp;   S_IREAD|S_IWRITE允许诅R写
int    _creat(char *filename,int attrib)    建立一个新文gfilenameQƈ讑֮文g
        属性。attrib为文件属性,可以Z下?br />           FA_RDONLY只读    FA_HIDDEN隐藏    FA_SYSTEMpȝ
int     creatnew(char *filenamt,int attrib) 建立一个新文gfilenameQƈ讑֮文g
         属性。attrib为文件属性,可以Z下?br />            FA_RDONLY只读    FA_HIDDEN隐藏    FA_SYSTEMpȝ
int     creattemp(char *filenamt,int attrib) 建立一个新文gfilenameQƈ讑֮文g
         属性。attrib为文件属性,可以Z下?br />            FA_RDONLY只读    FA_HIDDEN隐藏    FA_SYSTEMpȝ
int     read(int handle,void *buf,int nbyte)从文件号为handle的文件中读nbyte个字W?br />          存入buf?br /> int    _read(int handle,void *buf,int nbyte)从文件号为handle的文件中读nbyte个字W?br />          存入buf?直接调用MSDOSq行操作.
int     write(int handle,void *buf,int nbyte)buf中的nbyte个字W写入文件号
         为handle的文件中
int    _write(int handle,void *buf,int nbyte)buf中的nbyte个字W写入文件号
         为handle的文件中
int     dup(int handle) 复制一个文件处理指针handle,q回q个指针
int     dup2(int handle,int newhandle) 复制一个文件处理指针handle到newhandle
int     eof(int *handle)查文件是否结?l束q回1,否则q回0
long    filelength(int handle) q回文g长度Qhandle为文件号
int     setmode(int handle,unsigned mode)本函数用来设定文件号为handle的文件的?br />          开方式
int     getftime(int handle,struct ftime *ftime) d文g号ؓhandle的文件的旉Q?br />           q将文g旉存于ftimel构中,成功q回0,ftimel构如下Q?br />           ┌─────────────────?br />           │struct ftime                        ?br />           │{                                   ?br />           ?unsigned ft_tsec:5; /*U?/         ?br />           ?unsigned ft_min:6;    /*?/         ?br />           ?unsigned ft_hour:5; /*?/         ?br />           ?unsigned ft_day:5;    /*?/         ?br />           ?unsigned ft_month:4;/*?/         ?br />           ?unsigned ft_year:1; /*q?1980*/    ?br />           │}                                   ?br />           └─────────────────?br /> int     setftime(int handle,struct ftime *ftime) 重写文g号ؓhandle的文件时?
         新时间在l构ftime?成功q回0.l构ftime如下:
          ┌─────────────────?br />           │struct ftime                        ?br />           │{                                   ?br />           ?unsigned ft_tsec:5; /*U?/         ?br />           ?unsigned ft_min:6;    /*?/         ?br />           ?unsigned ft_hour:5; /*?/         ?br />           ?unsigned ft_day:5;    /*?/         ?br />           ?unsigned ft_month:4;/*?/         ?br />           ?unsigned ft_year:1; /*q?1980*/    ?br />           │}                                   ?br />           └─────────────────?br /> long    lseek(int handle,long offset,int fromwhere) 本函数将文g号ؓhandle的文?br />           的指针移到fromwhere后的Woffset个字节处.
           SEEK_SET 文g开?nbsp;    SEEK_CUR 当前位置     SEEK_END 文g?br /> long    tell(int handle) 本函数返回文件号为handle的文件指?以字节表C?br /> int     isatty(int handle)本函数用来取讑֤handle的类?br /> int     lock(int handle,long offset,long length)     Ҏ(gu)件共享作锁
int     unlock(int handle,long offset,long length) 打开Ҏ(gu)件共享的锁
int     close(int handle) 关闭h(hun)andle所表示的文件处?handle是从_creat、creat?br />           creatnew、creattemp、dup、dup2、_open、open中的一个处调用获得的文件处?br />           成功q回0否则q回-1,可用于UNIXpȝ
int    _close(int handle) 关闭h(hun)andle所表示的文件处?handle是从_creat、creat?br />          creatnew、creattemp、dup、dup2、_open、open中的一个处调用获得的文件处?br />          成功q回0否则q回-1,只能用于MSDOSpȝ

FILE *fopen(char *filename,char *type) 打开一个文件filename,打开方式为typeQ?br />           q返回这个文件指针,type可ؓ以下字符串加上后~
        ┌──┬────┬───────┬────────?br />         │type│读写?nbsp;   │文?2q制文g│徏?打开旧文??br />         ├──┼────┼───────┼────────?br />         │r     │读        │文?nbsp;           │打开旧的文g      ?br />         │w     │写        │文?nbsp;           │徏新文?nbsp;         ?br />         │a     │添?nbsp;     │文?nbsp;           │有打开无则建新?br />         │r+    │读/?nbsp;    │不限制          │打开              ?br />         │w+    │读/?nbsp;    │不限制          │徏新文?nbsp;         ?br />         │a+    │读/d │不限制          │有打开无则建新?br />         └──┴────┴───────┴────────?br />         可加的后~为t、b。加b表示文g以二q制形式q行操作Qt没必要?br />         ? ┌──────────────────?br />             ?include<stdio.h>                     ?br />             │main()                                ?br />             │{                                     ?br />             ?FILE *fp;                            ?br />             ?fp=fopen("C:\\WPS\\WPS.EXE","r+b");?br />             └──────────────────?br /> FILE *fdopen(int ahndle,char *type)
FILE *freopen(char *filename,char *type,FILE *stream)
int     getc(FILE *stream)    从流stream中读一个字W,q返回这个字W?br /> int     putc(int ch,FILE *stream)向流stream写入一个字Wch
int     getw(FILE *stream) 从流streamd一个整敎ͼ错误q回EOF
int     putw(int w,FILE *stream)向流stream写入一个整?br /> int     ungetc(char c,FILE *stream) 把字Wc退回给streamQ下一ơ读q的字符是c
int     fgetc(FILE *stream) 从流stream处读一个字W,q返回这个字W?br /> int     fputc(int ch,FILE *stream) 字Wch写入stream?br /> char *fgets(char *string,int n,FILE *stream) 从流stream中读n个字W存入string?br /> int     fputs(char *string,FILE *stream) 字W串string写入stream?br /> int     fread(void *ptr,int size,int nitems,FILE *stream) 从流stream中读入nitems
         个长度ؓsize的字W串存入ptr?br /> int     fwrite(void *ptr,int size,int nitems,FILE *stream) 向流stream中写入nitems
         个长度ؓsize的字W串,字符串在ptr?br /> int     fscanf(FILE *stream,char *format[,argument,…]) 以格式化形式从流stream?br />          d一个字W串
int     vfscanf(FILE *stream,char *format,Valist param) 以格式化形式从流stream?br />          d一个字W串,参数从Valist param中取?br /> int     fprintf(FILE *stream,char *format[,argument,…])    以格式化形式一个字W?br />          串写l指定的stream
int     vfprintf(FILE *stream,char *format,Valist param)    以格式化形式一个字W?br />          串写l指定的stream,参数从Valist param中取?br /> int     fseek(FILE *stream,long offset,int fromwhere) 函数把文件指针移到fromwhere
         所指位|的向后offset个字节处,fromwhere可以Z下?
         SEEK_SET 文g开?nbsp;    SEEK_CUR 当前位置     SEEK_END 文g?br /> long    ftell(FILE *stream)    函数q回定位在stream中的当前文g指针位置,以字节表C?br /> int     rewind(FILE *stream) 当前文件指针streamUd文g开?br /> int     feof(FILE *stream) 流stream上的文g指针是否在结束位|?br /> int     fileno(FILE *stream) 取流stream上的文g处理Qƈq回文g处理
int     ferror(FILE *stream) 流stream上是否有d错误Q如有错误就q回1
void    clearerr(FILE *stream) 清除stream上的d错误
void    setbuf(FILE *stream,char *buf) l流stream指定一个缓冲区buf
void    setvbuf(FILE *stream,char *buf,int type,unsigned size)
         l流stream指定一个缓冲区buf,大小为size,cd为type,type的D下表
        ┌───┬───────────────────────────────?br />         │type值│意义                                                            ?br />         ├───┼───────────────────────────────?br />         │_IOFBF│文件是完全~冲?当缓冲区是空?下一个输入操作将企图填满整个~│
        ?nbsp;       │冲?在输出时,在把M数据写到文g之前,完全填充缓冲区.        ?br />         │_IOLBF│文件是行缓冲区.当缓冲区为空?下一个输入操作将仍然企图填整个缓?br />         ?nbsp;       │冲?然而在输出?每当新行W写到文?~冲区就被清z掉.          ?br />         │_IONBF│文件是无缓冲的.buf和size参数是被忽略?每个输入操作直接从??br />         ?nbsp;       │g?每个输出操作立x数据写到文g?                        ?br />         └───┴───────────────────────────────?br /> int     fclose(FILE *stream) 关闭一个流Q可以是文g或设?例如LPT1)
int     fcloseall()            关闭所有除stdin或stdout外的?br /> int     fflush(FILE *stream) 关闭一个流Qƈ对缓冲区作处?br />           处理卛_ȝ,流内内容读入缓冲区Q?br />           对写的流Q将~冲区内内容写入。成功返?
int     fflushall()            关闭所有流QƈҎ(gu)各自的缓冲区作处?br />           处理卛_ȝ,流内内容读入缓冲区Q?br />           对写的流Q将~冲区内内容写入。成功返?

int     access(char *filename,int amode) 本函数检查文件filenameq返回文件的属?
          函数属性存于amode中,amode׃下位的组合构?br />             06可以诅R写         04可以?nbsp;    02可以?nbsp;    01执行(忽略?     00文g存在
        如果filename是一个目?函数只定目录是否存在
        函数执行成功q回0,否则q回-1
int     chmod(char *filename,int permiss) 本函数用于设定文件filename的属?br />           permiss可以Z下?br />              S_IWRITE允许?nbsp;   S_IREAD允许?nbsp;   S_IREAD|S_IWRITE允许诅R写
int    _chmod(char *filename,int func[,int attrib]);
         本函数用于读取或讑֮文gfilename的属性,
         当func=0Ӟ函数q回文g的属性;当func=1Ӟ函数讑֮文g的属?br />          若ؓ讑֮文g属性,attrib可以Z列常C一
         FA_RDONLY只读    FA_HIDDEN隐藏    FA_SYSTEMpȝ



smildlzj 2007-11-17 11:24 发表评论
]]>
用WinSock实现HTTP的GEThttp://www.aygfsteel.com/smildlzj/articles/161181.htmlsmildlzjsmildlzjSat, 17 Nov 2007 02:35:00 GMThttp://www.aygfsteel.com/smildlzj/articles/161181.htmlhttp://www.aygfsteel.com/smildlzj/comments/161181.htmlhttp://www.aygfsteel.com/smildlzj/articles/161181.html#Feedback0http://www.aygfsteel.com/smildlzj/comments/commentRss/161181.htmlhttp://www.aygfsteel.com/smildlzj/services/trackbacks/161181.html#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h> //header
#pragma comment (lib, "ws2_32.lib") //lib

void SendString(SOCKET sock,LPCSTR str)
{
    send(sock,str,strlen(str),0);
}

int main(void)
{
 WSADATA  wsaData;
 SOCKET  sock;
 SOCKADDR_IN tcpaddr;
 hostent * remoteHost;
 char   host[] = {"www.hao123.com"};     //L名就直接写了
 int   Ret,l;
 BOOL  done;
 int   port = 80;
 int   chars = 0;
 char  buffer[512];

 if( (Ret = WSAStartup(MAKEWORD(1,1), &wsaData) ) != 0 )
 {
  printf("WSAStartup failed with error %d\n", Ret);
  return 1;
 }

 if( (remoteHost = gethostbyname(host)) == NULL )       //通过L名获取地址
 {
  printf("gethostbyname error!\n");
  return 1;
 }
 
 sock = socket (AF_INET, SOCK_STREAM, 0);
 
 tcpaddr.sin_family = AF_INET;
 tcpaddr.sin_port = htons( (unsigned short)port );
 tcpaddr.sin_addr.s_addr = *((unsigned long *)*remoteHost->h_addr_list);  //转换地址

 if( connect(sock, (const sockaddr * )&tcpaddr, sizeof(tcpaddr)) )
 {
  printf("connect error!");
  return 1;
 }
//q里是要发送的http头部
 SendString(sock,"GET / HTTP/1.1\r\n");
 SendString(sock,"Host:www.hao123.com\r\n");
 SendString(sock,"Accept: */*\r\n");
 SendString(sock,"User-Agent: Mozilla/4.0");
 SendString(sock,"(compatible; MSIE 5.00; Windows 98)\r\n");
 SendString(sock,"Connection:Keep-Alive\r\n");
 SendString(sock,"\r\n");
 SendString(sock,"\r\n");//最后要加空?/p>

 done = FALSE;
 FILE * fp;
 fp = fopen("1.txt","w");
//打印q保存http响应的头?br />     while(!done)
    {
        l = recv(sock,buffer,1,0);
        if(l<0)
            done=TRUE;
  switch(*buffer)
        {
            case '\r':
                break;
            case '\n':
                if(chars==0)
                    done = TRUE;
                chars=0;
                break;
            default:
                chars++;
                break;
        }
  printf("%c",*buffer);
  fputc(buffer[0],fp);
    }

//接收正文部分
 int sum = 0;
 do
 {
  l = recv(sock,buffer,sizeof(buffer)-1,0);
  if( l < 0 )
   break;
  sum += l;
  *(buffer + l) = 0;
  fputs(buffer,fp);
 } while( l > 0 );

 //q里输出正文部分大小Q发现其实和响应消息头部的Content-length大小是一L(fng)
//q样可以检查是否接受完?br />  printf("sum = %d\n",sum);

 closesocket(sock);

 if( WSACleanup() == SOCKET_ERROR )
 {
  printf("WSACleanup failed with error %d \n", WSAGetLastError() );
 }

 return 0;
}

 

 


 



smildlzj 2007-11-17 10:35 发表评论
]]>
【{】c语言[win32 socket] http://www.aygfsteel.com/smildlzj/articles/161179.htmlsmildlzjsmildlzjSat, 17 Nov 2007 02:13:00 GMThttp://www.aygfsteel.com/smildlzj/articles/161179.htmlhttp://www.aygfsteel.com/smildlzj/comments/161179.htmlhttp://www.aygfsteel.com/smildlzj/articles/161179.html#Feedback0http://www.aygfsteel.com/smildlzj/comments/commentRss/161179.htmlhttp://www.aygfsteel.com/smildlzj/services/trackbacks/161179.html  可能其他方式也能实现Q我会一U也差不多了,呵呵?/div>
 
有点需要特别注意的Q因为我用的是MinGW为C~译器,所以编译的时候需要加?lwsock32的参数?/div>
如: gcc server.c -o server -lwsock32
 
服务器端代码Q?/div>
#include<stdio.h>
#include<winsock.h> 
#pragma comment (lib, "ws2_32.lib")
BOOL InitWinsock();
void main(){
 SOCKET socket1;
 InitWinsock();
 struct sockaddr_in local;
 
 local.sin_family=AF_INET;
 local.sin_port=htons(3490); ///监听端口
 local.sin_addr.s_addr=INADDR_ANY; ///本机
 memset(local.sin_zero,0,8);
 
 socket1=socket(AF_INET,SOCK_STREAM,0);
 int bind_result = bind(socket1,(struct sockaddr*)&local,sizeof(local));
 while (1){
  int nlisten = listen(socket1, 10);
    printf("Listening......\n");
    struct sockaddr_in their_addr;
    int nSize = sizeof(their_addr);
    int nNewFd = accept(socket1, (struct sockaddr*)&their_addr, &nSize);
  printf("Accepted! IP:%s: Port:%d\n", inet_ntoa(their_addr.sin_addr), ntohs(their_addr.sin_port));
  Sleep(500);
 }
 closesocket(socket1);
}

BOOL InitWinsock(){
 int Error;
 WORD VersionRequested;
 WSADATA WsaData;
 VersionRequested=MAKEWORD(2,2);
 Error=WSAStartup(VersionRequested,&WsaData); //启动WinSock2
 if(Error!=0){
  return FALSE;
 }
 else {
  if(LOBYTE(WsaData.wVersion)!=2||HIBYTE(WsaData.wHighVersion)!=2){
   WSACleanup();
   return FALSE;
  }
 }
 return TRUE;
}
 
客户D代码:
#include<stdio.h>
#include<winsock.h> 
#pragma comment (lib, "ws2_32.lib")
BOOL InitWinsock();
void main(){
 SOCKET socket1;
 InitWinsock();
 struct sockaddr_in from;
 struct sockaddr_in local;
 local.sin_family = AF_INET;
 local.sin_port = htons(888);
 local.sin_addr.s_addr = INADDR_ANY;
 int fromlen =sizeof (from);
 socket1 = socket(AF_INET,SOCK_STREAM,0);
 int nbind = bind(socket1,(struct sockaddr*)&local, sizeof(local));
 if (nbind < 0){
  printf("error");
  exit(1);
 }
 from.sin_family = AF_INET;
 from.sin_port = htons(3490);
 from.sin_addr.S_un.S_addr = inet_addr("10.10.110.249");
 memset(from.sin_zero, 0, 8);
 int nCon = connect(socket1, (struct sockaddr*)& from, sizeof (from));
 if (nCon < 0){
  printf("error");
  exit(1);
 }
}
BOOL InitWinsock(){
 int Error;
 WORD VersionRequested;
 WSADATA WsaData;
 VersionRequested = MAKEWORD(2,2);
 Error = WSAStartup(VersionRequested, &WsaData);
 if (Error != 0){
  return FALSE;
 }
 else {
  if(LOBYTE(WsaData.wVersion) != 2 || HIBYTE(WsaData.wHighVersion) != 2){
   WSACleanup();
   return FALSE;
  }
 }
 return TRUE;
}


smildlzj 2007-11-17 10:13 发表评论
]]> վ֩ģ壺 ޳| | | | ̩| | | ѽ| żҸ| | | ӻ| | ̩| ˹| ʡ| ͬ| | | ̩| | | | | | | | ̨ɽ| | | | ߰| ӳ| | Ϫ| | | | ׿| | |