首页编程c语言网络编程实例 网络编程实例

c语言网络编程实例 网络编程实例

编程之家2026-06-03955次浏览

大家好,感谢邀请,今天来为大家分享一下c语言网络编程实例的问题,以及和网络编程实例的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!

c语言网络编程实例 网络编程实例

c语言的网络编程特点有哪些(在线等待,答得好马上给分!)

1. C语言的特点

C语言是一种广受欢迎的结构化程序设计语言,具有极强的生命力.

"C语言无所不能!":适用面比较广,具有高级语言的优点和低级语言特点

与硬件无关,可移植性强

C语言是一门简洁语言:仅有32个关键字,9种控制语句

在所有高级语言中,目标代码质量高,运行效率最高

c语言网络编程实例 网络编程实例

结构化,模块化语言,非常适合结构化程序设计.

2.结构化程序设计方法

结构化程序设计方法强调程序设计风格和程序结构的规范化,提倡清晰的结构.

特点:

自顶向下,逐步细化:将问题分解为子问题,将子问题分解为再小的模块.直到该模块我们可以很容易地求解为止.

模块化设计:对每个模块,用结构化的方法加以设计.

结构化编码:对每个模块,分别编写对应的函数.

目标:

便于多人分工协作完成大型软件;便于代码维护;

C语言的编程

3. C语言基本概念

Hello World!示例

int main()

{ printf("Hello, world!");

return 0;}

函数结构化,模块化的基础

主函数main()

库函数:数学函数,字符串函数,io函数,内存分配函数

scanf, printf,…

C语言的编程

C语言基本概念(数据表达)

数据类型:整型,实型,字符型

数组:同种数据类型的元素的集合;下标引用

指针:(基本要求:看懂别人的程序)

注:建议掌握计算机硬件工作原理,如直接寻址,间接寻址;至少掌握变量的存储方式(《C程序设计》p201)

1)指针即地址;指针变量是用于存放地址的变量

2)指针可以与整型变量一样运算;

3)★指针必须具备合法地址才可用;

C语言的编程

C语言基本概念(数据表达)

结构(构造类型)

是由不同数据类型的数据组成的集合体;

struct student/*定义结构体类型*/

{ char name[20];

int sex;

int age;

char addr[100];};

注:结构体变量不能作为一个整体参加数据处理;

struct student Wang2;

Wang2.age=22;

C语言的编程

C语言基本概念(程序结构)

表达式:算术,关系,逻辑,赋值,函数

语句

顺序结构,选择结构(if语句,switch语句),

循环结构(while语句,for语句与do while语句)

函数:输入输出函数

文件:永久保存数据的方式

流式文件;FILE结构体;文件io函数;(p309)

C程序的编写与上机调试

4. C程序的编写与上机调试

Hello World!示例

cl

tc2.0(略)

vc6.0:规范的project操作示范

(1) new一个空的基于console的project;

(2)创建c文件,并输入代码;

(3)将c文件加入project;

(4)编译,调试,运行;

对软件开发成本高和进度估计不准确.

用户对已完成的"软件系统"不满意.

软件产品的质量不可靠.

软件的维护困难,维护的人员与费用不断增加.

缺乏完整,正确的文档资料.

软件成本在计算机系统中所占比例逐年上升.

软件的发展跟不上硬件的发展和用户的要求.

软件的规模非常庞大,多人共同开发,必须有严格和科学的管理.

软件开发过分依赖于个人的智力劳动和经验.

学习指针最好是先学些计算机硬件工作的原理,例如:直接寻址,间接寻址等,只有了解了这些内容以后,你再学指针就比较容易理会,毕竟C语言是一门介于机器语言与高级语言中间的语言,没有一些硬件工作知识是很难领悟它的真谛的.

1.指针是地址变量:它的值有两种:其一是地址,其二是内容.不同的表达方式可以取不同的值,这有点象一个家庭地址在不同的场合标识的人物也不同.例如:父母亲在他们的单位所登记的家庭地址就代表他们自己,而你在学校中登记的同样的家庭地址就代表你自己.

2.指针是可以运算的,它的运算法则与变量是一致的.

另外,在编写一个程序时,除非万不得已,一般不要使用指针变量.建议各位对于指针只要能看懂就行!

对软件开发成本高和进度估计不准确.

用户对已完成的"软件系统"不满意.

软件产品的质量不可靠.

软件的维护困难,维护的人员与费用不断增加.

缺乏完整,正确的文档资料.

软件成本在计算机系统中所占比例逐年上升.

软件的发展跟不上硬件的发展和用户的要求.

软件的规模非常庞大,多人共同开发,必须有严格和科学的管理.

软件开发过分依赖于个人的智力劳动和经验.

学习指针最好是先学些计算机硬件工作的原理,例如:直接寻址,间接寻址等,只有了解了这些内容以后,你再学指针就比较容易理会,毕竟C语言是一门介于机器语言与高级语言中间的语言,没有一些硬件工作知识是很难领悟它的真谛的.

1.指针是地址变量:它的值有两种:其一是地址,其二是内容.不同的表达方式可以取不同的值,这有点象一个家庭地址在不同的场合标识的人物也不同.例如:父母亲在他们的单位所登记的家庭地址就代表他们自己,而你在学校中登记的同样的家庭地址就代表你自己.

2.指针是可以运算的,它的运算法则与变量是一致的.

另外,在编写一个程序时,除非万不得已,一般不要使用指针变量.建议各位对于指针只要能看懂就行!

操作系统,科学计算,自然语言处理…….

C语言是一门简洁语言

简单:仅有32个关键字,9种控制语句(参见附录2).在所有高级语言中,关键字最少的.

简练:在C程序中一行代码可以表达的内容,在别的语言中可能要用好几行代码

C语句: int a[10];

PASCAL:VAR a:ARRAY[1..10] OF INTEGER

生成机器码质量高.程序执行效率高.仅比汇编程序生成的代码效率低10%~20%.在所有高级语言中,代码执行效率最高的.

学习C语言的难点

C语言:

限制少,灵活性大.使程序设计人员有较大的自由度,以适应宽广的应用面.

引出的问题:

容易出错

技巧性强

因此,C语言虽然很简洁,但学习起来,比Fortran, Basic等高级语言要困难.

怎样学好C语言

多阅读别人书写的结构良好的程序

操作系统,科学计算,自然语言处理…….

C语言是一门简洁语言

简单:仅有32个关键字,9种控制语句(参见附录2).在所有高级语言中,关键字最少的.

简练:在C程序中一行代码可以表达的内容,在别的语言中可能要用好几行代码

C语句: int a[10];

PASCAL:VAR a:ARRAY[1..10] OF INTEGER

生成机器码质量高.程序执行效率高.仅比汇编程序生成的代码效率低10%~20%.在所有高级语言中,代码执行效率最高的.

学习C语言的难点

C语言:

限制少,灵活性大.使程序设计人员有较大的自由度,以适应宽广的应用面.

引出的问题:

容易出错

技巧性强

因此,C语言虽然很简洁,但学习起来,比Fortran, Basic等高级语言要困难.

怎样学好C语言

多阅读别人书写的结构良好的程序

操作系统,科学计算,自然语言处理…….

C语言是一门简洁语言

简单:仅有32个关键字,9种控制语句(参见附录2).在所有高级语言中,关键字最少的.

简练:在C程序中一行代码可以表达的内容,在别的语言中可能要用好几行代码

C语句: int a[10];

PASCAL:VAR a:ARRAY[1..10] OF INTEGER

生成机器码质量高.程序执行效率高.仅比汇编程序生成的代码效率低10%~20%.在所有高级语言中,代码执行效率最高的.

学习C语言的难点

C语言:

限制少,灵活性大.使程序设计人员有较大的自由度,以适应宽广的应用面.

引出的问题:

容易出错

技巧性强

因此,C语言虽然很简洁,但学习起来,比Fortran, Basic等高级语言要困难.

怎样学好C语言

多阅读别人书写的结构良好的程序

操作系统,科学计算,自然语言处理…….

C语言是一门简洁语言

简单:仅有32个关键字,9种控制语句(参见附录2).在所有高级语言中,关键字最少的.

简练:在C程序中一行代码可以表达的内容,在别的语言中可能要用好几行代码

C语句: int a[10];

PASCAL:VAR a:ARRAY[1..10] OF INTEGER

生成机器码质量高.程序执行效率高.仅比汇编程序生成的代码效率低10%~20%.在所有高级语言中,代码执行效率最高的.

学习C语言的难点

C语言:

限制少,灵活性大.使程序设计人员有较大的自由度,以适应宽广的应用面.

引出的问题:

容易出错

技巧性强

因此,C语言虽然很简洁,但学习起来,比Fortran, Basic等高级语言要困难.

怎样学好C语言

多阅读别人书写的结构良好的程序

操作系统,科学计算,自然语言处理…….

C语言是一门简洁语言

简单:仅有32个关键字,9种控制语句(参见附录2).在所有高级语言中,关键字最少的.

简练:在C程序中一行代码可以表达的内容,在别的语言中可能要用好几行代码

C语句: int a[10];

PASCAL:VAR a:ARRAY[1..10] OF INTEGER

生成机器码质量高.程序执行效率高.仅比汇编程序生成的代码效率低10%~20%.在所有高级语言中,代码执行效率最高的.

学习C语言的难点

C语言:

限制少,灵活性大.使程序设计人员有较大的自由度,以适应宽广的应用面.

引出的问题:

容易出错

技巧性强

因此,C语言虽然很简洁,但学习起来,比Fortran, Basic等高级语言要困难.

怎样学好C语言

多阅读别人书写的结构良好的程序

C语言与网络问题 高手进

ping命令是dos命令可以创建一个cmd进程,然后建立两个管道用来得到结果实现.

下面是一个网络编程的实例, Syn扫描器代码,可以作为参考.

基本可以看为是 ping命令的实现

//getallIP.cpp

#include<winsock2.h>

#include<stdio.h>

#pragma comment(lib,"ws2_32.lib")

int main()

{

////////////////

//初始化 Windows sockets API.

//

WORD wVersionRequested= MAKEWORD(2, 2);

WSADATA wsaData;

if(WSAStartup(wVersionRequested,&wsaData)){

printf("WSAStartup failed%s\n", WSAGetLastError());

return 0;

}

//////////////////

//获得主机名.

//

char hostname[256];

int res= gethostname(hostname, sizeof(hostname));

if(res!= 0){

printf("Error:%u\n", WSAGetLastError());

return 0;

}

printf("hostname=%s\n", hostname);

////////////////

//根据主机名获取主机信息.

//

hostent* pHostent= gethostbyname(hostname);

if(pHostent==NULL){

printf("Error:%u\n", WSAGetLastError());

return 0;

}

//////////////////

//解析返回的hostent信息.

//

hostent& he=*pHostent;

printf("name=%s\naliases=%s\naddrtype=%d\nlength=%d\n",

he.h_name, he.h_aliases, he.h_addrtype, he.h_length);

sockaddr_in sa;

//根据 he.h_addr_list[nAdapter]是否为空来获取所有IP地址

for(int nAdapter=0; he.h_addr_list[nAdapter]; nAdapter++){

memcpy(&sa.sin_addr.s_addr, he.h_addr_list[nAdapter],he.h_length);

//输出机器的IP地址.

printf("Address [%d%]:%s\n",nAdapter, inet_ntoa(sa.sin_addr));//显示地址串

}

//////////////////

//终止 Windows sockets API

//

WSACleanup();

return 0;

}

//mstcpip.h

// Copyright(C) Microsoft Corporation, 1996-1999

#if _MSC_VER> 1000

#pragma once

#endif

/* Argument structure for SIO_KEEPALIVE_VALS*/

struct tcp_keepalive{

u_long onoff;

u_long keepalivetime;

u_long keepaliveinterval;

};

// New WSAIoctl Options

#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)

#define SIO_RCVALL_MCAST _WSAIOW(IOC_VENDOR,2)

#define SIO_RCVALL_IGMPMCAST _WSAIOW(IOC_VENDOR,3)

#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)

#define SIO_ABSORB_RTRALERT _WSAIOW(IOC_VENDOR,5)

#define SIO_UCAST_IF _WSAIOW(IOC_VENDOR,6)

#define SIO_LIMIT_BROADCASTS _WSAIOW(IOC_VENDOR,7)

#define SIO_INDEX_BIND _WSAIOW(IOC_VENDOR,8)

#define SIO_INDEX_MCASTIF _WSAIOW(IOC_VENDOR,9)

#define SIO_INDEX_ADD_MCAST _WSAIOW(IOC_VENDOR,10)

#define SIO_INDEX_DEL_MCAST _WSAIOW(IOC_VENDOR,11)

//synscan.cpp

#include<winsock2.h>

#include<ws2tcpip.h>

#include<stdio.h>

#include<time.h>

#include"mstcpip.h"

#pragma comment(lib,"ws2_32.lib")

#define SEQ 0x28376839

SOCKET sockRaw= INVALID_SOCKET,

sockListen= INVALID_SOCKET;

struct sockaddr_in dest;

BOOL ScanOK=FALSE;

char*DEST_HOST;

int DEST_PORT;

int DEST_PORTEND;

int play=0;

clock_t start,end;//程序运行的起始和结束时间

float costtime;//程序耗时

typedef struct _iphdr

{

unsigned char h_lenver;//4位首部长度+4位IP版本号

unsigned char tos;//8位服务类型TOS

unsigned short total_len;//16位总长度(字节)

unsigned short ident;//16位标识

unsigned short frag_and_flags;//3位标志位

unsigned char ttl;//8位生存时间 TTL

unsigned char proto;//8位协议(TCP, UDP或其他)

unsigned short checksum;//16位IP首部校验和

unsigned int sourceIP;//32位源IP地址

unsigned int destIP;//32位目的IP地址

}IP_HEADER;

typedef struct _tcphdr//定义TCP首部

{

USHORT th_sport;//16位源端口

USHORT th_dport;//16位目的端口

unsigned int th_seq;//32位序列号

unsigned int th_ack;//32位确认号

unsigned char th_lenres;//4位首部长度/6位保留字

unsigned char th_flag;//6位标志位

USHORT th_win;//16位窗口大小

USHORT th_sum;//16位校验和

USHORT th_urp;//16位紧急数据偏移量

}TCP_HEADER;

struct//定义TCP伪首部

{

unsigned long saddr;//源地址

unsigned long daddr;//目的地址

char mbz;

char ptcl;//协议类型

unsigned short tcpl;//TCP长度

}psd_header;

//SOCK错误处理程序

void CheckSockError(int iErrorCode, char*pErrorMsg)

{

if(iErrorCode==SOCKET_ERROR)

{

printf("%s Error:%d\n", pErrorMsg, GetLastError());

closesocket(sockRaw);

ExitProcess(-1);

}

}

//计算检验和

USHORT checksum(USHORT*buffer, int size)

{

unsigned long cksum=0;

while(size> 1)

{

cksum+=*buffer++;

size-= sizeof(USHORT);

}

if(size)

{

cksum+=*(UCHAR*)buffer;

}

cksum=(cksum>> 16)+(cksum& 0xffff);

cksum+=(cksum>>16);

return(USHORT)(~cksum);

}

//IP解包程序

bool DecodeIPHeader(char*buf, int bytes)

{

IP_HEADER*iphdr;

TCP_HEADER*tcphdr;

unsigned short iphdrlen;

iphdr=(IP_HEADER*)buf;

iphdrlen= sizeof(unsigned long)*(iphdr->h_lenver& 0xf);

tcphdr=(TCP_HEADER*)(buf+ iphdrlen);

//是否来自目标IP

if(iphdr->sourceIP!= dest.sin_addr.s_addr) return false;

//序列号是否正确

if((ntohl(tcphdr->th_ack)!=(SEQ+1))&&(ntohl(tcphdr->th_ack)!= SEQ)) return false;

//if(tcphdr->th_flag== 20)return true;

//SYN/ACK-扫描到一个端口

if(tcphdr->th_flag== 18)

{

printf("\t%d\t open\n",ntohs(tcphdr->th_sport));

return true;

}

return true;

}

void usage(void)

{

printf("\t===================SYN portscaner======================\n");

printf("\t============gxisone@hotmail.com 2004/7/6===========\n");

printf("\tusage: synscan DomainName[IP] StartPort-EndPort\n");

printf("\tExample: synscan www.163.com 1-139\n");

printf("\tExample: synscan 192.168.1.1 8000-9000\n");

}

DWORD WINAPI RecvThread(LPVOID para)//接收数据线程函数

{

int iErrorCode;

struct hostent*hp;

char RecvBuf[65535]={0};

sockListen= socket(AF_INET, SOCK_RAW, IPPROTO_IP);

CheckSockError(sockListen,"socket");

//设置IP头操作选项

BOOL bOpt= true;

iErrorCode= setsockopt(sockRaw,IPPROTO_IP,IP_HDRINCL,(char*)&bOpt,sizeof(bOpt));

CheckSockError(iErrorCode,"setsockopt()");

//获得本地IP

SOCKADDR_IN sa;

unsigned char LocalName[256];

iErrorCode= gethostname((char*)LocalName,sizeof(LocalName)-1);

CheckSockError(iErrorCode,"gethostname()");

if((hp= gethostbyname((char*)LocalName))== NULL)

{

CheckSockError(SOCKET_ERROR,"gethostbyname()");

}

memcpy(&sa.sin_addr.S_un.S_addr,hp->h_addr_list[1],hp->h_length);

sa.sin_family= AF_INET;

sa.sin_port= htons(7000);

iErrorCode= bind(sockListen,(PSOCKADDR)&sa, sizeof(sa));

CheckSockError(iErrorCode,"bind");

//设置SOCK_RAW为SIO_RCVALL,以便接收所有的IP包

DWORD dwBufferLen[10];

DWORD dwBufferInLen= 1;

DWORD dwBytesReturned= 0;

iErrorCode=WSAIoctl(sockListen, SIO_RCVALL,&dwBufferInLen, sizeof

(dwBufferInLen),&dwBufferLen, sizeof(dwBufferLen),&dwBytesReturned, NULL, NULL);

CheckSockError(iErrorCode,"Ioctl");

memset(RecvBuf, 0, sizeof(RecvBuf));

//接收数据

for(;;)

{

iErrorCode= recv(sockListen, RecvBuf, sizeof(RecvBuf), 0);

//CheckSockError(iErrorCode,"recv");

DecodeIPHeader(RecvBuf,iErrorCode);

}

if(ScanOK)

{

closesocket(sockListen);

return 0;

}

}

void playx(void)//定义状态提示函数

{

//进度条

char*plays[12]=

{

"|",

"/",

"-",

"\\",

"|",

"/",

"-",

"\\",

"|",

"/",

"-",

"\\",

};

printf("=%s=\r", plays[play]);

play=(play==11)?0:play+1;

Sleep(2);

}

//主函数

int main(int argc,char**argv)

{

char*p;

if(argc!=3)

{

usage();

return 0;

}

p=argv[2];//处理端口参数

if(strstr(argv[2],"-"))

{ DEST_PORT=atoi(argv[2]);

for(;*p;)

if(*(p++)=='-')break;

DEST_PORTEND=atoi(p);

if(DEST_PORT<1|| DEST_PORTEND>65535)

{ printf("Port Error!\n");

return 0;

}

}

DEST_HOST=argv[1];

usage();

int iErrorCode;

int datasize;

struct hostent*hp;

IP_HEADER ip_header;

TCP_HEADER tcp_header;

char SendBuf[128]={0};

//初始化SOCKET

WSADATA wsaData;

iErrorCode= WSAStartup(MAKEWORD(2,2),&wsaData);

CheckSockError(iErrorCode,"WSAStartup()");

sockRaw= socket(AF_INET, SOCK_RAW, IPPROTO_IP);

CheckSockError(sockRaw,"socket()");

sockListen= socket(AF_INET, SOCK_RAW, IPPROTO_IP);

CheckSockError(sockListen,"socket");

//设置IP头操作选项

BOOL bOpt= true;

iErrorCode= setsockopt(sockRaw,IPPROTO_IP,IP_HDRINCL,(char*)&bOpt,sizeof(bOpt));

CheckSockError(iErrorCode,"setsockopt()");

//获得本地IP

SOCKADDR_IN sa;

unsigned char LocalName[256];

iErrorCode= gethostname((char*)LocalName,sizeof(LocalName)-1);

CheckSockError(iErrorCode,"gethostname()");

if((hp= gethostbyname((char*)LocalName))== NULL)

{

CheckSockError(SOCKET_ERROR,"gethostbyname()");

}

memcpy(&sa.sin_addr.S_un.S_addr,hp->h_addr_list[1],hp->h_length);

sa.sin_family= AF_INET;

sa.sin_port= htons(7000);

iErrorCode= bind(sockListen,(PSOCKADDR)&sa, sizeof(sa));

CheckSockError(iErrorCode,"bind");

//获得目标主机IP

memset(&dest,0,sizeof(dest));

dest.sin_family= AF_INET;

dest.sin_port= htons(DEST_PORT);

if((dest.sin_addr.s_addr= inet_addr(DEST_HOST))== INADDR_NONE)

{

if((hp= gethostbyname(DEST_HOST))!= NULL)

{

memcpy(&(dest.sin_addr),hp->h_addr_list[1],hp->h_length);

dest.sin_family= hp->h_addrtype;

printf("dest.sin_addr=%s\n",inet_ntoa(dest.sin_addr));

}

else

{

CheckSockError(SOCKET_ERROR,"gethostbyname()");

}

}

//开启监听线程

HANDLE Thread=CreateThread(NULL,0,RecvThread,0,0,0);

//填充IP首部

ip_header.h_lenver=(4<<4| sizeof(ip_header)/sizeof(unsigned long));

//高四位IP版本号,低四位首部长度

ip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER));//16位总长度(字节)

ip_header.ident=1;//16位标识

ip_header.frag_and_flags=0;//3位标志位

ip_header.ttl=128;//8位生存时间TTL

ip_header.proto=IPPROTO_TCP;//8位协议(TCP,UDP…)

ip_header.checksum=0;//16位IP首部校验和

ip_header.sourceIP=sa.sin_addr.s_addr;//32位源IP地址

ip_header.destIP=dest.sin_addr.s_addr;//32位目的IP地址

//填充TCP首部

tcp_header.th_sport=htons(7000);//源端口号

tcp_header.th_lenres=(sizeof(TCP_HEADER)/4<<4|0);//TCP长度和保留位

tcp_header.th_win=htons(16384);

//填充TCP伪首部(用于计算校验和,并不真正发送)

psd_header.saddr=ip_header.sourceIP;

psd_header.daddr=ip_header.destIP;

psd_header.mbz=0;

psd_header.ptcl=IPPROTO_TCP;

psd_header.tcpl=htons(sizeof(tcp_header));

Sleep(500);

printf("\n");

printf("Scaning%s\n",DEST_HOST);

start=clock();//开始计时

for(;DEST_PORT<DEST_PORTEND;DEST_PORT++)

{

playx();

tcp_header.th_dport=htons(DEST_PORT);//目的端口号

tcp_header.th_ack=0;//ACK序列号置为0

tcp_header.th_flag=2;//SYN标志

tcp_header.th_seq=htonl(SEQ);//SYN序列号

tcp_header.th_urp=0;//偏移

tcp_header.th_sum=0;//校验和

//计算TCP校验和,计算校验和时需要包括TCP pseudo header

memcpy(SendBuf,&psd_header,sizeof(psd_header));

memcpy(SendBuf+sizeof(psd_header),&tcp_header,sizeof(tcp_header));

tcp_header.th_sum=checksum((USHORT*)SendBuf,sizeof(psd_header)+sizeof(tcp_header));

//计算IP校验和

memcpy(SendBuf,&ip_header,sizeof(ip_header));

memcpy(SendBuf+sizeof(ip_header),&tcp_header,sizeof(tcp_header));

memset(SendBuf+sizeof(ip_header)+sizeof(tcp_header),0,4);

datasize=sizeof(ip_header)+sizeof(tcp_header);

ip_header.checksum=checksum((USHORT*)SendBuf,datasize);

//填充发送缓冲区

memcpy(SendBuf,&ip_header,sizeof(ip_header));

//发送TCP报文

iErrorCode=sendto(sockRaw,SendBuf,datasize,0,(struct sockaddr*)&dest,

sizeof(dest));

CheckSockError(iErrorCode,"sendto()");

}

end=clock();//计时结束

ScanOK=TRUE;

printf("Closeing Thread.....\n");

WaitForSingleObject(Thread,5000);

CloseHandle(Thread);

costtime=(float)(end- start)/ CLOCKS_PER_SEC;//转换时间格式

printf("Cost time:%f Sec",costtime);//显示耗时

//退出前清理

if(sockRaw!= INVALID_SOCKET) closesocket(sockRaw);

WSACleanup();

return 0;

}

c语言网络编程 书

朋友,我的建议是,你在学网络编程之前,一定要把c基础学好,当然不只看谭教授的书了,下面推荐的几本书被公认为c语言方面的经典书籍,分别是:

1、c和指针 Kenneth A.Reek著徐波译人民邮电出版社

2、c陷阱和缺陷 Andrew Koenig著高巍译人民邮电出版社

3、c专家编程 Dennis Ritchie著人民邮电出版社

另外推荐基本网络编程书籍,也被称为经典,分别是:

1、TCP/IP详解卷1:协议 W. Richard Stevens著谢希仁校机械工业出版社

2、unix网络编程(第三版) steven著清华大学出版社

你说你c基础不是很好,所以我建议你看书的先后顺序:先把谭教授那本书看透,接着看上面的c语言方面的三本书籍,当然你可以先看其中的一本或两本,看透后,你的c语言功底就很不错了(一定要结合书里面的范例多做题),此时你的基础就打好了,就可以接着看下面我给你推荐的两本关于网路编程方面的书籍了!好好学习,学海无涯!

如果你还想了解更多这方面的信息,记得收藏关注本站。

javascript入门必备 javascript软件java代码翻译器?java代码