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

一个TCP/IP通信的实例

2016-02-12 15:51 651 查看
/*服务器端*/
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<netdb.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<unistd.h>
#include<arpa/inet.h>//不加这一句的话,inet_ntoa的函数会警告
#define MAXSIZE 1024

int main(int argc, char *argv[])
{
int sockfd,new_fd;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_size,portnumber;
char buf[MAXSIZE];
if(argc!=2)
{
fprintf(stderr,"Usage :%s portnumber\a\n",argv[0]);
exit(1);
}
if((portnumber=atoi(argv[1]))<0)
{
fprintf(stderr,"Usage :%s protnumber\a\n",argv[0]);
exit(1);
}
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"Socket error:%s\n\a",strerror(errno));
exit(1);
}

bzero(&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_port=htons(portnumber);
if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Bind error:%s\n\a",strerror(errno));
exit(1);
}
if(listen(sockfd,5)==-1)
{
fprintf(stderr,"Listen error:%s\n\a",strerror(errno));
exit(1);
}

while(1)
{
sin_size=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))==-1)
{
fprintf(stderr,"Accept error:%s\n\a",strerror(errno));
exit(1);
}
fprintf(stderr,"Server get connection from %s:\n",inet_ntoa(client_addr.sin_addr));
printf("Connect successful,please input the message [<1024 bytes]:\n");
if(fgets(buf,sizeof(buf),stdin)!=buf)
{
printf("fgets error!\n");
exit(1);
}
if(write(new_fd,buf,strlen(buf))==-1)
{
fprintf(stderr,"Write error!\n",strerror(errno));
exit(1);
}
close(new_fd);
}
close(sockfd);
exit(0);
}


/*客户端*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<netdb.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>

int main(int argc, char *argv[])
{
int sockfd;
char buffer[1024];
struct sockaddr_in server_addr;
struct hostent *host;
int portnumber,nbytes;
if(argc!=3)
{
fprintf(stderr,"Usage:%s hostname portnumber\a\n0",argv[0]);
exit(1);
}
if((host=gethostbyname(argv[1]))==NULL)
{
fprintf(stderr,"Gethostname error\n");
exit(1);
}
if((portnumber=atoi(argv[2]))<0)
{
fprintf(stderr,"Usage:%s hostname portnumber\a\n",argv[0]);
exit(1);
}
while(1)
{
if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1)
{
fprintf(stderr,"Socket Error:%s\a\n",strerror(errno));
exit(1);
}
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(portnumber);
server_addr.sin_addr=*((struct in_addr *)host->h_addr);


/*
注意这个 connect 函数

#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd,struct sockaddr *serv_addr,int addrlen);

第二个参数  指向结构体的指针

由于host定义是struct hostent *host

struct hostent
{
char *h_name;
char *h_aliases;
int h_addrtype;
int h_length;
char **h_addr_list;//主机的ip地址列表
}

#define h_addr h_addr_list[0];

这里的server_addr.sin_addr 取得是host->h_addr 的第一个ip

*/


if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))==-1)
{
fprintf(stderr,"Connect Error:%s\a\n",strerror(errno));
exit(1);
}
if((nbytes=read(sockfd,buffer,1024))==-1)
{
fprintf(stderr,"Read Error:%s\a\n",strerror(errno));
exit(1);
}
buffer[nbytes]='\0';
printf("I have received:%s",buffer);
close(sockfd);
}
exit(0);
}


程序的执行

gcc -o server_tcp server_tcp.c
gcc -o client_tcp client_tcp.c
在第一个shell端
./server_tcp 5678
在第二个shell端
./client_tcp localhost 5678


程序的执行结果

shell 1
Server get connection from 1995400920:
Connect successful,please input the message [<1024 bytes]:
jljgjglk

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