Linux下网路编程实现TCP

本文介绍了一个简单的Linux下TCP网络编程示例,包括服务器端和客户端的代码实现。服务器监听特定端口并响应客户端请求,同时向客户端发送消息,并读取客户端发送的数据。客户端则连接到服务器,接收服务器发来的信息,并保存服务器发送的文件。

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

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

002

//服务器代码

003

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

004

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

005

#include <netinet/in.h>    // for sockaddr_in

006

#include <sys/types.h>    // for socket

007

 

008

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

009

#include <stdio.h>        // for printf

010

#include <stdlib.h>        // for exit

011

#include <string.h>        // for bzero

012

#include <time.h>                //for time_t and time

013

 

014

 

015

#define HELLO_WORLD_SERVER_PORT 7754

016

#define LENGTH_OF_LISTEN_QUEUE 20

017

#define BUFFER_SIZE 1024

018

 

019

 

020

int main(int argc, char **argv)

021

{

022

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

023

struct sockaddr_in server_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_t now;

029

FILE *stream;

030

 

031

 

032

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

033

int server_socket = socket(AF_INET,SOCK_STREAM,0);

034

if( server_socket < 0)

035

{

036

printf("Create Socket Failed!");

037

exit(1);

038

}

039

 

040

//socketsocket地址结构联系起来

041

if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))

042

{

043

printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT);

044

exit(1);

045

}

046

 

047

//server_socket用于监听

048

if ( listen(server_socket, LENGTH_OF_LISTEN_QUEUE) )

049

{

050

printf("Server Listen Failed!");

051

exit(1);

052

}

053

 

054

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

055

{

056

 

057

struct sockaddr_in client_addr;

058

socklen_t length = sizeof(client_addr);

059

 

060

int new_server_socket = accept(server_socket,(struct sockaddr*)&client_addr,&length);

061

if ( new_server_socket < 0)

062

{

063

printf("Server Accept Failed!\n");

064

break;

065

}

066

 

067

char buffer[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("Server Recieve Data Failed!\n");

085

exit(1);

086

}

087

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

088

 

089

 

090

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

091

{

092

printf("The file 'data1' was not opened! \n");

093

exit(1);

094

}

095

else

096

 

097

printf("The file 'filename' was opened! \n");

098

bzero(buffer,BUFFER_SIZE);

099

 

100

int lengsize = 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("Send File is Failed\n");

109

break;

110

}

111

 

112

bzero(buffer, BUFFER_SIZE);

113

 

114

  

115

 

116

}

117

if(fclose(stream))

118

printf("The file 'data' was not closed! \n");

119

exit(1);      

120

 

121

//关闭与客户端的连接

122

close(new_server_socket);       

123

}

124

//关闭监听用的socket

125

close(server_socket);

126

return 0;

127

}

[代码] client.c

view source

print

?



002

//客户端代码

005

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

006

#include <netinet/in.h>    // for sockaddr_in

007

#include <sys/types.h>    // for socket

008

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

009

#include <stdio.h>        // for printf

010

#include <stdlib.h>        // for exit

011

#include <string.h>        // for bzero

012

#include <time.h>                //for time_t and time

013

#include <arpa/inet.h>

014

 

015

#define HELLO_WORLD_SERVER_PORT    7754

016

#define BUFFER_SIZE 1024

017

 

018

int main(int argc, char **argv)

019

{

020

if (argc != 2)

021

{

022

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

023

exit(1);

024

}

025

 

026

//time_t now;

027

FILE *stream;

028

 

029

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

030

struct sockaddr_in client_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

int client_socket = socket(AF_INET,SOCK_STREAM,0);

037

if( client_socket < 0)

038

{

039

printf("Create Socket Failed!\n");

040

exit(1);

041

}

042

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

043

if( bind(client_socket,(struct sockaddr*)&client_addr,sizeof(client_addr)))

044

{

045

printf("Client Bind Port Failed!\n");

046

exit(1);

047

}

048

 

049

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

050

struct sockaddr_in server_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("Server IP Address Error!\n");

056

exit(1);

057

}

058

server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);

059

socklen_t server_addr_length = sizeof(server_addr);

060

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

061

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

062

{

063

printf("Can Not Connect To %s!\n",argv[1]);

064

exit(1);

065

}

066

 

067

char buffer[BUFFER_SIZE];

068

bzero(buffer,BUFFER_SIZE);

069

 

070

 

071

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

072

int length = recv(client_socket,buffer,BUFFER_SIZE,0);

073

 

074

if(length < 0)

075

{

076

printf("Recieve Data From Server %s Failed!\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! From Client\n");

089

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

090

send(client_socket,buffer,BUFFER_SIZE,0);

091

 

092

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

093

{

094

printf("The file 'data' was not opened! \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("Recieve Data From Server %s Failed!\n", argv[1]);

105

break;

106

}

107

 

108

int write_length = fwrite(buffer,sizeof(char),length,stream);

109

if (write_length<length)

110

{

111

printf("File is Write Failed\n");

112

break;

113

}

114

bzero(buffer,BUFFER_SIZE); 

115

}

116

printf("Recieve File From Server[%s] Finished\n", argv[1]);

117

 

118

//关闭 文件

119

fclose(stream);

120

 

121

//关闭socket

122

close(client_socket);

123

return 0;

124

}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值