該程式是一個雖然簡單但是完整的tcp用戶端/服務端執行個體。實作了本機客戶與本機伺服器的連接配接建立及互相發送消息。建立連接配接之後,用戶端接收并列印出伺服器發送來的資料。伺服器列印出用戶端的IP位址并向用戶端發送資料。
伺服器程式srv.c如下:
#include<stdio.h>
#include<strings.h>
#include<unistd.h>
#include<arpa/inet.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#define PORT 1234
#define BACKLOG 1
int main()
{
int listenfd,connectfd;
struct sockaddr_in server;
struct sockaddr_in client;
int sin_size;
if((listenfd=(socket(AF_INET,SOCK_STREAM,0)))==-1)
{
//handle exception
perror("Creating socket failed");
exit(1);
}
bzero(&server,sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr.s_addr=htonl(INADDR_ANY);
/*Bind socket to address*/
if(bind(listenfd,(struct sockaddr *)&server,sizeof(struct sockaddr))==-1)
{
perror("Bind error");
exit(1);
}
/*Listen client's reqirement*/
if(listen(listenfd,BACKLOG)==-1)
{
perror("listen failed");
exit(1);
}
sin_size=sizeof(struct sockaddr_in);
if((connectfd=accept(listenfd,(struct sockaddr *)&client,&sin_size))==-1)
{
perror("accept() error");
exit(1);
}
//prints client's IP
printf("You got a connection from %s\n",inet_ntoa(client.sin_addr));
send(connectfd,"Welcome to my server.\n",22,0);
close(connectfd);
close(listenfd);
}
用戶端程式cli.c如下:
#include<stdio.h>
#include<unistd.h>
#include<strings.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#define PORT 1234
#define MAXDATASIZE 100
int main(int argc,char *argv[])
{
int fd,numbytes;
char buf[MAXDATASIZE];
struct hostent *he;
struct sockaddr_in server;
if(argc!=2)
{
printf("Usage:%s<IP Address>",argv[0]);
exit(1);
}
if((he=gethostbyname(argv[1]))==NULL)
{
perror("gethostbyname() error\n");
exit(1);
}
if((fd=(socket(AF_INET,SOCK_STREAM,0)))==-1)
{
printf("socket() error");
exit(1);
}
bzero(&server,sizeof(server));
server.sin_family=AF_INET;
server.sin_port=htons(PORT);
server.sin_addr=*((struct in_addr*)he->h_addr);
/*Connect to server and receive data from the server.*/
if(connect(fd,(struct sockaddr *)&server,sizeof(struct sockaddr))==-1)
{
printf("connect() error\n");
exit(1);
}
if((numbytes=recv(fd,buf,MAXDATASIZE,0))==-1)
{
printf("recv() error");
exit(1);
}
buf[numbytes]='\0';
printf("Server Message: %s\n",buf);
close(fd);
}
編譯之後,首先啟動伺服器程式:
[[email protected] 20160910]# ./srv
再啟動用戶端程式:
[[email protected] 20160910]# ./cli 127.0.0.1
伺服器的運作結果:
[roo[email protected] 20160910]# ./srv
You got a connection from 127.0.0.1
用戶端的運作結果:
[[email protected] 20160910]# ./cli 127.0.0.1
Server Message: Welcome to my server.