Linux下C语言的socket网络编程
Linux下C语⾔的socket⽹络编程
关于详细的服务器建⽴的步骤以及相关的socket套接字的知识我已经在python socket编程的⽂章中提到过了,⼤家可以参看那⼀篇博客来历
接socket套接字编程的内容,由于要是⽤C相关的API所以这⾥采⽤了基于C语⾔的socket API编写相关的⽹络编程内容,具体的实现如下所
⽰,调试通过。⽂章链接:
服务端Server.c程序内容:
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 /************************************************************************************************************************
12 1、int socket(int family,int type,int protocol)
13 family:
14 指定使⽤的协议簇:AF_INET(IPv4) AF_INET6(IPv6) AF_LOCAL(UNIX协议) AF_ROUTE(路由套接字) AF_KEY(秘钥套接字)
15 type:
16 指定使⽤的套接字的类型:SOCK_STREAM(字节流套接字) SOCK_DGRAM
17 protocol:
18 如果套接字类型不是原始套接字,那么这个参数就为0
19 2、int bind(int sockfd, struct sockaddr *myaddr, int addrlen)
20 sockfd:
21 socket函数返回的套接字描述符
22 myaddr:
23 是指向本地IP地址的结构体指针
24 myaddrlen:
25 结构长度
26 struct sockaddr{
27 unsigned short sa_family; //通信协议类型族AF_xx
28 char sa_data[14]; //14字节协议地址,包含该socket的IP地址和端⼝号
29 };
30 struct sockaddr_in{
31 short int sin_family; //通信协议类型族
32 unsigned short int sin_port; //端⼝号
33 struct in_addr sin_addr; //IP地址
34 unsigned char si_zero[8]; //填充0以保持与sockaddr结构的长度相同
35 };
36 3、int connect(int sockfd,const struct sockaddr *serv_addr,socklen_t addrlen)
37 sockfd:
38 socket函数返回套接字描述符
39 serv_addr:
40 服务器IP地址结构指针
41 addrlen:
42 结构体指针的长度
43 4、int listen(int sockfd, int backlog)
44 sockfd:
45 socket函数绑定bind后套接字描述符
46 backlog:
47 设置可连接客户端的最⼤连接个数,当有多个客户端向服务器请求时,收到此值的影响。默认值20
48 5、int accept(int sockfd,struct sockaddr *cliaddr,socklen_t *addrlen)
49 sockfd:
50 socket函数经过listen后套接字描述符
51 cliaddr:
52 客户端套接字接⼝地址结构
53 addrlen:
54 客户端地址结构长度
55 6、int send(int sockfd, const void *msg,int len,int flags)
56 7、int recv(int sockfd, void *buf,int len,unsigned int flags)
57 sockfd:
58 socket函数的套接字描述符
59 msg:
60 发送数据的指针
61 buf:
62 存放接收数据的缓冲区
63 len:
64 数据的长度,把flags设置为0
65 *************************************************************************************************************************/
66 int main(int argc, char *argv[])
67 {
68 int fd, new_fd, struct_len, numbytes,i;
69 struct sockaddr_in server_addr;
70 struct sockaddr_in client_addr;
71 char buff[BUFSIZ];
72
73 server_addr.sin_family = AF_INET; 74 server_addr.sin_port = htons(8000);
75 server_addr.sin_addr.s_addr = INADDR_ANY;
76 bzero(&(server_addr.sin_zero), 8);
77 struct_len = sizeof(struct sockaddr_in);
78
79 fd = socket(AF_INET, SOCK_STREAM, 0);
80 while(bind(fd, (struct sockaddr *)&server_addr, struct_len) == -1);
81 printf("Bind Success!\n");
82 while(listen(fd, 10) == -1);
83 printf("Listening....\n");
84 printf("Ready for Accept,Waitting...\n");
85 new_fd = accept(fd, (struct sockaddr *)&client_addr, &struct_len);
86 printf("Get the Client.\n");
87 numbytes = send(new_fd,"Welcome to my server\n",21,0);
88 while((numbytes = recv(new_fd, buff, BUFSIZ, 0)) > 0)
89 {
90 buff[numbytes] = '\0';
91 printf("%s\n",buff);
92 if(send(new_fd,buff,numbytes,0)<0)
93 {
94 perror("write");
95 return 1;
96 }
97 }
98 close(new_fd);
99 close(fd);
100 return 0;
101 }
客户端Client.c程序内容:
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc,char *argv[])
{
int sockfd,numbytes;
char buf[BUFSIZ];
struct sockaddr_in their_addr;
printf("break!");
while((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1);
printf("We get the sockfd~\n");
their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(8000);
their_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
bzero(&(their_addr.sin_zero), 8);
while(connect(sockfd,(struct sockaddr*)&their_addr,sizeof(struct sockaddr)) == -1);
printf("Get the Server~Cheers!\n");
numbytes = recv(sockfd, buf, BUFSIZ,0);//接收服务器端信息
buf[numbytes]='\0';
printf("%s",buf);
while(1)
{
printf("Entersome thing:");
scanf("%s",buf);
numbytes = send(sockfd, buf, strlen(buf), 0);
numbytes=recv(sockfd,buf,BUFSIZ,0);
buf[numbytes]='\0';
printf("received:%s\n",buf);
}
close(sockfd);
return 0;
}
使⽤gcc编译器对客户端程序和服务端程序进⾏编译和解释:
gcc -o Master Server.c
gcc -o Slave Client.c编译的结果如下所⽰:
这时请先运⾏Master程序,然后再运⾏Slave程序:
linux c socket
这篇日志还是先从一个能够运行起来的例子出发,一旦能顺利的看到程序的成功运行,那么接下来的事件我想应该是问为什么了?似乎这样更加容易理解和掌握。
对于socket程序的概念这里就不多写了,但我相信,如果能看完这整篇文章,我相信不会再有这样的疑问的。
下面将编写一个c/s结构的程序,主要功能是client将向server发送一些消息,而当server收到client的请求时,并向client发送一条回应信息。
// service_socket.c
#include
#include
#include
#include
#include
#include
#include
#include
#define SERVPORT 3333
#define BACKLOG 10
#define MAXSIZE 1024
int server_sock_main()
{
int sockfd,client_fd;
struct sockaddr_in my_addr;
struct sockaddr_in remote_addr;
//创建套接字
if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1) { perror("socket create failed!");
exit(1);
}
//绑定端口地址
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(SERVPORT);
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("bind error!");
用Perl语言进行Socket编程
用Perl语言进行Socket编程
网络编程是一门神秘且复杂的艺术,固然也十分有趣。Perl语言提供了丰硕的TCP/IP网络函数,所有这些函数都直接来源于C语言的socket库函数.
由于Perl语言和C语言的socket库函数在型式和使用方法上都是一样的,因此会使用Perl语言进行Socket编程, 当然也就会使用C语言进行Socket编程.
下面是Perl语言中有关的socket库函数列表:
一。函数原型 利用说明
socket()
socket()系统挪用为客户机或服务器创建一个套接字,套接字函数在如下概念:
#include
#include
int socket(int family, int type, int protocol)
在Linux中family=能够是SOCK_STREAM它是靠得住的虽然通信速度
较慢,也可以是SOCK_DGRAM它通信速度较快但不靠得住.若是type=SOCK_STREAM那么protocol=IPPROTO_TCP.若是type=SOCK_DGRAM那么protocol=IPPROTO_UDP.
若是犯错,函数将返回-1.不然返回一个套接字描述符你能够在程序后面的挪用
中通过套接字描述符利用那个套接字.
套接字创建时没有指定名字.客户机用套接字的名字读写它.这就是如下绑定函
数所要做之事.
listen()
listen()系统挪用被服务器所利用.下面有它的概念:
#include
#include
int listen(int sockfd, int backlog);
sockfd是套接字描述符.backlog是在一时间内尚未被决定是否拒绝的连接的号
码.一般利用标准值5.如发生错误则返回值小于1.
若是那个挪用成功,你就已经能够同意连接了.
setsockopt()和getsockopt()
Linux所提供的socket库含有一个错误(bug).此错误表现为你不能为一个套接
socket网络编程
Windows Socket 网络编程(二) —— 套接字编程原理
一、客户机/服务器模式
在TCP/IP网络中两个进程间的相互作用的主机模式是客户机/服务器模式(Client/Server model)。该模式的建立基于以下两点:1、非对等作用;2、通信完全是异步的。客户机/服务器模式在操作过程中采取的是主动请示方式:
首先服务器方要先启动,并根据请示提供相应服务:(过程如下)
1、打开一通信通道并告知本地主机,它愿意在某一个公认地址上接收客户请求。
2、等待客户请求到达该端口。
3、接收到重复服务请求,处理该请求并发送应答信号。
4、返回第二步,等待另一客户请求
5、关闭服务器。
客户方:
1、打开一通信通道,并连接到服务器所在主机的特定端口。
2、向服务器发送服务请求报文,等待并接收应答;继续提出请求……
3、请求结束后关闭通信通道并终止。
二、基本套接字
为了更好说明套接字编程原理,给出几个基本的套接字,在以后的篇幅中会给出更详细的使用说明。
1、创建套接字——socket()
功能:使用前创建一个新的套接字
格式:SOCKET PASCAL FAR socket(int af,int type,int procotol);
参数:af: 通信发生的区域
type: 要建立的套接字类型
procotol: 使用的特定协议
2、指定本地地址——bind()
功能:将套接字地址与所创建的套接字号联系起来。
格式:int PASCAL FAR bind(SOCKET s,const struct sockaddr FAR * name,int namelen);
参数:s: 是由socket()调用返回的并且未作连接的套接字描述符(套接字号)。
其它:没有错误,bind()返回0,否则SOCKET_ERROR
地址结构说明:
struct sockaddr_in
{
short sin_family;//AF_INET
Linux下的socket网络编程在STM-1 IMA数据采集卡中的应用
T技术广角………………………・ ●echnOIogY Panorama
Li n ux下的socket网络编程在
STM一1 I MA数据采集卡中的应用
何云重庆邮电大学通信网与测试技术重点试验室硕士研究生 张治中 重庆邮电大学通信网与测试技术重点试验室教授
摘要:“nux操作系统具有良好的稳定性和出色 的网络性能,因此被广泛应用于网络服务领域。 而在Linux下开发高性能的网络通讯程序,是充 分发挥Linux网络特性的一个关键因素。文章通 过对Socket通讯模型的分析和比较,阐述了在数 据采集系统中采用Socket通讯技术的必要性,并 且以STM一1 IMA数据采集卡为例,详细说明了如 何在Linux下利用Socket通讯技术进行网络通讯 程序的开发。 关键词:Linux,数据采集系统,socket,STM一1 IMA
Qii.竺! 2ol 一………一… 一 随着TD—SCDMA网络I J的建设和优化,网络信令测
试仪成为了TD产业链中的重要一环。对网络数据的获 取尤为重要,基于IMA的STM一1接口的数据采集卡在
TD—SCDMA网络信令测试仪对网络数据获取、传输中 得到很好的实现。
Linux作为一种自由免费的操作系统,相对于 windows具有良好的稳定性和出色的网络性能,因此被
广泛应用于各种网络服务器。基于Linux下的socket网 络编程在STM一1 IMA数据采集卡的网口数据传输过程
中具有至关重要的作用。本文设计了一种STM一1 IMA 数据采集卡通过网口进行参数配置和数据采集交互的 软件实现方案。
1 Socket通讯模型
Socket接口是TCP/IP网络最为通用的应用接口,
也是In!erne!上进行网络程序应用开发最通用的APP 。 在不同的操作系统socket有相应的实现版本,但SO(-ket
的通讯模型基本是一致的,最基本的socket通讯模型即
客户/服务器模型(C/S模型)。
C++_socket编程基础(理论篇)
C++ socket 编程基础(理论)
对于SOCKET在这里我不想究其历史,我只想说其时它是一种进程通讯的方式,简言之就是调用这个网络库的一些API函数就能实现分布在不同主机的相关进程之间的数据交换.
SOCKET中首先我们要理解如下几个定义概念:
一是IP地址:IP Address我想很容易理解,就是依照TCP/IP协议分配给本地主机的网络地址,就向两个进程要通讯,任一进程要知道通讯对方的位置,位置如何来确定,就用对方的IP
二是端口号:用来标识本地通讯进程,方便OS提交数据.就是说进程指定了对方进程的网络IP,但这个IP只是用来标识进程所在的主机,如何来找到运行在这个主机的这个进程呢,就用端口号.
三是连接:指两个进程间的通讯链路.
四是半相关:网络中用一个三元组可以在全局唯一标志一个进程:
(协议,本地地址,本地端口号)
这样一个三元组,叫做一个半相关,它指定连接的每半部分。
五是全相关
一个完整的网间进程通信需要由两个进程组成,并且只能使用同一种高层协议。也就是说,不可能通信的一端用TCP协议,而另一端用UDP协议。因此一
个完整的网间通信需要一个五元组来标识:
(协议,本地地址,本地端口号,远地地址,远地端口号)
这样一个五元组,叫做一个相关(association),即两个协议相同的半相关才能组合成一个合适的相关,或完全指定组成一连接。
客户/服务器模式
在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户/服务器模式(Client/Server model),即客户向服务器发出服务请求,服务器接收到请求后,提供相应的服务。客户/服务器模式的建立基于以下两点:首先,建立网络的起因是网络中软硬件资源、运算能力和信息不均等,需要共享,从而造就拥有众多资源的主机提供服务,资源较少的客户请求服务这一非对等作用。其次,网间进程通信完全是异步的,相互通信的进程间既不存在父子关系,又不共享内存缓冲区,因此需要一种机制为希望通信的进程间建立联系,为二者的数据交换提供同步,这就是基涌纪纪户/服务器模式的TCP/IP。
基于Linux的Socket网络编程及性能优化
福建电脑2012年第12期
基于Linux的Socket网络编程及性能优化
马丽洁
(内蒙古电子信息职业技术学院内蒙古呼和浩特010070)
【摘要】:本文主要从Socket的建立、配置、连接、数据传输和结束通信五个方面阐述了基
于Linux的Socket网络编程的方法和步骤,最后又从最小化报文传输延迟、最小化系统调用负
载、为BandwidthDelayProduct调节tcp窗口、动态优化GNU/linuxTCP/IP协议栈四个方面进
行性能优化,以使应用程序高效、稳定。
【关键词】:Linux,Socket,网络编程,性能优化
Socket的英文原义是“孔”或“插座”,通常也称
作"套接字",用于描述IP地址和端口,是一个通信
链的句柄。在Internet上的主机一般运行了多个服
务软件,同时提供几种服务。每种服务都打开一个
Socket,并绑定到一个端口上,不同的端口对应于
不同的服务。Socket正如其英文原意那样,象一个
多孔插座。一台主机犹如布满各种插座的房间,每
个插座有一个编号,有的插座提供220伏交流电,有的提供110伏交流电,有的则提供有线电视节
目。客户软件将插头插到不同编号的插座,就可
以得到不同的服务。socket也是一种文件描述符。1.Socket编程
1.1Socket的建立
为了建立Socket,程式能够调用Socket函数,该函数返回一个类似于文档描述符的句柄。Socket描述符是个指向内部数据结构的指针,他
指向描述符表入口。调用Socket函数时,socket执
行体将建立一个Socket,实际上"建立一个Socket"意味着为一个Socket数据结构分配存储空间。Socket执行体为您管理描述符表。两个网络程式之间的一个网络连接包括五种
信息:通信协议、本地协议地址、本地主机端口、远
端主机地址和远端协议端口。Socket数据结构中
包含这五种信息。1.2Socket的配置
通过socket调用返回一个socket描述符后,在使用socket进行网络传输以前,必须配置该
C语言版Socket通信原理
简单的客户/服务器程序设计与实现
实验目的及要求:
1、熟悉C编程环境。
2、熟悉Socket编程原理,掌握简单的套接字编程。
实验设备:
硬件:PC机
软件:CodeBlocks
实验内容及步骤:
什么是 Socket?
Socket 英文直译为“孔或插座”,也称为套接字。用于描述 IP 地址和端口号,是一种进程间的通信机制。你可以理解为 IP 地址确定了网内的唯一计算机,而端口号则指定了将消息发送给哪一个应用程序(大多应用程序启动时会主动绑定一个端口,如果不主动绑定,操作系统自动为其分配一个端口)。
Socket 的类型
Stream:一种流式 Socket,针对于面向连接的 TCP 服务应用,安全,但效率低。(本文重点)
Datagram:数据报式的 Socket,针对于无连接的 UDP 服务应用,不安全(丢失、顺序混乱,往往在接收端要分析完整性、重排、或要求重发),但效率高。
Socket 程序一般应用模式及运行流程
服务器端会启动一个 Socket,开始监听端口,监听客户端的连接信息,我们称之为 Watch
Socket。
客户端 Socket 连接服务器端的监听 Socket,一旦成功连接,服务器端会立刻创建一个新的
Socket 负责与客户端进行通信,之后,客户端将不再与 Watch Socket 通信。
Watch Socket 继续监听可能会来自其他客户端的连接。
上述过程就像是实现了一次三方会谈。服务器端的 Socket 至少会有 2 个。一个是 Watch
Socket,每成功接收到一个客户端的连接,便在服务器端创建一个通信 Socket。客户端 Socket 指定要连接的服务器端地址和端口,创建一个 Socket 对象来初始化一个到服务器的 TCP 连接。
编写用TCP协议实现的Client端和Server端程序并调试通过。
程序分两部分:客户程序和服务器程序。
Linux环境下基于Raw socket技术的多线程追击抓包法
2012年第17期 计算机光盘软件与应用 Computer CD Software and Applications 工程技术
L i nux环境下基于Raw socket技术的多线程追击抓包法
喻曦,文静华 (贵州财经大学信息学院,贵阳 550004)
摘要:抓包分析工具一直是维护网络安全分析网络协议必备的工具,但随着网络硬件的发展,网络速度得到大幅提 高,从以前的10MHUB到现在的千兆交换机,基于fibpeap的抓包分析工具丢包率越来越大,如何使抓包工具支持百兆 千兆网卡交换机的同时减少丢包率,对网络安全的维护有很大作用。本文通过比较传统Lipcap抓包技术,发现所存在的 弊端,认真研究raw socket,并通过改进多线程对共享数据的访问方式来减少处理线程对抓包线程的影响,提高抓包的速 度并达到减少丢包率的目的。 关键词:抓包;多线程;Raw socket技术;共享数据 中图分类号:TP302.7 文献标识码:A
1 引言 , 随着信息技术的快速发展,网络已成为信息交换的主 要手段,一些网络支付业务地兴起对网络安全提出了较高 的要求。同时,黑客对网络的攻击从未停止,网络安全问 题日趋严峻。因此,如何加强网络的安全维护,使抓包工 具在支持百兆千兆网卡交换机的同时减少丢包率,对于保 障网络安全有重要的现实意义。本文通过比较传统的lipcap 抓包技术,找出所存在的弊端,认真研究raw socket,并通 过改进多线程对共享数据的访问方式,减少处理包线程对 抓包线程的影响来提高抓包的速度,从而达到减少丢包率 的目的。 2传统的Ii bpoap抓包技术的弊端 Libpcap是unix/linux平台下的网络数据包捕获函数 包,提供了系统独立的用户级别网络数据包捕获接口,可 在绝大多数类unix平台下工作。但是由于它没有提供设置 抓包缓存大小的接口,只有32K的内核缓存和32K的用户 缓存,存在一定的局限性。每次调用系统进行读写时,只 能存取32K的数据,在高速网络中,调用系统读写的次数 显著增多,丢包率也相应增高,因此不能满足大数据量的 高速网络环境。 Libpcap-mmap是libpcap的改进版本,它提供了一个 大小可配置的循环缓冲器,并采用了mmap系统调用,完 成数据包从内核到用户层的传递,允许用户程序和内核程 序同时对该循环缓冲器的不同数据区域进行直接的读取, 但是缓冲器必须在抓包开始就创建,耗费空间,当缓冲器 一个为满另一个为空时,还要对两个缓冲器做调换操作, 势必会影响它的性能。所以一般linux下的抓包工具都有 很严重的丢包问题 3基于Raw socket多线程设计思想及改进 3.1 Raw socket介绍 Raw socket(原始套接字)可以接收本机网卡上的数 据帧或数据包,对监听网络的流量和分析是很有作用的。 因其可以自如地控制系统下的多种协议,实现对网络底层 中传输机制的控制,所以应用原始套接字来操纵网络层和 传输层应用。 3.2多线程设计思想及改进 网络中的抓包程序性能,很大程度上取决于抓包线程 保存包的速度,因此要尽量减少从Raw socket中读包并保 一1O1一 文章编号:1007.9599(2012)17・0101.02
Linux网络编程socket错误码分析
Linux网络编程socket错误分析
socket错误码:
EINTR: 4
阻塞的操作被取消阻塞的调用打断。如设置了发送接收超时,就会遇到这种错误。
只能针对阻塞模式的socket。读,写阻塞的socket时,-1返回,错误号为INTR。另外,如果出现EINTR即errno为4,错误描述Interrupted system call,操作也应该继续。如果recv的返回值为0,那表明连接已经断开,接收操作也应该结束。
ETIMEOUT:110
1、操作超时。一般设置了发送接收超时,遇到网络繁忙的情况,就会遇到这种错误。
2、服务器做了读数据做了超时限制,读时发生了超时。
3、错误被描述为“connect time out”,即“连接超时”,这种情况一般发生在服务器主机崩溃。此时客户 TCP 将在一定时间内(依具体实现)持续重发数据分节,试图从服务 TCP 获得一个 ACK 分节。当最终放弃尝试后(此时服务器未重新启动),内核将会向客户进程返回 ETIMEDOUT 错误。如果某个中间路由器判定该服务器主机已经不可达,则一般会响应“destination unreachable”-“目的地不可达”的ICMP消息,相应的客户进程返回的错误是 EHOSTUNREACH 或ENETUNREACH。当服务器重新启动后,由于 TCP 状态丢失,之前所有的连接信息也不存在了,此时对于客户端发来请求将回应 RST。如果客户进程对检测服务器主机是否崩溃很有必要,要求即使客户进程不主动发送数据也能检测出来,那么需要使用其它技术,如配置 SO_KEEPALIVE Socket 选项,或实现某些心跳函数。
EAGAIN:
1、Send返回值小于要发送的数据数目,会返回EAGAIN和EINTR。
2、recv 返回值小于请求的长度时说明缓冲区已经没有可读数据,但再读不一定会触发EAGAIN,有可能返回0表示TCP连接已被关闭。
网络编程TCP总结及实践-C语言
⽹络编程TCP总结及实践-C语⾔
⽹络变成⾸先要注意IP和port的转换,如今电脑基本上是主机字节序,存储依照⼩端⽅式,⽽在⽹络中传输统⼀使⽤⼤端⽅式,所以⽹络变成⾸先要注意
字节序的转换。
⼀个经常使⽤的ip转换程序的实现:
#include
#include
#include
#include
#define CHIP(ip) \
(ip&0xff)<<24 |\
(ip&(0xff<<8))<<8 |\
(ip&(0xff<<16))>>8|\
(ip&(0xff<<24))>>24
int main(int argc,char *argv[])
{
char buf[100]="";
int ip[4]={0};
int oldip,newip;
scanf("%s",buf);
sscanf(buf,"%d.%d.%d.%d",&ip[0],&ip[1],&ip[2],&ip[3]); //格式化输⼊,注意去地址符号
printf("%d %d %d %d\n",ip[0],ip[1],ip[2],ip[3]);
oldip=(ip[3]<<24)|(ip[2]<<16)|(ip[1]<<8)|ip[0];
printf("%x\n",oldip);
// newip=(ip[0]<<24)|(ip[1]<<16)|(ip[2]<<8)|ip[3];
newip=CHIP(oldip);//在计算机中依照⼗六进制存储的
printf("%x\n",newip);
//printf("%d %d %d %d \n",a[0],a[1],a[2],a[3]);
memset(buf,0,100);
int i;
for(i=0;i<4;i++)//将⼤端模式的IP转换为⼗进制 好像有BUG
{
buf[i]=((unsigned int)(newip&((unsigned int)0xff<<8*i))>>8*i);
