Linux下网路编程实现TCP[转]
2011-01-1721:17:21|分类:
linux
|字号订阅
003
| ///////////////////////////////////
|
005
| #include<netinet/in.h>//forsockaddr_in
|
006
| #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
|
015
| #defineHELLO_WORLD_SERVER_PORT7754
|
016
| #defineLENGTH_OF_LISTEN_QUEUE20
|
017
| #defineBUFFER_SIZE1024
|
020
| intmain(intargc,char**argv)
|
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);
|
032
| // 创建用于internet 的流协议(TCP)socket, 用server_socket 代表服务器socket
|
033
| intserver_socket=socket(AF_INET,SOCK_STREAM,0);
|
036
| printf("CreateSocketFailed!");
|
040
| // 把socket 和socket 地址结构联系起来
|
041
| if(bind(server_socket,(structsockaddr*)&server_addr,sizeof(server_addr)))
|
043
| printf("ServerBindPort:%dFailed!",HELLO_WORLD_SERVER_PORT);
|
048
| if(listen(server_socket,LENGTH_OF_LISTEN_QUEUE))
|
050
| printf("ServerListenFailed!");
|
057
| structsockaddr_inclient_addr;
|
058
| socklen_tlength=sizeof(client_addr);
|
060
| intnew_server_socket=accept(server_socket,(structsockaddr*)&client_addr,&length);
|
061
| if(new_server_socket<0)
|
063
| printf("ServerAcceptFailed!\n");
|
067
| charbuffer[BUFFER_SIZE];
|
068
| bzero(buffer,BUFFER_SIZE);
|
071
| strcpy(buffer,"Hello,World! 从服务器来!");
|
072
| strcat(buffer,"\n");//C 语言字符串连接
|
075
| send(new_server_socket,buffer,BUFFER_SIZE,0);
|
078
| bzero(buffer,BUFFER_SIZE);
|
080
| length=recv(new_server_socket,buffer,BUFFER_SIZE,0);
|
084
| printf("ServerRecieveDataFailed!\n");
|
087
| printf("\n%s",buffer);
|
090
| if((stream=fopen("data1","r"))==NULL)
|
092
| printf("Thefile'data1'wasnotopened!\n");
|
097
| printf("Thefile'filename'wasopened!\n");
|
098
| bzero(buffer,BUFFER_SIZE);
|
101
| while((lengsize=fread(buffer,1,1024,stream))>0)
|
104
| printf("lengsize=%d\n",lengsize);
|
106
| if(send(new_server_socket,buffer,lengsize,0)<0)
|
108
| printf("SendFileisFailed\n");
|
112
| bzero(buffer,BUFFER_SIZE);
|
118
| printf("Thefile'data'wasnotclosed!\n");
|
122
| close(new_server_socket);
|
[
代码]client.c
viewsource
print
?
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
|
015
| #defineHELLO_WORLD_SERVER_PORT7754
|
016
| #defineBUFFER_SIZE1024
|
018
| intmain(intargc,char**argv)
|
022
| printf("Usage:./%sServerIPAddress\n",argv[0]);
|
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);
|
039
| printf("CreateSocketFailed!\n");
|
042
| // 把客户机的socket 和客户机的socket 地址结构联系起来
|
043
| if(bind(client_socket,(structsockaddr*)&client_addr,sizeof(client_addr)))
|
045
| printf("ClientBindPortFailed!\n");
|
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 地址来自程序的参数
|
055
| printf("ServerIPAddressError!\n");
|
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)
|
063
| printf("CanNotConnectTo%s!\n",argv[1]);
|
067
| charbuffer[BUFFER_SIZE];
|
068
| bzero(buffer,BUFFER_SIZE);
|
072
| intlength=recv(client_socket,buffer,BUFFER_SIZE,0);
|
076
| printf("RecieveDataFromServer%sFailed!\n",argv[1]);
|
081
| printf("\n%s\n",buffer);
|
083
| bzero(buffer,BUFFER_SIZE);
|
087
| bzero(buffer,BUFFER_SIZE);
|
088
| strcpy(buffer,"Hello,World!FromClient\n");
|
090
| send(client_socket,buffer,BUFFER_SIZE,0);
|
092
| if((stream=fopen("data","w+t"))==NULL)
|
094
| printf("Thefile'data'wasnotopened!\n");
|
098
| bzero(buffer,BUFFER_SIZE);
|
100
| while(length=recv(client_socket,buffer,BUFFER_SIZE,0))
|
104
| printf("RecieveDataFromServer%sFailed!\n",argv[1]);
|
108
| intwrite_length=fwrite(buffer,sizeof(char),length,stream);
|
109
| if(write_length<length)
|
111
| printf("FileisWriteFailed\n");
|
114
| bzero(buffer,BUFFER_SIZE);
|
116
| printf("RecieveFileFromServer[%s]Finished\n",argv[1]);
|
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理