c语言网络编程实例 网络编程实例
大家好,感谢邀请,今天来为大家分享一下c语言网络编程实例的问题,以及和网络编程实例的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!
c语言的网络编程特点有哪些(在线等待,答得好马上给分!)
1. C语言的特点
C语言是一种广受欢迎的结构化程序设计语言,具有极强的生命力.
"C语言无所不能!":适用面比较广,具有高级语言的优点和低级语言特点
与硬件无关,可移植性强
C语言是一门简洁语言:仅有32个关键字,9种控制语句
在所有高级语言中,目标代码质量高,运行效率最高
结构化,模块化语言,非常适合结构化程序设计.
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语言功底就很不错了(一定要结合书里面的范例多做题),此时你的基础就打好了,就可以接着看下面我给你推荐的两本关于网路编程方面的书籍了!好好学习,学海无涯!
如果你还想了解更多这方面的信息,记得收藏关注本站。