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

Linux下socket编程之TCP

2017-06-03 13:34 316 查看
tcp_client.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<unistd.h>
void usage(char* proc)
{
printf("%s [ip][port]");
}
int main(int argc,char* argv[])
{

if(argc<3)
{
usage(argv[0]);
return 1;
}
int sock=socket(AF_INET,SOCK_STREAM,0);
if(sock<0)
{
perror("socket");
return 2;
}
struct sockaddr_in server_addr;
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(atoi(argv[2]));
server_addr.sin_addr.s_addr=inet_addr(argv[1]);
socklen_t len=sizeof(server_addr);
int ret=connect(sock,(struct sockaddr*)&server_addr,len);
if(ret<0)
{
perror("connect");
return 3;
}
printf("coonnect success!\n");
while(1)
{
printf("client:#");
fflush(stdout);
char buff[1024];
ssize_t s = read(0,buff,sizeof(buff)-1);
if(s < 0)
{
perror("read");
exit(-1);
}
else if(s > 0)
{

buff[s]='\0';
}
write(sock,buff,strlen(buff));
read(sock,buff,sizeof(buff));
printf("server:%s",buff);
}
return 0;
}


tcp_server.c

#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<unistd.h>
void usage(char* proc)
{
printf("%s [ip][port]\n",proc);
}
int startup(char* ip,int port)
{
int sock=socket(AF_INET,SOCK_STREAM,0);//定义一个文件标识符,这是一个使用IPV4协议下层为TCP
if(sock<0)
{
perror("socket");
return 2;
}
struct sockaddr_in local;//一个结构体里面存储着具体的socketIP地址和遵守的协议,还有端口号
local.sin_family=AF_INET;
local.sin_port=htons(port);
local.sin_addr.s_addr=inet_addr(ip);
if((bind(sock,(struct sockaddr*)&local,sizeof(local)))<0)//将sock文件表示标识符与结构体绑定
{
perror("bing");
return 3;
}
if(listen(sock,10)<0)//监听这个socket
{
perror("listen");
close(sock);
exit(4);
}
return sock;
}
int main(int argc,char* argv[])
{
if(argc<3)
{
usage(argv[0]);
return 1;
}
int listen_sock=startup(argv[1],atoi(argv[2]));
struct sockaddr_in client_addr;
socklen_t len=sizeof(client_addr);
while(1)
{
int new_sock=accept(listen_sock,(struct sockaddr *)&client_addr,&len);//如果有连接到,就将连接的用户信息记录到结构体client中,并开辟一个新的文件标识符,从该文件标识符所表示的文件中进行读写操作。
if(new_sock<0)
{
perror("accept");
return 5;
}
char ipbuff[INET_ADDRSTRLEN];
memset(ipbuff,'\0',sizeof(ipbuff));
inet_ntop(AF_INET,&client_addr.sin_addr,ipbuff,sizeof(ipbuff));
printf("get connect,ip is %s,port is %d\n",ipbuff,ntohs(client_addr.sin_port));
char buff[1024];
while(1)
{
ssize_t s = read(new_sock,buff,sizeof(buff));//读操作
if(s >0)
{
buff[s] = '\0';
printf("client:#%s",buff);
write(new_sock,buff,strlen(buff));//写操作
}
if(s==0)
{
break;
}
}
printf("client quit!\n");
fflush(stdout);

}
close(listen_sock);
return 0;
}


服务器端运行效果图:



客户端运行结果:



如果有错误欢迎评论
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  计算机网络编程