您的位置:首页 > 理论基础 > 计算机网络

Linux下网路编程实现TCP

2011-11-12 21:56 344 查看

Linux下网路编程实现TCP[转]

2011-01-1721:17:21|分类:linux
|字号订阅



002


//
服务器代码


003


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


004


//
本文件是服务器的代码


005


#include<netinet/in.h>//forsockaddr_in


006


#include<sys/types.h>//forsocket


007




008


#include<sys/socket.h>//forsocket


009


#include<stdio.h>//forprintf


010


#include<stdlib.h>//forexit


011


#include<string.h>//forbzero


012


#include<time.h>//fortime_tandtime


013




014




015


#defineHELLO_WORLD_SERVER_PORT7754


016


#defineLENGTH_OF_LISTEN_QUEUE20


017


#defineBUFFER_SIZE1024


018




019




020


intmain(intargc,char**argv)


021


{


022


//
设置一个socket
地址结构server_addr,
代表服务器internet
地址,
端口


023


structsockaddr_inserver_addr;


024


bzero(&server_addr,sizeof(server_addr));//
把一段内存区的内容全部设置为0


025


server_addr.sin_family=AF_INET;


026


server_addr.sin_addr.s_addr=htons(INADDR_ANY);


027


server_addr.sin_port=htons(HELLO_WORLD_SERVER_PORT);


028


//time_tnow;


029


FILE*stream;


030




031




032


//
创建用于internet
的流协议(TCP)socket,
用server_socket
代表服务器socket


033


intserver_socket=socket(AF_INET,SOCK_STREAM,0);


034


if(server_socket<0)


035


{


036


printf("CreateSocketFailed!");


037


exit(1);


038


}


039




040


//
把socket
和socket
地址结构联系起来


041


if(bind(server_socket,(structsockaddr*)&server_addr,sizeof(server_addr)))


042


{


043


printf("ServerBindPort:%dFailed!",HELLO_WORLD_SERVER_PORT);


044


exit(1);


045


}


046




047


//server_socket
用于监听


048


if(listen(server_socket,LENGTH_OF_LISTEN_QUEUE))


049


{


050


printf("ServerListenFailed!");


051


exit(1);


052


}


053




054


while(1)//
服务器端要一直运行


055


{


056




057


structsockaddr_inclient_addr;


058


socklen_tlength=sizeof(client_addr);


059




060


intnew_server_socket=accept(server_socket,(structsockaddr*)&client_addr,&length);


061


if(new_server_socket<0)


062


{


063


printf("ServerAcceptFailed!\n");


064


break;


065


}


066




067


charbuffer[BUFFER_SIZE];


068


bzero(buffer,BUFFER_SIZE);


069




070




071


strcpy(buffer,"Hello,World!
从服务器来!");


072


strcat(buffer,"\n");//C
语言字符串连接


073




074




075


send(new_server_socket,buffer,BUFFER_SIZE,0);


076




077




078


bzero(buffer,BUFFER_SIZE);


079


//
接收客户端发送来的信息到buffer


080


length=recv(new_server_socket,buffer,BUFFER_SIZE,0);


081




082


if(length<0)


083


{


084


printf("ServerRecieveDataFailed!\n");


085


exit(1);


086


}


087


printf("\n%s",buffer);


088




089




090


if((stream=fopen("data1","r"))==NULL)


091


{


092


printf("Thefile'data1'wasnotopened!\n");


093


exit(1);


094


}


095


else


096




097


printf("Thefile'filename'wasopened!\n");


098


bzero(buffer,BUFFER_SIZE);


099




100


intlengsize=0;


101


while((lengsize=fread(buffer,1,1024,stream))>0)


102


{


103




104


printf("lengsize=%d\n",lengsize);


105




106


if(send(new_server_socket,buffer,lengsize,0)<0)


107


{


108


printf("SendFileisFailed\n");


109


break;


110


}


111




112


bzero(buffer,BUFFER_SIZE);


113




114




115




116


}


117


if(fclose(stream))


118


printf("Thefile'data'wasnotclosed!\n");


119


exit(1);


120




121


//
关闭与客户端的连接


122


close(new_server_socket);


123


}


124


//
关闭监听用的socket


125


close(server_socket);


126


return0;


127


}


[
代码]client.c

viewsource


print

?

002


//
客户端代码


005


//
本文件是客户机的代码


006


#include<netinet/in.h>//forsockaddr_in


007


#include<sys/types.h>//forsocket


008


#include<sys/socket.h>//forsocket


009


#include<stdio.h>//forprintf


010


#include<stdlib.h>//forexit


011


#include<string.h>//forbzero


012


#include<time.h>//fortime_tandtime


013


#include<arpa/inet.h>


014




015


#defineHELLO_WORLD_SERVER_PORT7754


016


#defineBUFFER_SIZE1024


017




018


intmain(intargc,char**argv)


019


{


020


if(argc!=2)


021


{


022


printf("Usage:./%sServerIPAddress\n",argv[0]);


023


exit(1);


024


}


025




026


//time_tnow;


027


FILE*stream;


028




029


//
设置一个socket
地址结构client_addr,
代表客户机internet
地址,
端口


030


structsockaddr_inclient_addr;


031


bzero(&client_addr,sizeof(client_addr));//
把一段内存区的内容全部设置为0


032


client_addr.sin_family=AF_INET;//internet
协议族


033


client_addr.sin_addr.s_addr=htons(INADDR_ANY);//INADDR_ANY
表示自动获取本机地址


034


client_addr.sin_port=htons(0);//0
表示让系统自动分配一个空闲端口


035


//
创建用于internet
的流协议(TCP)socket,
用client_socket
代表客户机socket


036


intclient_socket=socket(AF_INET,SOCK_STREAM,0);


037


if(client_socket<0)


038


{


039


printf("CreateSocketFailed!\n");


040


exit(1);


041


}


042


//
把客户机的socket
和客户机的socket
地址结构联系起来


043


if(bind(client_socket,(structsockaddr*)&client_addr,sizeof(client_addr)))


044


{


045


printf("ClientBindPortFailed!\n");


046


exit(1);


047


}


048




049


//
设置一个socket
地址结构server_addr,
代表服务器的internet
地址,
端口


050


structsockaddr_inserver_addr;


051


bzero(&server_addr,sizeof(server_addr));


052


server_addr.sin_family=AF_INET;


053


if(inet_aton(argv[1],&server_addr.sin_addr)==0)//
服务器的IP
地址来自程序的参数


054


{


055


printf("ServerIPAddressError!\n");


056


exit(1);


057


}


058


server_addr.sin_port=htons(HELLO_WORLD_SERVER_PORT);


059


socklen_tserver_addr_length=sizeof(server_addr);


060


//
向服务器发起连接,
连接成功后client_socket
代表了客户机和服务器的一个socket
连接


061


if(connect(client_socket,(structsockaddr*)&server_addr,server_addr_length)<0)


062


{


063


printf("CanNotConnectTo%s!\n",argv[1]);


064


exit(1);


065


}


066




067


charbuffer[BUFFER_SIZE];


068


bzero(buffer,BUFFER_SIZE);


069




070




071


//
从服务器接收数据到buffer


072


intlength=recv(client_socket,buffer,BUFFER_SIZE,0);


073




074


if(length<0)


075


{


076


printf("RecieveDataFromServer%sFailed!\n",argv[1]);


077


exit(1);


078


}


079




080




081


printf("\n%s\n",buffer);


082




083


bzero(buffer,BUFFER_SIZE);


084




085




086




087


bzero(buffer,BUFFER_SIZE);


088


strcpy(buffer,"Hello,World!FromClient\n");


089


//
向服务器发送buffer
中的数据


090


send(client_socket,buffer,BUFFER_SIZE,0);


091




092


if((stream=fopen("data","w+t"))==NULL)


093


{


094


printf("Thefile'data'wasnotopened!\n");


095


}


096




097


else


098


bzero(buffer,BUFFER_SIZE);


099


length=0;


100


while(length=recv(client_socket,buffer,BUFFER_SIZE,0))


101


{


102


if(length<0)


103


{


104


printf("RecieveDataFromServer%sFailed!\n",argv[1]);


105


break;


106


}


107




108


intwrite_length=fwrite(buffer,sizeof(char),length,stream);


109


if(write_length<length)


110


{


111


printf("FileisWriteFailed\n");


112


break;


113


}


114


bzero(buffer,BUFFER_SIZE);


115


}


116


printf("RecieveFileFromServer[%s]Finished\n",argv[1]);


117




118


//
关闭文件


119


fclose(stream);


120




121


//
关闭socket


122


close(client_socket);


123


return0;


124


}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: